comparison slide/blank.html @ 60:0690afa10eb7

add
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 17 Feb 2015 17:59:05 +0900
parents 8057614d5b77
children 1eea0dd50676
comparison
equal deleted inserted replaced
59:b85ecebe6fc3 60:0690afa10eb7
155 <img src="./images/cerium_image.png" width="700"> 155 <img src="./images/cerium_image.png" width="700">
156 <p>Cerium を用いることでマルチコア CPU と GPU において Scheduling を含めたプログラミングを可能となる。</p> 156 <p>Cerium を用いることでマルチコア CPU と GPU において Scheduling を含めたプログラミングを可能となる。</p>
157 </div> 157 </div>
158 158
159 <div class='slide'> 159 <div class='slide'>
160 <h2>Cerium での Task の例</h2> 160 <h2>Cerium における Task の生成</h2>
161 161
162 <p> 162 <p>
163 Cerium TaskManager では処理の単位を Task としてプログラムを記述していく。 163 Cerium TaskManager では処理の単位を Task としてプログラムを記述していく。
164 関数やサブルーチンを Task として扱い、Task に各種パラメタを設定した後に並列実行される。 164 関数やサブルーチンを Task として扱い、Task に各種パラメタを設定した後に並列実行される。
165 Input データの各要素同士を乗算し、 Output に格納する Multiply という例題がある。 165 Input データの各要素同士を乗算し、 Output に格納する Multiply という例題がある。
192 } 192 }
193 </pre> 193 </pre>
194 </div> 194 </div>
195 195
196 <div class='slide'> 196 <div class='slide'>
197 <h2></h2> 197 <h2>Cerium における Task の記述</h2>
198 198 <p>Device 側で実行される Task の記述を示す。</p>
199 <pre class="code">
200 static int
201 run(SchedTask ∗s) {
202 float ∗i_data1 = (float∗)s−>get_input(0); // get input
203 float ∗i_data2 = (float∗)s−>get_input(1); // get output
204 float ∗o_data = (float∗)s−>get_output(0); // get parameter
205 long length = (long)s−>get_param(0);
206
207 // calculate
208 for (int i=0; i&lt;length; i++) {
209 o_data[i] = i_data1[i] ∗ i_data2[i];
210 }
211 return 0;
212 }
213 </pre>
214 <p>Host 側では Task を生成する際に様々なパラメタを設定しており、
215 Task にはそれを取得する API が用意されている。</p>
216 <table border="0" >
217 <tr bgcolor="palegreen">
218 <th align="center">API</th><th align="center">content</th>
219 </tr>
220
221 <tr bgcolor="dbffa3">
222 <th align="left" >get_input</th><th align="left">入力データのアドレスを取得</th>
223 </tr>
224 <tr bgcolor="palegreen">
225 <th align="left">get_output</th><th align="left">出力先データのアドレスを取得</th>
226 </tr>
227 <tr bgcolor="dbffa3">
228 <th align="left">get_param</th><th align="left">パラメータを取得</th>
229 </tr>
230 </table>
231 </div>
232
233 <div class='slide'>
234 <h2>TaskManager の構成</h2>
235 <div align="center">
236 <img src='images/createtask.png' width="700">
237 </div>
238 <ul>
239 <li>TaskManagerと各Threadsの間には Syncronized な Mail Queueがある。
240 <li>依存関係の解決された Task は TaskManager から Mail Queue に送られる。
241 <li>Task に設定された CPUType に対応した Threads が Mail Queue から Task を取得し、並列実行していく。
242 </ul>
243 </div>
244
245 <div class='slide'>
246 <h2>マルチコア CPU 上での並列実行</h2>
247 <div align="center">
248 <img src="images/pipeline.png" width="600">
249 </div>
250 <p>
251 Cerium は Cell 上で動作するフレームワークであったが MacOSX、Linux 上での並列実行に対応させた。
252 </p>
253 <p>
254 マルチコア CPU 上での並列実行は、Synchronized Queue とパイプラインによって実現されている。
255 TaskManager で依存関係を解決された Task は Scheduler に送信され、
256 Scheduler が持っているパイプラインの機構に沿って並列に実行する。
257 </p>
258 </div>
259
260 <div class='slide'>
261 <h2>マルチコア CPU におけるパイプラインの実装</h2>
262 <table>
263 <tr>
264 <th>
265 <pre class="code" align="left">void
266 Scheduler::run(SchedTaskBase* task1) {
267 SchedTaskBase* task2 = new SchedNop();
268 SchedTaskBase* task3 = new SchedNop();
269
270 // main loop
271 do {
272
273 task1->read();
274 task2->exec();
275 task3->write();
276
277 delete task3;
278
279 task3 = task2;
280 task2 = task1;
281 task1 = task1->next(this, 0);
282
283 } while (task1);
284
285 delete task3;
286 delete task2;
287 }</pre>
288 </th>
289 <th align="left">
290 <p>
291 Cerium の Task は SchedTask と呼ばれるデータ構造で表現されている。
292 SchedTask は read/exec/write のメソッドを持っており、
293 パイプラインの各ステージで段階的に実行される。
294 </p>
295 <p>
296 引数として TaskList を受け取り、List 内の Task をパイプライン実行する。
297 task3 が write を担当しており、write が終わった Task は終了となる。
298 </p>
299 <p>
300 終了した task は delete して良い。
301 task3=task2、task2=task1 と SchedTask をずらして行き、TaskList から 次の Task を読み込む。
302 </p>
303 </th>
304 </tr>
305 </table>
306 </div>
307
308 <div class='slide'>
309 <h2>DMA の prefetch を用いた改良</h2>
310 </div>
311
312 <div class='slide'>
313 <h2>マルチコア CPU におけるデータ並列</h2>
314 </div>
315
316 <div class='slide'>
317 <h2>GPGPU への対応</h2>
318 </div>
319
320 <div class='slide'>
321 <h2>GPGPU におけるパイプラインの実装</h2>
322 </div>
323
324 <div class='slide'>
325 <h2>GPGPU におけるデータ並列</h2>
326 </div>
327
328 <div class='slide'>
329 <h2>Cerium の I/O(mmap による読み込み)</h2>
330 </div>
331
332 <div class='slide'>
333 <h2>BlockedRead による I/O の並列化</h2>
334 </div>
335
336 <div class='slide'>
337 <h2>I/O 専用のThread</h2>
338 </div>
339
340 <div class='slide'>
341 <h2>実験に利用する例題-Sort-</h2>
342 </div>
343
344 <div class='slide'>
345 <h2>実験に利用する例題-WordCount-</h2>
346 </div>
347
348 <div class='slide'>
349 <h2>実験に利用する例題-FFT-</h2>
350 </div>
351
352 <div class='slide'>
353 <h2>実験環境</h2>
354 </div>
355
356 <div class='slide'>
357 <h2>マルチコア CPU による並列実行のベンチマーク</h2>
358 </div>
359
360 <div class='slide'>
361 <h2>DMA の prefecth に関するベンチマーク </h2>
362 </div>
363
364 <div class='slide'>
365 <h2>GPGPU のベンチマーク</h2>
366 </div>
367
368 <div class='slide'>
369 <h2>データ並列実行のベンチマーク</h2>
370 </div>
371
372 <div class='slide'>
373 <h2>GPGPU のベンチマーク</h2>
374 </div>
375
376 <div class='slide'>
377 <h2>FFT による GPGPU のベンチマーク</h2>
378 </div>
379
380 <div class='slide'>
381 <h2>BlockedRead による並列 I/O のベンチマーク</h2>
382 </div>
383
384 <div class='slide'>
385 <h2>まとめ</h2>
386 </div>
387
388 <div class='slide'>
389 <h2>今後の課題</h2>
199 </div> 390 </div>
200 391
201 </div> <!-- presentation --> 392 </div> <!-- presentation -->
202 </bodypp> 393 </bodypp>
203 </html> 394 </html>