Mercurial > hg > Papers > 2014 > masakoha-sigos
changeset 1:7264fa1d8f69
write chapter2
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Apr 2014 21:00:32 +0900 |
parents | 2408ae0327d5 |
children | b15b449619b1 |
files | paper/cerium.tex paper/introduction.tex |
diffstat | 2 files changed, 80 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/cerium.tex Sat Apr 05 13:30:19 2014 +0900 +++ b/paper/cerium.tex Mon Apr 14 21:00:32 2014 +0900 @@ -6,33 +6,34 @@ % \caption{Task Manager} % \label{fig:createTask} % \end{figure} -Cerium Task Manager では、 並列処理を Task 単位で記述する。関数やサブルーチンを Task として扱い、 -Task には input データ、 output データ及び依存関係を設定する。 -Cerium Task Manager によってそれらの Task は管理され、実行される。 + +Cerium Task Manager は並列プログラミングフレームワークであり、内部では C や C++ で実装されている。 +Cerium Task Manager は、User が並列処理を Task 単位で記述し、関数やサブルーチンを Task として扱い、その Task に対して Input Data、Output Data 及び依存関係を設定する。 +そして、それに基づいた設定の元で Task Manager にて管理し実行される。 +Cerium Task Manager は PlayStation 3/Cell、Mac OS X 及び Linux 上で利用することが可能である。 -図\ref{fig:createTask}はCeriumがTaskを作成/実行する場合のクラスの構成となる。 -userがcreatetask()を行い、input dataや依存関係の設定を行うとTaskManagerでTaskが生成される。 -Task 毎に依存関係を表す wait\_i と wait\_me というリストがあり、依存関係が解消されて実行可能になった -Task は ActiveTaskList に移される。さらに、Scheduler に転送しやすい TaskList に変換してから各 Scheduler に -転送される。 -\subsection{taskの生成} -以下にTaskを生成する例題を示す。 -input dataを二つ用意し、input同士を乗算し、outputに格納するmultiplyという例題となる。 +図\ref{fig:createTask} では、 User が Task を生成して、CPU や GPU の各デバイスに Task が割り振られる様子を表している。 +User が設定を行った Task は Task Manager にて生成される。その生成した Task に HTask にて Input Data 、Output Data や依存関係などを設定して Task の集合体である TaskList に Set する。 +そして TaskList を各デバイスに割り振って、各 Scheduler に管理をさせたあとにそれぞれの Task を起動する。 + +% \begin{figure}[htbp] +% \begin{center} +% \includegraphics[width=0.7\textwidth]{fig/ceriumtaskmanager.pdf} +% \end{center} + +input Data で格納して 2 つの数を乗算し、output data に格納する multiply という例題がある。 +その例題の Task 生成部分を以下に示す。 +\\ \begin{verbatim} -void -multiply_init -(HTaskPtr twice, int *i_data, int *o_data) { - multiply = - manager->create_task(MULTIPLY_TASK); - // MULTIPLY_TASK is task id(enum) - multiply->set_inData(0, i_data1, - sizeof(int)*length); - multiply->set_inData(1, i_data2, - sizeof(int)*length); - multiply->set_outData(0, o_data, - sizeof(int)*length); - multiply->set_param(0, (memaddr)length); +multi_init(TaskManager *manager) +{ + float *A, *B, *C; + HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); multiply->set_cpu(SPE_ANY); + multiply->set_inData(0, (memaddr)A, sizeof(float)*length); + multiply->set_inData(1, (memaddr)B, sizeof(float)*length); + multiply->set_outData(0, (memaddr)C, sizeof(float)*length); + multiply->set_param(0,(long)length); multiply->spawn(); } \end{verbatim} @@ -40,58 +41,64 @@ \begin{tiny} \begin{table}[ht] \begin{center} - \caption{Task生成におけるAPI} \label{table:create_taskAPI} \small \begin{tabular}[t]{c|l} \hline - create\_task& taskを生成する \\ + create\_task& Task を生成する \\ + \hline + set\_inData & Task への入力データのアドレスを追加 \\ + \hline + set\_outData & Task への出力データのアドレスを追加 \\ \hline - set\_inData & Taskへの入力データのアドレスを追加 \\ + set\_param & Task へ値を一つ渡す。ここでは length \\ \hline - set\_outData & Taskへの入力データのアドレスを追加 \\ + set\_cpu & Task を実行するデバイスの設定 \\ + \hline + spawn & 生成した Task を TaskList に set \\ \hline - set\_param & Taskへ値を一つ渡す。ここではlength \\ + \end{tabular} + \caption{Task 生成における API} + \end{center} + \end{table} +\end{tiny} + +\newpage + +Task の記述は以下のようになる。 +\\ + +\begin{verbatim} +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ + float *A, *B, *C; + A = (float*)s->get_input(rbuf,0); + B = (float*)s->get_input(rbuf,1); + C = (float*)s->get_output(wbuf,0); + long length=(long)s->get_param(0); + for (int i=0;i<length;i++) { + C[i]=A[i]*B[i]; + } + return 0; +} +\end{verbatim} + +\begin{tiny} + \begin{table}[ht] + \begin{center} + \caption{Task 側で使用する API} + \label{table:taskAPI} + \small + \begin{tabular}[t]{c|l} \hline - set\_cpu & Taskを実行するデバイスの設定 \\ + get\_input & Scheduler から input data を取得 \\ \hline - spawn& 生成したTaskをActiveTaskListに登録 \\ + get\_output & Scheduler から output data を取得 \\ + \hline + get\_param & set\_param した値を取得 \\ \hline \end{tabular} \end{center} \end{table} \end{tiny} - -Taskの記述は以下のようになる。 -\begin{verbatim} -static int -run(SchedTask *s,void *rbuf, void *wbuf) -{ - float i_data1=(float*)s->get_input(rbuf,0); - float i_data2=(float*)s->get_input(rbuf,1); - float o_data=(float*)s->get_output(wbuf,0); - long length=(long)s->get_param(0); - for (int i=0;i<length;i++) { - outdata[i]=indata1[i]*indata2[i]; - } - return 0; -} -\end{verbatim} -\begin{tiny} - \begin{table}[ht] - \begin{center} - \caption{Task側で使用するAPI} - \label{table:taskAPI} - \small - \begin{tabular}[t]{c|l} - \hline - get\_input & Schedulerからinput dataを取得 \\ - \hline - get\_output & Schedulerからoutput dataを取得 \\ - \hline - get\_param & set\_paramした値を取得 \\ - \hline - \end{tabular} - \end{center} - \end{table} -\end{tiny}
--- a/paper/introduction.tex Sat Apr 05 13:30:19 2014 +0900 +++ b/paper/introduction.tex Mon Apr 14 21:00:32 2014 +0900 @@ -1,1 +1,9 @@ \section{研究背景と目的} + +当研究室では、Task 単位で記述する並列プログラミングフレームワーク、Cerium の開発を行っている。 + +先行研究による Task の並列化によって、プログラム全体の処理速度は飛躍的に向上した。\cite{kinjyo} +ファイルの読み込み等の I/O を含むプログラムは、読み込み時間が Task の処理時間と比較して非常に重くなる場合が多い。 +マルチコアでの並列処理を行ったとしても、I/O の動作を軽量にしなければ、I/O を含めたプログラムの処理は軽量にならない。 +そして従来の mmap では、I/O と読み込んだファイルに対する処理をプログラム作成者が自由に記述することができない。 +そこで本研究では、並列処理時におけるファイル読み込みをどのように実装すれば軽量に動作するかを考慮し、なおかつ読み込みとそれらに対する処理をプログラム作成者が自由に書けるように設計・実装を行う。