Mercurial > hg > Papers > 2014 > masakoha-sigos
annotate paper/cerium.tex @ 15:5bdd06f52b61
add expriment Data
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 21 Apr 2014 21:15:36 +0900 |
parents | 6f6f482b9f12 |
children | d354ebd64148 |
rev | line source |
---|---|
0 | 1 \section{Cerium TaskManager}\label{section:cerium} |
1 | 2 |
3 Cerium Task Manager は並列プログラミングフレームワークであり、内部では C や C++ で実装されている。 | |
15
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
4 Cerium Task Manager は、User が並列処理を Task 単位で記述し、関数やサブルーチンを Task として扱い、その Task に対して Input Data、Output Data を設定する。 |
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
5 Input Data、Output Data とは関数でいう引数に相当する。そして Task が複数存在する場合、それらに依存関係を設定することができる。 |
1 | 6 そして、それに基づいた設定の元で Task Manager にて管理し実行される。 |
7 Cerium Task Manager は PlayStation 3/Cell、Mac OS X 及び Linux 上で利用することが可能である。 | |
0 | 8 |
8 | 9 図\ref{fig:cerium} は Cerium が Task を作成・実行する場合のクラスの構成となる。User が createtask を行い、input data や Task の依存関係の設定を行うと、TaskManager で Task が生成される。 |
10 Task 毎に依存関係を表す wait\_i と wait\_me というリストがあり、依存関係が解消されて実行可能になった Task は ActiveTaskList に移される。さらに、Scheduler に転送する際には TaskList に変換を行ってから各 Scheduler に転送される。 | |
1 | 11 |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
12 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
13 \begin{center} |
8 | 14 \includegraphics[scale=0.3]{images/ceriumtaskmanager.pdf} |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
15 \end{center} |
8 | 16 \caption{Cerium Task Manager} |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
17 \label{fig:cerium} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
18 \end{figure} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
19 |
12 | 20 \newpage |
21 | |
22 \subsection{Cerium Task Manager を使った例題} | |
23 今回計測に使用した例題 WordCount を例にとり、以下に Task の生成部分を以下に示す。 | |
24 このプログラムは、WordCount Task と Print Task の2種類の Task から構成される。 | |
1 | 25 |
12 | 26 input data とは、mmap や read で読み込んだファイルであり、このファイルを $ n $ KByte の大きさに分割して、WordCount Task にそれぞれ割り当てる。 |
9 | 27 |
12 | 28 WordCount Task は、input された data の単語数と行数をカウントし、それらを output に指定された data 領域に書きこむ。 |
29 | |
30 以下に WordCount の Task 生成部分を示す。 | |
9 | 31 |
0 | 32 \begin{verbatim} |
12 | 33 exec = manager->create_task(TASK_EXEC); |
34 exec->set_inData(0, | |
35 file_mmap + i*division_size, | |
36 size); | |
37 exec->set_outData(0,o_data + i*out_size, | |
38 division_out_size); | |
39 | |
40 exec->set_cpu(spe_cpu); | |
41 exec->spawn(); | |
42 i++; | |
0 | 43 \end{verbatim} |
44 | |
45 \begin{tiny} | |
46 \begin{table}[ht] | |
47 \begin{center} | |
48 \label{table:create_taskAPI} | |
49 \small | |
50 \begin{tabular}[t]{c|l} | |
51 \hline | |
1 | 52 create\_task& Task を生成する \\ |
53 \hline | |
12 | 54 set\_inData & Task に入力データのアドレスを追加 \\ |
1 | 55 \hline |
12 | 56 set\_outData & Task に出力データのアドレスを追加 \\ |
0 | 57 \hline |
1 | 58 set\_cpu & Task を実行するデバイスの設定 \\ |
59 \hline | |
60 spawn & 生成した Task を TaskList に set \\ | |
0 | 61 \hline |
1 | 62 \end{tabular} |
63 \caption{Task 生成における API} | |
64 \end{center} | |
65 \end{table} | |
66 \end{tiny} | |
15
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
67 set\_inData には、WordCount Task が担当するテキストの範囲を設定し、set\_outData にはその範囲の単語数や行数、範囲の先頭と末尾の状態を表すフラグを配列として格納してる。 |
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
68 input data は分割されたデータが送られてくるため、分割された前後のテキストがどうなっているかはわからない。 |
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
69 そのため、担当範囲であるデータの先頭と末尾のパラメータを単語数と行数の他に付け加える。後にそのデータを他の WordCount の結果と照らし合わせ、分割されたテキストを正しく整合する。 |
1 | 70 |
71 Task の記述は以下のようになる。 | |
72 \\ | |
73 | |
74 \begin{verbatim} | |
12 | 75 wordcount(SchedTask *s, void *rbuf, void *wbuf) |
1 | 76 { |
12 | 77 char *i_data = (char *)s->get_input(0); |
78 unsigned long long *o_data = | |
79 (unsigned long long *)s->get_output(0); | |
80 unsigned long long *head_tail_flag = | |
81 o_data + 2; | |
82 int length = (int)s->get_inputSize(0); | |
83 | |
84 head_tail_flag[0] = | |
85 (i_data[0] != 0x20) && | |
86 (i_data[0] != 0x0A); | |
87 | |
88 word_num -= 1-head_tail_flag[0]; | |
89 | |
90 for (; i < length; i++) { | |
91 if (i_data[i] == 0x20) { | |
92 word_flag = 1; | |
93 } else if (i_data[i] == 0x0A) { | |
94 line_num += 1; | |
95 word_flag = 1; | |
96 } else { | |
97 word_num += word_flag; | |
98 word_flag = 0; | |
99 } | |
1 | 100 } |
12 | 101 |
102 word_num += word_flag; | |
103 head_tail_flag[1] = | |
104 (i_data[i-1] != 0x20) && | |
105 (i_data[i-1] != 0x0A); | |
106 | |
107 o_data[0] = (unsigned long long)word_num; | |
108 o_data[1] = (unsigned long long)line_num; | |
109 | |
1 | 110 return 0; |
111 } | |
112 \end{verbatim} | |
113 | |
114 \begin{tiny} | |
115 \begin{table}[ht] | |
116 \begin{center} | |
117 \label{table:taskAPI} | |
118 \small | |
119 \begin{tabular}[t]{c|l} | |
0 | 120 \hline |
1 | 121 get\_input & Scheduler から input data を取得 \\ |
0 | 122 \hline |
1 | 123 get\_output & Scheduler から output data を取得 \\ |
124 \hline | |
125 get\_param & set\_param した値を取得 \\ | |
0 | 126 \hline |
127 \end{tabular} | |
9 | 128 \caption{Task 側で使用する API} |
0 | 129 \end{center} |
130 \end{table} | |
131 \end{tiny} | |
12 | 132 |
133 Print Task は WordCount Task によって書き出された単語数と行数を集計し、結果を出力する Task である。 | |
15
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
134 WordCount Task が全て走り終わったあとに、Print Task が走るように依存関係を設定している。(図\ref{fig:wordcount}) |
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
135 |
12 | 136 |
137 \begin{figure}[htbp] | |
138 \begin{center} | |
139 \includegraphics[scale=0.4]{images/wordcount.pdf} | |
140 \end{center} | |
141 \caption{WordCount Model} | |
142 \label{fig:wordcount} | |
143 \end{figure} | |
144 | |
15
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
145 \if0 |
12 | 146 単語数や行数、そして担当範囲の先頭と末尾の文字列の状態を配列としてデータを保持している。 |
147 その配列を Print Task にて処理を行い単語数、行数を集計する。 | |
148 | |
149 しかし、分割のされ方によっては、単語数がカウントされない場合がある。(((図が必要!!!))) | |
150 | |
151 | |
152 Print Task の記述は以下のようになる。 | |
153 | |
154 \begin{verbatim} | |
155 static int | |
156 run_print(SchedTask *s, void *rbuf, void *wbuf) | |
157 { | |
158 WordCount *w = (WordCount*)s->get_input(0); | |
159 unsigned long long *idata = w->o_data; | |
160 long status_num = w->status_num; | |
161 int out_task_num = w->out_task_num; | |
162 | |
163 unsigned long long word_data[2]; | |
164 | |
165 int flag_cal_sum = 0; | |
166 | |
167 for (int i = 0; i < out_task_num ; i++) { | |
168 word_data[0] += idata[i*w->out_size+0]; | |
169 word_data[1] += idata[i*w->out_size+1]; | |
170 unsigned long long *head_tail_flag = | |
171 &idata[i*w->out_size+2]; | |
172 if((i!=out_task_num-1)&& | |
173 (head_tail_flag[1] == 1) && | |
174 (head_tail_flag[4] == 0)) { | |
175 flag_cal_sum++; | |
176 } | |
177 } | |
178 | |
179 word_data[0] += flag_cal_sum; | |
180 | |
181 for (int i = status_num-1; i >=0; i--) { | |
182 s->printf("%llu ",word_data[i]); | |
183 } | |
184 return 0; | |
185 } | |
186 \end{verbatim} | |
15
5bdd06f52b61
add expriment Data
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
187 \fi |