comparison presen/index.html @ 29:6b60c1277599 default tip

fix
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Sun, 12 Jan 2014 09:18:32 +0900
parents d6d545336b5c
children
comparison
equal deleted inserted replaced
28:d6d545336b5c 29:6b60c1277599
106 106
107 <slide> 107 <slide>
108 <hgroup> 108 <hgroup>
109 <h3>Kernelの記述</h3> 109 <h3>Kernelの記述</h3>
110 </hgroup> 110 </hgroup>
111 <article>
112 2つのinputDataの積を取り、outputDataに返す例題Multiply 111 2つのinputDataの積を取り、outputDataに返す例題Multiply
113 <table border="0" cellpadding="0" cellspacing="0"> 112 <table border="0" cellpadding="0" cellspacing="0">
114 <tbody> 113 <tbody>
115 <tr> 114 <tr>
116 <td> 115 <td>
117 <img src='images/kernel_description.png' style="width:650px"> 116 <img src='images/kernel_description.png' style="height:570px">
118 </td> 117 </td>
119 <td style="font-size:18pt;color:black"> 118 <td style="font-size:18pt;color:black">
120 <p> 119 <p>
121 Taskの処理自体はC/C++の形式なので、同じ記述が可能。 120 Taskの処理自体はC/C++の形式なので、同じ記述が可能。
122 </p> 121 </p>
123 <p> 122 <p>
124 引数の受け取り方が違う。 123 引数の受け取り方が違う。
125 <ul> 124 <ul>
126 <li>CPU</li> 125 <li>CPU
127 <dd>rbuf/wbufとしてDataをまとめて受け取っている</dd> 126 <dd>rbuf/wbufとしてDataをまとめて受け取っている</dd></li>
128 <li>GPU</li> 127 <li>GPU
129 <dd>1つ1つ個別の変数として受け取っている</dd> 128 <dd>1つ1つ個別の変数として受け取っている</dd>
130 <dd>それぞれの変数にOpenCL独自の修飾子が必要</dd> 129 <dd>それぞれの変数にOpenCL独自の修飾子が必要</dd></li>
131 </ul> 130 </ul>
132 変数で受けるなどしてこの差異を吸収すれば、同じ記述が可能。 131 変数で受けるなどしてこの差異を吸収すれば、同じ記述が可能。
133 </p> 132 </p>
134 133
135 </td> 134 </td>
136 </tr> 135 </tr>
137 </tbody> 136 </tbody>
138 </table> 137 </table>
139 <br>
140 </article>
141 </slide> 138 </slide>
142 139
143 140
144 <slide> 141 <slide>
145 <hgroup> 142 <hgroup>
204 </hgroup> 201 </hgroup>
205 <article> 202 <article>
206 <table border="0" cellpadding="0" cellspacing="0"> 203 <table border="0" cellpadding="0" cellspacing="0">
207 <tbody> 204 <tbody>
208 <tr> 205 <tr>
209 <td><img src='images/gpu_data_parallel.png' style="height:400px"></td> 206 <td><img src='images/gpu_data_parallel.png' style="height:450px"></td>
210 <td style="font-size:18pt;color:black"> 207 <td style="font-size:18pt;color:black">
211 <p> 208 <p>
212 タスク並列だと、タスクごとにinput data と output data を転送しなければならない 209 タスク並列だと、タスクごとにinput data と output data を転送しなければならない
213 </p> 210 </p>
214 <p> 211 <p>
232 </hgroup> 229 </hgroup>
233 <article> 230 <article>
234 <table border="0" cellpadding="0" cellspacing="0"> 231 <table border="0" cellpadding="0" cellspacing="0">
235 <tbody> 232 <tbody>
236 <tr> 233 <tr>
237 <td><img src='images/ndrange_arch.png' style="height:450px"></td> 234 <td><img src='images/ndrange_arch.png' style="height:500px"></td>
238 <td style="font-size:18pt;color:black"> 235 <td style="font-size:18pt;color:black">
239 <p> 236 <p>
240 データを2、3次元に分割し、分割した部分に対して 237 データを2、3次元に分割し、分割した部分に対して
241 同一のTaskを割り当て、並列に処理を行う並列化手法 238 同一のTaskを割り当て、並列に処理を行う並列化手法
242 </p> 239 </p>
296 </hgroup> 293 </hgroup>
297 <article> 294 <article>
298 <p> 295 <p>
299 input data を二倍してoutput data に返す例題 296 input data を二倍してoutput data に返す例題
300 </p> 297 </p>
301 <pre class="prettyprint" data-lang="main.cc(Iterate Task 生成)"> 298 <img src="images/iterateTaskGen.png" height="250"></img>
302 HTaskPtr twice = manager->create_task(Twice);
303 twice->set_cpu(GPU);
304 twice->set_inData(0,(memaddr)input, sizeof(float)*length);
305 twice->set_outData(0,(memaddr)output, sizeof(float)*length);
306 // paramに0~length-1(index)をsetしたtaskをlength個spawnする
307 twice->iterate(length);
308 </pre>
309 <p> 299 <p>
310 iterate(length)とすることで、TaskManagerがデータ並列用にTaskを生成 300 iterate(length)とすることで、TaskManagerがデータ並列用にTaskを生成
311 </p> 301 </p>
312 <p> 302 <p>
313 この例だとlength個のTaskが生成され、各Taskに0~length-1までのID(index)を割り振る 303 この例だとlength個のTaskが生成され、各Taskに0~length-1までのID(index)を割り振る
321 <slide> 311 <slide>
322 <hgroup> 312 <hgroup>
323 <h3>iterate(Kernel)</h3> 313 <h3>iterate(Kernel)</h3>
324 </hgroup> 314 </hgroup>
325 <article> 315 <article>
326 <pre class="prettyprint" data-lang="twice.cc(MultiCore)"> 316 <img src="images/source/iterate_kernel.png" height="300"></img>
327
328 long i = (long)scheduler->x; // (long)scheduler->get_param(0);
329 output[i]=input[i]*2;
330 </pre>
331 <pre class="prettyprint" data-lang="twice.cl(GPU)">
332 long i = get_global_id(0);
333 output[i]=input[i]*2;
334 </pre>
335 <p> 317 <p>
336 MultiCoreではschedulerの持つメンバ変数x、OpenCLはget_global_idというAPIを用いて、 318 MultiCoreではschedulerの持つメンバ変数x、OpenCLはget_global_idというAPIを用いて、
337 自分に割り振られたid(index)を取得する。その後、そのindexに対して処理を行う。 319 自分に割り振られたid(index)を取得する。その後、そのindexに対して処理を行う。
338 </p> 320 </p>
339 <p> 321 <p>
345 <slide> 327 <slide>
346 <hgroup> 328 <hgroup>
347 <h3>iterateの実装</h3> 329 <h3>iterateの実装</h3>
348 </hgroup> 330 </hgroup>
349 <article> 331 <article>
350 <pre class="prettyprint" data-lang="HTask.cc"> 332 <img src="images/source/iterate.png" height="280"></img>
351 void 333 <p>渡されたlengthはwork item の要素数となる。</p>
352 HTask::iterate(long x) {
353 tl->dim=1;
354 tl->x=x;
355 // 1次元なのでy軸、z軸の要素数は1
356 tl->y=1;
357 tl->z=1;
358 mimpl->spawn_task(this);
359 }
360 </pre>
361 <p>渡されたlengthはwork item のx座標の要素数となる。</p>
362 <p>taskにデータ分割のためのdata(dimension, や workitem size)をsetする。</p> 334 <p>taskにデータ分割のためのdata(dimension, や workitem size)をsetする。</p>
363 <p> 335 <p>
364 Schedulerはtaskが持ってるdataを元にtaskを複数生成し、idを割り当てる。 336 Schedulerはtaskが持ってるdataを元にtaskを複数生成し、idを割り当てる。
365 </p> 337 </p>
366 </article> 338 </article>
369 <slide> 341 <slide>
370 <hgroup> 342 <hgroup>
371 <h3>iterateの実装(多次元)</h3> 343 <h3>iterateの実装(多次元)</h3>
372 </hgroup> 344 </hgroup>
373 <article> 345 <article>
374 <pre class="prettyprint" data-lang="HTask.cc"> 346 <img src="images/source/iterate_multidim.png" height="300"></img>
375 void
376 HTask::iterate(long x, long y) {
377 tl->dim=2;
378 tl->x=x;
379 tl->y=y;
380 tl->z=1;
381 mimpl->spawn_task(this);
382 }
383 </pre>
384 <p> 347 <p>
385 引数を複数渡せば多次元のデータ分割ができる。3次元までサポートする。 348 引数を複数渡せば多次元のデータ分割ができる。3次元までサポートする。
386 </p> 349 </p>
387 </article> 350 </article>
388 </slide> 351 </slide>
393 </hgroup> 356 </hgroup>
394 <br> 357 <br>
395 <p> 358 <p>
396 GpuSchedulerがOpenCLのAPIを呼び出し、GPUの制御を行う</p> 359 GpuSchedulerがOpenCLのAPIを呼び出し、GPUの制御を行う</p>
397 <p> 360 <p>
398 TaskManagerからTaskを受け取り、Command Queueにenqueueする 361 TaskManagerから受け取ったTaskは必要なパラメータを各種持っている
399 </p> 362 </p>
400 <article> 363 <article>
401 <pre class="prettyprint" data-lang="GpuScheduler.cc"> 364 <img src="images/source/GpuScheduler.png" height="120"></img>
402
403 clEnqueueNDRangeKernel(command_queue, kernel[cur], task->dim, NULL,
404 &task->x, &task->y, &task->z, NULL, NULL);
405 </pre>
406 <table border="2" style="font-size:18pt;"> 365 <table border="2" style="font-size:18pt;">
407 <tbody> 366 <tbody>
408 <h3 class="yellow">Taskの持つメンバ変数</h3> 367 <h3 class="yellow">Taskの持つメンバ変数</h3>
409 <tr> 368 <tr>
410 <td>dim</td> 369 <td>dim</td>
534 </tr> 493 </tr>
535 </tbody> 494 </tbody>
536 </table> 495 </table>
537 <br> 496 <br>
538 <p> 497 <p>
539 CPUとGPUの同時実行は、実行するTaskに対してset_cpu(SPE_ANY)とすれば良い 498 CPUとGPUの同時実行は、実行するTaskに対してset_cpu(ANY_ANY)とすれば良い
540 </p> 499 </p>
541 <p> 500 <p>
542 TaskはCPUとGPU、交互に割り振られる 501 TaskはCPUとGPU、交互に割り振られる
543 </p> 502 </p>
544 </article> 503 </article>
547 <slide> 506 <slide>
548 <hgroup> 507 <hgroup>
549 <h3>ベンチマーク</h3> 508 <h3>ベンチマーク</h3>
550 </hgroup> 509 </hgroup>
551 <article> 510 <article>
552 <table > 511 <img src="images/bench_mark_hetero.png" height="350"></img>
553 <tbody> 512 <h3 class="yellow">結果</h3>
554 <tr> 513 <p>
555 <td> 514 現段階ではSchedulingを行ってないため、GPUやCPUを単体で動かした時よりも遅くなる。
556 <img src="images/bench_mark_hetero.png" height="400"></img> 515 </p>
557 </td> 516 <p>
558 <td> 517 CPUとGPUは実行速度に差が出る場合がある。
559 <h3 class="yellow">結果</h3> 518 Taskの計算内容によってはどちらかのアーキテクチャに任せた方が良い。
560 <font size="5"> 519 それを確認するベンチマークを動かす。
561 <p> 520 </p>
562 現段階ではSchedulingを行ってないため、GPU単体で動かした時よりも遅くなる。 521 </font>
563 </p> 522 </article>
564 <p> 523 </slide>
565 CPUとGPUは実行速度に差が出る場合がある。 524
566 Taskの計算内容によってはどちらかのアーキテクチャに任せた方が良い。 525
567 それを確認するベンチマークを動かす。 526 <slide>
568 </p> 527 <hgroup>
569 <p> 528 <h3>ベンチマーク</h3>
570 529 </hgroup>
571 </p> 530 <article>
572 </font> 531 <img src="images/bench_mark_each_task.png" height="350"></img>
573 </td>
574 </tr>
575 </tbody>
576 </table>
577 </article>
578 </slide>
579
580
581 <slide>
582 <hgroup>
583 <h3>ベンチマーク</h3>
584 </hgroup>
585 <article>
586 <img src="images/bench_mark_each_task.png" height="350"></img>
587 <p> 532 <p>
588 FFTはSpinFactやButterfly演算等、様々なTaskで構成されている。 533 FFTはSpinFactやButterfly演算等、様々なTaskで構成されている。
589 それぞれのTaskについて、実行時間を計測した。 534 それぞれのTaskについて、実行時間を計測した。
590 </p> 535 </p>
591 <p> 536 <p>
592 SpinFactのTaskに関しては、CPUの方が実行速度が早い。 537 大体のTaskはGPUの方が速いが、SpinFactのTaskに関してはCPUの方が実行速度が速い。
593 </p> 538 </p>
594 </article> 539 </article>
595 </slide> 540 </slide>
596 541
597 <slide> 542 <slide>
603 <tbody> 548 <tbody>
604 <tr> 549 <tr>
605 <td> 550 <td>
606 <img src="images/decide_weight.png" height="150"></img> 551 <img src="images/decide_weight.png" height="150"></img>
607 </td> 552 </td>
608 <td> 553 <td style="font-size:18pt;color:black">
609 並列実行するTaskをCPUとGPUで事前に一度実行し、実行時間を測定する。 554 並列実行するTaskをCPUとGPUで事前に一度実行し、実行時間を測定する。
610 それぞれの実行時間の割合で重みをつける。 555 それぞれの実行時間の割合で重みをつける。
611 </td> 556 </td>
612 </tr> 557 </tr>
613 <tr> 558 <tr>
614 <td> 559 <td>
615 <img src="images/select_arch.png" height="200"></img> 560 <img src="images/select_arch.png" height="200"></img>
616 </td> 561 </td>
617 <td> 562 <td style="font-size:18pt;color:black">
618 <p> 563 <p>
619 それぞれの重みからCPU実行とGPU実行のどちらに適しているか判断する 564 それぞれの重みからCPU実行とGPU実行のどちらに適しているか判断する
620 </p> 565 </p>
621 </td> 566 </td>
622 </tr> 567 </tr>
638 <tbody> 583 <tbody>
639 <tr> 584 <tr>
640 <td> 585 <td>
641 <img src="images/decide_weight2.png" height="150"></img> 586 <img src="images/decide_weight2.png" height="150"></img>
642 </td> 587 </td>
643 <td> 588 <td style="font-size:18pt;color:black">
644 全てのTaskがCPUの二倍、GPUの方が実行速度が早い場合 589 全てのTaskがCPUの二倍、GPUの方が実行速度が早い場合
645 </td> 590 </td>
646 </tr> 591 </tr>
647 <tr> 592 <tr>
648 <td> 593 <td>
649 <img src="images/select_arch2.png" height="180"></img> 594 <img src="images/select_arch2.png" height="180"></img>
650 </td> 595 </td>
651 <td> 596 <td style="font-size:18pt;color:black">
652 <p> 597 <p>
653 それぞれのTaskを得意とするアーキテクチャに全て割り振るのではなく、 598 それぞれのTaskを得意とするアーキテクチャに全て割り振るのではなく、
654 RunTimeが最小になるように割り振る 599 RunTimeが最小になるように割り振る
655 </p> 600 </p>
656 </td> 601 </td>
672 <li>CPUとGPUでのTaskの同時実行に対応</li> 617 <li>CPUとGPUでのTaskの同時実行に対応</li>
673 <li>同時実行時のTaskのScheduling手法の提案</li> 618 <li>同時実行時のTaskのScheduling手法の提案</li>
674 </ul> 619 </ul>
675 <h3 class="yellow">今後の課題</h3> 620 <h3 class="yellow">今後の課題</h3>
676 <ul> 621 <ul>
677 <li>提案したSchedulingの手法を実装・ベンチマーク</li> 622 <li>提案したSchedulingの手法を実装/ベンチマーク</li>
678 <li>ベンチマークに使用する例題の追加</li> 623 <li>ベンチマークに使用する例題の追加</li>
624 <li>GPUのSchedulerにパイプライン機構の導入</li>
679 </ul> 625 </ul>
680 </article> 626 </article>
681 </slide> 627 </slide>
682 628
683 <!-- 629 <!--