14
|
1 -title: Cerium における DataSegment API の設計
|
|
2
|
15
|
3 -author: 金城裕 河野真治
|
14
|
4
|
|
5 --affiliation: 琉球大学
|
|
6
|
|
7 --Cell用TaskManager Cerium
|
|
8
|
15
|
9 Cellの6 SPUのTask をパイプラインで管理する
|
|
10 Open CL と似たフレームワーク。
|
|
11
|
|
12 並列プログラムの例題や、ゲームプログラムを作成してきた。
|
|
13
|
14
|
14 もう、Linux が PS3 で動かないのでやっても意味がない。
|
|
15
|
|
16
|
|
17 --Cerium, Open/CLでの並列プログラミングの問題点
|
|
18
|
|
19 Task の取り扱うデータ型が示されない
|
|
20 Task 自体は簡単だが Task を構成する方法が繁雑
|
15
|
21 Open CL に比べても構文的に複雑
|
14
|
22 Task の種類が複雑
|
|
23 Task の依存関係の記述がデータの依存関係と無関係
|
|
24 Task Scheduler が大きくメモリを圧迫
|
|
25 C++ と Task 記述の相性が良くない
|
|
26 Task Manager が複雑になりすぎ
|
|
27
|
15
|
28 --Task の取り扱うデータ型が示されない
|
|
29
|
|
30
|
|
31 static int
|
|
32 run(SchedTask *s, void* rbuff, void* wbuff) {
|
|
33
|
|
34 int end = s->get_inputSize(0)/sizeof(Data);
|
|
35 DataPtr r_data = (DataPtr)s->get_input(0);
|
|
36
|
|
37 void* で受けてしまうので型チェックができない。
|
|
38
|
|
39 -- Task 自体は簡単だが Task を構成する方法が繁雑
|
|
40
|
|
41 int i = s->split_num-1;
|
|
42
|
|
43 s->fsort[i] = manager->create_task(QUICK_SORT,
|
|
44 (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num,
|
|
45 (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num);
|
|
46 if (i>0 && s->bsort[i-1]) {
|
|
47 s->fsort[i]->wait_for(s->bsort[i-1]);
|
|
48 }
|
|
49 s->fsort[i]->set_cpu(SPE_ANY);
|
|
50
|
|
51 Open CL に比べても構文的に複雑
|
|
52
|
|
53 -- Task の種類が複雑
|
|
54
|
|
55 SimpleTask read と write が一つ
|
|
56 Task read と write が8個まで
|
|
57 ArrayTask read と write が任意個、ひと続きで実行される
|
|
58 MainTask ppe で動作、Task生成が可能
|
|
59
|
|
60 --Task の依存関係の記述がデータの依存関係と無関係
|
|
61
|
|
62 for (int i = 0; i < s->split_num-1; i++) {
|
|
63 s->fsort[i] = manager->create_task(QUICK_SORT,
|
|
64 (memaddr)&s->data[i*block_num], sizeof(Data)*block_num,
|
|
65 (memaddr)&s->data[i*block_num], sizeof(Data)*block_num);
|
|
66 if (i>0 && s->bsort[i-1]) {
|
|
67 s->fsort[i]->wait_for(s->bsort[i-1]);
|
|
68 }
|
|
69 if (i<s->split_num-2 && s->bsort[i]) {
|
|
70 s->fsort[i]->wait_for(s->bsort[i]);
|
|
71 }
|
|
72 s->fsort[i]->set_cpu(SPE_ANY);
|
|
73
|
|
74 --その他
|
|
75
|
|
76 Task Scheduler が大きくメモリを圧迫
|
|
77
|
|
78 C++ と Task 記述の相性が良くない
|
|
79
|
|
80 Task Manager が複雑になりすぎ
|
|
81
|
14
|
82 --Continuation based C
|
|
83
|
|
84 関数呼び出しの代わりに goto を持つ C
|
|
85
|
|
86 Input Interface, Output Interface
|
|
87
|
|
88 <pre>
|
|
89 __code f(struct input a) { goto g(struct input a) ; }
|
|
90 __code f(struct input a, __code (*g)()) { goto g(struct input b) ; }
|
|
91 </pre>
|
|
92 <img src="fig/code.jpg">
|
|
93
|
|
94 --Code Segment 単位での並列実行
|
|
95
|
|
96 First, make single process code segments.
|
|
97
|
|
98 <img src="fig/single.jpg" id="anim" alt=""/>
|
|
99
|
15
|
100 これを並列に実行する。
|
|
101
|
14
|
102 <img src="fig/concurrent.jpg" id="anim" alt=""/>
|
|
103
|
15
|
104 code segment を並べ替えて、分散通信したりスケジューリングしたい
|
|
105
|
14
|
106
|
|
107 --再接続の問題
|
|
108
|
|
109 type miss match
|
|
110
|
|
111 fix argument type on applications
|
|
112
|
|
113 <img src="fig/cbc.jpg">
|
|
114
|
15
|
115 --再接続の問題
|
|
116
|
14
|
117 汎用の型でないと再接続できない。
|
|
118
|
|
119 <img src="fig/reconnection.jpg" class="incremental">
|
|
120
|
|
121 --Data segment
|
|
122
|
|
123 Code Segment の双対。型を持つメモリの切れ端。
|
|
124
|
|
125 Code Segment の Interface を置き換えるもの。
|
|
126
|
|
127 input datasegments
|
|
128 output datasegments
|
|
129
|
|
130 <img src="fig/datasegment.jpg">
|
|
131
|
|
132 --Data segmentを使ったパイプライン実行
|
|
133
|
|
134 <img src="fig/pipeline.jpg">
|
|
135
|
|
136 --Code segment の参照
|
|
137
|
|
138 Data segment を処理する Code Segment への参照
|
|
139
|
|
140 Pointer ではない
|
|
141 GPGPUやSPUで、実行コードは別空間なことが多い
|
|
142
|
|
143 GPGPUでも、通常のCPUでも両方で動かしたい。ポインタでは困る。
|
|
144
|
15
|
145 Code Segment は ID で指定する。番号。
|
|
146 実行CPUも指定できる
|
|
147 分散フレームワークでは、Geo Addressing を使用。
|
|
148
|
|
149 --get_segment, put_segment
|
14
|
150
|
15
|
151 Cell / SPU では、ローカルメモリ
|
|
152
|
|
153 read, write 以外に実行時に必要なデータもある。
|
|
154
|
|
155 get_segment
|
|
156 wait_segment
|
|
157
|
|
158 で Cache / LRU 的に取得する。
|
14
|
159
|
15
|
160 smanager->wait_segment(span_put_ms);
|
|
161
|
|
162 span_put_ms = span_get_ms;
|
|
163 smanager->put_segment(span_put_ms);
|
|
164
|
|
165 span_get_ms = smanager->get_segment((memaddr)spackList[index], span_ml);
|
|
166 smanager->wait_segment(span_get_ms);
|
14
|
167
|
15
|
168 prev_index = index;
|
|
169 spack = (SpanPackPtr)span_get_ms->data;
|
|
170
|
|
171
|
|
172 --Data Segement
|
|
173
|
|
174 get_segment で全部実装した方が良い?
|
|
175
|
|
176 Data Segment として API を整理しよう。
|
14
|
177
|
|
178 Json で表す
|
|
179
|
|
180 分散計算でも使えるように
|
|
181
|
|
182 Protocol Buffer や MessagePack
|
|
183
|
|
184 ---Data Segment のAPI
|
|
185
|
|
186 Data Segment は以下のAPIを持っている
|
|
187
|
|
188 create
|
|
189 read
|
|
190 update
|
|
191 delete
|
|
192
|
15
|
193 KVS 的にアクセスする。
|
|
194
|
14
|
195 --Data Segment 更新の Atomicity
|
|
196
|
|
197 Queuing
|
|
198 Update
|
|
199 Proority Queue
|
|
200
|
|
201 生成された Data segment は synchronized queue として使うことができる。
|
|
202
|
15
|
203 <img src="fig/DSCS.jpg">
|
|
204
|
14
|
205 ---Task Dependendcy
|
|
206
|
|
207 Cerium では、
|
|
208
|
|
209 task->wait_for(task1);
|
|
210
|
|
211 としていたが、繁雑。Data dependency が自然に依存関係を決めるので、それを
|
|
212 使うのが良い。
|
|
213
|
15
|
214 Data segment を Code segment に割り当てた時に、自動的に dependency が決まる。
|
|
215
|
|
216 Data segment -> Code segment -> Datas segment
|
|
217
|
14
|
218 ---Data Segment Storage Type
|
|
219
|
15
|
220 Data segment は様々な場所に置ける。
|
|
221
|
14
|
222 Main Memory
|
|
223 Local Memory
|
|
224 Cache Memory
|
|
225
|
|
226 Persitent Store
|
|
227
|
15
|
228 Code segment からは、指定された Data segment にしかアクセスできない。
|
|
229
|
|
230 --まとめ
|
|
231
|
|
232 PS3 Cell 用のTaskMangaer Cerium の利点/欠点を考察し、
|
|
233
|
|
234 Data Segment と Code Segment を用いた新しいフレームワークを提案した。
|
|
235
|
|
236 Continuation based C と組み合わせる
|
|
237
|
|
238 分散計算にも同様のAPIを用意し、並列環境でも分散環境でも共通に使える
|
|
239
|
|
240 フレームワークを作成したい。
|
14
|
241
|
|
242
|
|
243
|
|
244
|
|
245
|
|
246
|
15
|
247
|