Mercurial > hg > Papers > 2018 > parusu-master
comparison slide/slide.html @ 107:0b7cf219ebfa
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Feb 2018 14:35:22 +0900 |
parents | 2d411c46eeb9 |
children | 202041abe27b |
comparison
equal
deleted
inserted
replaced
106:2d411c46eeb9 | 107:0b7cf219ebfa |
---|---|
85 | 85 |
86 <div class='slide '> | 86 <div class='slide '> |
87 <!-- === begin markdown block === | 87 <!-- === begin markdown block === |
88 | 88 |
89 generated by markdown/1.2.0 on Ruby 2.3.0 (2015-12-25) [x86_64-darwin16] | 89 generated by markdown/1.2.0 on Ruby 2.3.0 (2015-12-25) [x86_64-darwin16] |
90 on 2018-02-13 14:15:23 +0900 with Markdown engine kramdown (1.13.2) | 90 on 2018-02-13 14:35:17 +0900 with Markdown engine kramdown (1.13.2) |
91 using options {} | 91 using options {} |
92 --> | 92 --> |
93 | 93 |
94 <!-- _S9SLIDE_ --> | 94 <!-- _S9SLIDE_ --> |
95 <h2 id="section">並列処理の重要性</h2> | 95 <h2 id="section">並列処理の重要性</h2> |
404 <li>変換後は Context を参照するコードが生成される</li> | 404 <li>変換後は Context を参照するコードが生成される</li> |
405 </ul> | 405 </ul> |
406 </li> | 406 </li> |
407 <li>Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す</li> | 407 <li>Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す</li> |
408 <li>Context には Interface の引数を渡すための Data Gear が予め用意されている</li> | 408 <li>Context には Interface の引数を渡すための Data Gear が予め用意されている</li> |
409 <li>goto meta では Interface の Code Gear の番号を Code Gear へのポインタに変換して継続を行う | 409 <li>goto meta では Interface の Code Gear の番号を Code Gear へのポインタに変換して継続を行う</li> |
410 <ul> | |
411 <li>goto meta にはメタ計算をいれることができる</li> | |
412 </ul> | |
413 </li> | |
414 </ul> | 410 </ul> |
415 | 411 |
416 <pre lang="c"><code>__code code1(struct Context *context) { | 412 <pre lang="c"><code>__code code1(struct Context *context) { |
417 Queue* queue = createSingleLinkedQueue(context); | 413 Queue* queue = createSingleLinkedQueue(context); |
418 Node* node = &ALLOCATE(context, Node)->Node; | 414 Node* node = &ALLOCATE(context, Node)->Node; |
428 </div> | 424 </div> |
429 <div class='slide '> | 425 <div class='slide '> |
430 <!-- _S9SLIDE_ --> | 426 <!-- _S9SLIDE_ --> |
431 <h2 id="interface--stub-code-gear">Interface での stub Code Gear</h2> | 427 <h2 id="interface--stub-code-gear">Interface での stub Code Gear</h2> |
432 <ul> | 428 <ul> |
433 <li>meta Code Gear では引数に指定された Code Gear の番号から stub Code Gear を取り出し、 継続を行う</li> | 429 <li>meta Code Gear では引数に指定された Code Gear の番号から stub Code Gear への関数ポインタを取り出し、 継続を行う</li> |
434 <li>メタ計算で格納された引数は stub Code Gear で Code Gear に渡される</li> | 430 <li>メタ計算で格納された引数は stub Code Gear で Code Gear に渡される</li> |
435 <li>Interface を実装した Code Gear は Interface の定義から stub Code Gear の自動生成が可能</li> | 431 <li>Interface を実装した Code Gear は Interface の定義から stub Code Gear の自動生成が可能</li> |
432 <li>必要ならばメタ計算を meta Code Gear か stub Code Gear に埋め込むことができる</li> | |
436 </ul> | 433 </ul> |
437 | 434 |
438 <pre lang="c"><code>// implement put code gear | 435 <pre lang="c"><code>// implement put code gear |
439 __code putSingleLinkedQueue(struct Context *context,struct SingleLinkedQueue* queue, | 436 __code putSingleLinkedQueue(struct Context *context,struct SingleLinkedQueue* queue, |
440 union Data* data, enum Code next) { | 437 union Data* data, enum Code next) { |
460 <!-- _S9SLIDE_ --> | 457 <!-- _S9SLIDE_ --> |
461 <h2 id="section-2">並列処理の構成</h2> | 458 <h2 id="section-2">並列処理の構成</h2> |
462 <ul> | 459 <ul> |
463 <li>今回は並列処理機構である | 460 <li>今回は並列処理機構である |
464 <ul> | 461 <ul> |
465 <li>Task</li> | 462 <li>Task |
463 <ul> | |
464 <li>1つの Context 上で goto で遷移しながら実行される Code Gear の列</li> | |
465 </ul> | |
466 </li> | |
466 <li>TaskManager | 467 <li>TaskManager |
467 <ul> | 468 <ul> |
468 <li>Worker の生成、依存関係を解決したTask を Worker に送信する</li> | 469 <li>依存関係を解決したTask を Worker SynchronizedQueue に送信する</li> |
469 </ul> | 470 </ul> |
470 </li> | 471 </li> |
471 <li>Worker | 472 <li>Worker |
472 <ul> | 473 <ul> |
473 <li>SynchronizedQueue から Task を一つずつ取得し、実行する</li> | 474 <li>SynchronizedQueue から Task を一つずつ取得し、実行する</li> |
474 <li>Worker 毎に POSIX Therad などを生成し、それぞれのスレッドで Code Gear を実行する</li> | 475 <li>Worker 毎に POSIX Therad などを生成し、それぞれのスレッドで Code Gear を実行する</li> |
475 </ul> | 476 </ul> |
476 </li> | 477 </li> |
477 <li>SynchronizedQueue | 478 <li>SynchronizedQueue |
478 <ul> | 479 <ul> |
479 <li>マルチスレッド環境でもデータの同期処理が行われる Queue</li> | 480 <li>Gears OS で記述されたマルチスレッド環境でもデータの同期処理が行われる Queue</li> |
480 </ul> | 481 </ul> |
481 </li> | 482 </li> |
482 </ul> | 483 </ul> |
483 </li> | 484 </li> |
484 <li>をInterface を用いて実装した</li> | 485 <li>これらを Interface として実装した</li> |
485 </ul> | 486 </ul> |
486 | 487 |
487 | 488 |
488 </div> | 489 </div> |
489 <div class='slide '> | 490 <div class='slide '> |
490 <!-- _S9SLIDE_ --> | 491 <!-- _S9SLIDE_ --> |
491 <h2 id="task">Task</h2> | 492 <h2 id="task">Task</h2> |
492 <ul> | 493 <ul> |
493 <li>Gears OS では Context が並列実行の Task に相当する</li> | 494 <li>Gears OS では Context が並列実行の Task に相当する</li> |
494 <li>Context は Task用の情報として以下の情報をもっている | 495 <li>Context は Task用の情報として以下の情報を付け加えた |
495 <ul> | 496 <ul> |
496 <li>実行する Code Gear</li> | 497 <li>実行する Code Gear</li> |
497 <li>Input/Output Data Gear の格納場所</li> | 498 <li>Input/Output Data Gear の格納場所</li> |
498 <li>待っている Input Data Gear の数</li> | 499 <li>待っている Input Data Gear の数</li> |
500 <li>この Task を実行する Worker</li> | |
499 </ul> | 501 </ul> |
500 </li> | 502 </li> |
501 </ul> | 503 </ul> |
502 | 504 |
503 | 505 |
504 </div> | 506 </div> |
505 <div class='slide '> | 507 <div class='slide '> |
506 <!-- _S9SLIDE_ --> | 508 <!-- _S9SLIDE_ --> |
507 <h2 id="taskmanger">TaskManger</h2> | 509 <h2 id="taskmanger">TaskManger</h2> |
508 <ul> | 510 <ul> |
509 <li>Worker を作成、終了処理を行う | 511 <li>Worker をCPU、 GPU の数分生成する</li> |
510 <ul> | |
511 <li>CPU、 GPU の数分生成する</li> | |
512 </ul> | |
513 </li> | |
514 <li>依存関係を解決した Task を各 Worker の Queue に送信する</li> | 512 <li>依存関係を解決した Task を各 Worker の Queue に送信する</li> |
515 </ul> | 513 </ul> |
516 | 514 |
517 <div> | 515 <div> |
518 <img src="./images/sendTask.svg" alt="message" style="float: left;width: 50%;" /> | 516 <img src="./images/sendTask.svg" alt="message" style="float: left;width: 50%;" /> |
556 </div> | 554 </div> |
557 <div class='slide '> | 555 <div class='slide '> |
558 <!-- _S9SLIDE_ --> | 556 <!-- _S9SLIDE_ --> |
559 <h2 id="synchronized-queue">Synchronized Queue</h2> | 557 <h2 id="synchronized-queue">Synchronized Queue</h2> |
560 <ul> | 558 <ul> |
561 <li>Worker で使用される Queue は Task を送信するTaskManager と Task を取得する Worker 毎で操作される</li> | 559 <li>TaskManager と Worker 間の通信を行うための Queue |
562 <li>そのためマルチスレッドでのデータの同期処理を行える SynchronizedQueue として実装する</li> | 560 <ul> |
563 <li>Gears OS では CAS(Check and Set、 Compare and Swap) を使用した実装を行った | 561 <li>Queue は Worker の数だけ生成される</li> |
562 </ul> | |
563 </li> | |
564 <li>マルチスレッド間でのデータの同期処理を行える</li> | |
565 <li>Gears OS では 同期機構として CAS(Check and Set、 Compare and Swap) を使用した実装を行った | |
564 <ul> | 566 <ul> |
565 <li>CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較し、変化がなければ値を更新する</li> | 567 <li>CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較し、変化がなければ値を更新する</li> |
566 <li>メモリ番地の値が変わっているなら、もう一度 CAS を行う</li> | 568 <li>メモリ番地の値が変わっているなら、もう一度 CAS を行う</li> |
567 </ul> | 569 </ul> |
568 </li> | 570 </li> |
643 <ul> | 645 <ul> |
644 <li>Gears OS は GPU での実行もサポートしている</li> | 646 <li>Gears OS は GPU での実行もサポートしている</li> |
645 <li>GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる</li> | 647 <li>GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる</li> |
646 <li>CUDA は GPU を Device、 CPU を Host として定義する</li> | 648 <li>CUDA は GPU を Device、 CPU を Host として定義する</li> |
647 <li>CUDA は処理の最小の単位を thread とし、それをまとめた block を展開し Device 上で実行されるプログラム(Kernel)を実行する</li> | 649 <li>CUDA は処理の最小の単位を thread とし、それをまとめた block を展開し Device 上で実行されるプログラム(Kernel)を実行する</li> |
648 <li>今回、CUDA に合わせた並列処理機構である CUDAWorker、 CUDAExecutor をInterface を用いて実装し、 CPU、GPU間のデータのマッピングのために CUDABuffer を用意した</li> | 650 <li>今回、CUDA に合わせた並列処理機構である CUDAWorker、 CUDAExecutor をInterface を用いて実装し、 CPU、GPU 間のデータのマッピングのために CUDABuffer を用意した</li> |
649 </ul> | 651 </ul> |
650 | 652 |
651 | 653 |
652 </div> | 654 </div> |
653 <div class='slide '> | 655 <div class='slide '> |