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 = &amp;ALLOCATE(context, Node)-&gt;Node; 414 Node* node = &amp;ALLOCATE(context, Node)-&gt;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 '>