Mercurial > hg > Papers > 2010 > yutaka-thesis
view paper/taskmanager.tex @ 4:986baf7fad44
amend
author | Yutaka_Kinjyo |
---|---|
date | Tue, 16 Feb 2010 08:34:57 +0900 |
parents | fd9154e03f46 |
children |
line wrap: on
line source
\chapter{Task Manager} \label{chapter:taskmanager} Task Manager は、Task と呼ばれる、分割された各プログラムを管理する。 Task の単位はサブルーチンまたは関数とし、Task 同士の依存関係を考慮しながら 実行していく。 現在実装されている TaskManager の API を \tabref{taskmanager_api} に示す。 \begin{table}[htb] \caption{Task Manager API} \label{tab:taskmanager_api} \hbox to\hsize{\hfil \begin{tabular}{c|l} \hline \hline create\_task & Task を生成する \\ \hline run & 実行 Task Queue の実行 \\ \hline allocate & 環境のアライメントを考慮した allocator \\ \hline \hline add\_inData & Task への入力データのアドレスを追加 \\ \hline add\_outData & Task からのデータ出力先アドレスを追加 \\ \hline add\_param & Task のパラメータ (32 bits) \\ \hline wait\_for & Task の依存関係の考慮 \\\hline set\_cpu & Task を実行する CPU の設定 \\ \hline set\_post & Task が終了したら PPE 側で実行される関数の登録 \\ \hline spawn & Task を実行 Task Queue に登録する \\ \hline \end{tabular}\hfil} \end{table} 以下に Task Manager を使った記述例を示す。 このプログラムは、PPE にある文字列データを、SPE が受け取って データを改変し、PPEに戻すというプログラムである。 各 API の詳細は後述する。 \begin{verbatim} #define STRSIZE 256 char sendStr[STRSIZE] = "Hello, World"; int main(void) { TaskManager *manager; HTask *task; int length = sizeof(char)*STRSIZE; // CPU_NUM: 使用する CPU の数 manager = new TaskManager(CPUNUM); // TASK_RUN = TaskRun::run に対応する ID task = create_task(TASK_RUN); /** * タスクの入出力データの設定 * @param[1]: address of data * @param[2]: size of data */ task->add_inData(sendStr,length); task->add_outData(sendStr,length); task->spawn(); manager->run(); return 0; } TaskRun::run(void *rbuf, void *wbuf) { // add_inData で指定したアドレスのデータを取得 // recvStr = "Hello, World" char *recvStr = (char*)get_input(rbuf, 0); // fixStr にあるデータが、 // Task 終了後、add_outData で指定した // sendStr に書き込まれる char *fixStr = (char*)get_input(wbuf, 0); strcpy(fixStr, recvStr); fixStr[0] = 'D'; // 文字列データを変換 fixStr[3] = 'E'; // } // 実行結果 before: Hello, World after: DelEo, World \end{verbatim}