Mercurial > hg > Papers > 2016 > masa-master
annotate cerium.tex @ 9:7fd5cae2d0f9
adda image
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 12 Jan 2016 15:39:56 +0900 |
parents | 7197f324a8cf |
children |
rev | line source |
---|---|
5
515e18cdb197
rename files
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
1 \chapter{Cerium} |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
2 Cerium は、Cell 向けに開発された並列プログラミングフレームワークである。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
3 Cell は Sony Computer Entertainment 社が販売した PlayStation3 に搭載されているヘテロジニアスマルチコア・プロセッサである。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
4 本章では Cerium の実装について説明する。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
5 |
5
515e18cdb197
rename files
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
6 \section{Cerium の概要} |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
7 Cerium は当初 Cell 向けに開発され、C/C++ で実装されている。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
8 現在では Linux、 MacOS X 上で動作する並列プログラミングフレームワークである。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
9 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
10 Cerium は TaskManager、SceneGraph、Rendering Engine の3要素から構成されている。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
11 本研究では汎用計算フレームワークである TaskManager を利用して文字列の並列計算を行なった。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
12 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
13 図\ref{fig:TaskManager}は Cerium が Task の生成/実行する場合のクラス構成図である。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
14 TaskManager で依存関係が解消され、実行可能になった Task は ActiveTaskList に格納される。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
15 ActiveTaskList に格納された Task は、依存関係が解消されているのでどのような順番で実行されても問題はない。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
16 Task は転送を行いやすい TaskList に変換され、CpuType に対応した Scheduler に転送される。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
17 なお、転送はSynchronozed Queue である mail を通して行われる。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
18 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
19 \begin{figure}[htpb] |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
20 \begin{center} |
9 | 21 \includegraphics[scale=0.7]{images/cerium/createTask.pdf} |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
22 \end{center} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
23 \caption{Task Manager} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
24 \label{fig:TaskManager} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
25 \end{figure} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
26 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
27 \newpage |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
28 |
5
515e18cdb197
rename files
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
4
diff
changeset
|
29 \section{Cerium TaskManager} |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
30 Cerium TaskManager では、処理の単位を Task として記述していく。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
31 関数やサブルーチンを Task として取り扱い、その Task にて Input Data/Output Data 及び Task の依存関係を設定する。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
32 そして Task は設定された依存関係を考慮しながら実行される。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
33 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
34 Input Data で格納した 2 つの数を乗算し、Output Data に演算結果を格納する multiply という例題のソースコード\ref{src:createTask}を以下に示す。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
35 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
36 また、Task の生成時に用いる API 一覧を表\ref{table:TaskCreateAPI}に示す。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
37 \begin{lstlisting}[frame=lrbt,label=src:createTask,caption=Task の生成,numbers=left] |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
38 multi_init(TaskManager *manager) |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
39 { |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
40 float *A, *B, *C; |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
41 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
42 // create Task |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
43 HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
44 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
45 // set device |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
46 multiply->set_cpu(SPE_ANY); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
47 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
48 // set inData |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
49 multiply->set_inData(0, (memaddr)A, sizeof(float)*length); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
50 multiply->set_inData(1, (memaddr)B, sizeof(float)*length); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
51 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
52 // set outData |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
53 multiply->set_outData(0, (memaddr)C, sizeof(float)*length); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
54 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
55 // set parameter |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
56 multiply->set_param(0,(long)length); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
57 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
58 // spawn task |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
59 multiply->spawn(); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
60 } |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
61 \end{lstlisting} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
62 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
63 \begin{tiny} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
64 \begin{table}[ht] |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
65 \begin{center} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
66 \label{table:TaskCreateAPI} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
67 \small |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
68 \begin{tabular}[t]{c|l} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
69 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
70 create\_task& Task を生成する \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
71 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
72 set\_inData & Task への入力データのアドレスを追加 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
73 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
74 set\_outData & Task への出力データのアドレスを追加 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
75 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
76 set\_param & Task へ値を一つ渡す。ここでは length \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
77 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
78 set\_cpu & Task を実行するデバイスの設定 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
79 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
80 spawn & 生成した Task を TaskList に set \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
81 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
82 \end{tabular} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
83 \caption{Task 生成における API} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
84 \end{center} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
85 \end{table} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
86 \end{tiny} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
87 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
88 次に、デバイス側で実行される Task のソースコードを\ref{src:task}に示す。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
89 \begin{lstlisting}[frame=lrbt,label=src:task,caption=Task,numbers=left] |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
90 static int |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
91 run(SchedTask *s) { |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
92 // get input |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
93 float *i_data1 = (float*)s->get_input(0); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
94 float *i_data2 = (float*)s->get_input(1); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
95 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
96 // get output |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
97 float *o_data = (float*)s->get_output(0); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
98 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
99 // get parameter |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
100 long length = (long)s->get_param(0); |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
101 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
102 // calculate |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
103 for (int i=0; i<length; i++) { |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
104 o_data[i] = i_data1[i] * i_data2[i]; |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
105 } |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
106 return 0; |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
107 } |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
108 \end{lstlisting} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
109 また表\ref{table:taskAPI}は Task 側で利用する API である。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
110 Task 生成時に設定した Input Data や parameter を取得することができる。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
111 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
112 \begin{tiny} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
113 \begin{table}[ht] |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
114 \begin{center} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
115 \caption{Task 側で使用する API} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
116 \label{table:taskAPI} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
117 \small |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
118 \begin{tabular}[t]{c|l} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
119 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
120 get\_input & Scheduler から input data を取得 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
121 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
122 get\_output & Scheduler から output data を取得 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
123 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
124 get\_param & set\_param した値を取得 \\ |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
125 \hline |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
126 \end{tabular} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
127 \end{center} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
128 \end{table} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
129 \end{tiny} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
130 |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
131 \newpage |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
132 |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
133 Task 生成時に設定できる要素を以下に列挙する。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
134 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
135 \begin{itemize} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
136 \item Input Data |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
137 \item Output Data |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
138 \item Parameter |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
139 \item CpuType |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
140 \item Dependency |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
141 \end{itemize} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
142 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
143 Input/Output Data、Parameter は関数の引数に相当する。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
144 Cpu Type は Task を動作させるデバイスを設定することができ、Dependency は他の Task との依存関係を設定することができる。 |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
145 \newpage |
6
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
146 \section{並列処理向け I/O} |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
147 ファイル読み込みなどの I/O を含むプログラムは、読み込み時間が Task の処理時間と比較してオーバーヘッドになることが多い。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
148 計算処理の並列化を図ったとしても I/O がボトルネックになってしまい処理全体が高速にならない。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
149 本項では Cerium に実装した並列処理用 I/O を行ない、I/O 部分の高速化を図った。 |
7a67daa0d39f
add createTask images
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
150 |
7 | 151 Cerium の例題ではファイル読み込みを mmap にて実装していた。 |
152 しかし、mmap だとファイルを読み込んでから Task を実行するので、読み込んでいる間は他の CPU が動作せず並列度が落ちる。 | |
153 | |
154 mmap は function call 後にすぐにファイルを読みに行くのではなく、仮想メモリ領域にファイルの中身を対応させる。 | |
155 その後メモリ空間にアクセスされたときに、OS が対応したファイルを読み込む。 | |
156 また、読み込む方法が OS 依存となってしまうため環境に左右されやすく、プログラムの書き手が読み込みの制御をすることが難しい。 | |
157 | |
158 図\ref{fig:mmap}は mmap で読み込んだファイルに対して Task1 、 Task2 がアクセスしてそれぞれの処理を行うときのモデルである。 | |
159 | |
160 Task1 が実行されると仮想メモリ上に対応したファイルが読み込まれ、読み込み後 Task1 の処理が行われる。 | |
161 その後 Task2 も Task1 と同様の処理が行われるが、これら 2 つの Task の間に待ちが入る。 | |
162 | |
163 \begin{figure}[htpb] | |
164 \begin{center} | |
9 | 165 \includegraphics[scale=0.7]{images/cerium/mmap.pdf} |
7 | 166 \end{center} |
167 \caption{mmap Model} | |
168 \label{fig:mmap} | |
169 \end{figure} | |
170 | |
171 mmap を使わず、読み込みを独立した Thread で行ない、ファイルを一度に全て読み込むのではなくある程度の大きさ(Block)分読み込み、読み込まれた部分に対して並列に Task を起動する。 | |
172 これを Blocked Read と呼び、高速化を図った。 | |
173 | |
174 Blocked Read を実装するにあたり、WordCount を例題に挙げる。 | |
175 ファイルを読み込む Task (以下、ReadTask) と、読み込んだファイルに対して計算を行う Task (以下、WordCount) を別々に生成する。ReadTask は一度にファイル全体を読み込むのではなく、ある程度の大きさで分割してから読み込みを行う。分割して読み込んだ範囲に対して WordCount を行う。 | |
176 | |
177 WordCount を Blocked Read で読み込み処理をしたとき以下の図\ref{fig:BlockedRead}の様になる。 | |
178 | |
179 \begin{figure}[htpb] | |
180 \begin{center} | |
9 | 181 \includegraphics[scale=0.5]{./images/cerium/blockedread.pdf} |
7 | 182 \end{center} |
183 \caption{BlockedRead による WordCount} | |
184 \label{fig:BlockedRead} | |
185 \end{figure} | |
186 | |
187 Task を一定の単位でまとめた Task Block ごとに生成して WordCount を行なっている。 | |
188 Task Block で計算される領域が Blocked Read で読み込む領域を追い越して実行してしまうと、まだ読み込まれていない領域に対して計算されてしまう。 | |
189 その問題を解決するために依存関係を適切に設定する必要がある。 | |
190 Blocked Read による読み込みが終わってから TaskBlock が起動されるようにするため、Cerium の API である wait\_for にて依存関係を設定する。 | |
191 | |
192 また、ReadTask は連続で処理される必要がある。 | |
193 なぜならば、ReadTask でファイルを読み込む前提で WordCount がその領域に対して計算を行うので、ReadTask の処理が遅くなってしまうだけでオーバーヘッドとなってしまう。\ref{fig:BlockedReadModel} | |
194 | |
195 \begin{figure}[htpb] | |
196 \begin{center} | |
9 | 197 \includegraphics[scale=0.5]{./images/cerium/blockedreadimage.pdf} |
7 | 198 \end{center} |
199 \caption{BlockedRead Model} | |
200 \label{fig:BlockedReadModel} | |
201 \end{figure} | |
202 | |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
203 \newpage |
7 | 204 Blocked Read を実装することにより、読み込み部分と処理部分の並列化を行なった。Blocked Read は連続で読み込まれる必要があるため、さらに I/O 専用 thread を実装した。 |
205 | |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
206 Cerium Task Manager では、それぞれの Task に対してデバイスを設定することができる。 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
207 SPE\_ANY 設定をすると、Task Manager が CPU の割り振りを自動的に行う。 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
208 Blocked Read は連続で読み込まれなければならないが、SPE\_ANY で設定すると Blocked Read 間に別の Task が割り込まれる恐れがある。(図\ref{fig:spe_any_blockedread}) |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
209 |
7 | 210 \begin{figure}[htpb] |
211 \begin{center} | |
9 | 212 \includegraphics[scale=0.7]{./images/cerium/speblockedread.pdf} |
7 | 213 \end{center} |
214 \caption{BlockedRead と Task を同じ thread で動かした場合} | |
215 \label{fig:spe_any_blockedread} | |
216 \end{figure} | |
217 | |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
218 Task が Blocked Read 間に割り込まれないようにするため、I/O 専用 thread である iO\_0 の設定を追加した。 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
219 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
220 IO\_0 は SPE\_ANY とは別 thread の scheduler で動作するので、SPE\_ANY で動作している Task に割り込むことはない。 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
221 しかし、読み込みの終了を通知し、次の read を行う時に他の Task がスレッドレベルで割り込んでしまう事がある。 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
222 pthread\_getschedparam() で IO\_0 の priority の設定を行う必要がある(図:\ref{fig:iothread_blockedread})。 |
7 | 223 \begin{figure}[htpb] |
224 \begin{center} | |
9 | 225 \includegraphics[scale=0.7]{./images/cerium/iothread.pdf} |
7 | 226 \end{center} |
227 \caption{IO Thread による BlockedRead} | |
228 \label{fig:iothread_blockedread} | |
229 \end{figure} | |
8
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
230 |
7197f324a8cf
add graffle
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
231 IO\_0 で実行される Task は Blocked Read のみで、さらに IO\_0 の priority を高く設定することにより Blocked Read が他の Task に割り込まれることなく連続に実行される。 |