Mercurial > hg > Papers > 2018 > parusu-master
changeset 31:8793903e4a0d
Update
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 02 Feb 2018 04:14:20 +0900 |
parents | 9fa82713bd5c |
children | ebcf093795f3 |
files | paper/gpu.tex paper/master_paper.pdf paper/parallelism_gears.tex |
diffstat | 3 files changed, 12 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/gpu.tex Fri Feb 02 03:42:23 2018 +0900 +++ b/paper/gpu.tex Fri Feb 02 04:14:20 2018 +0900 @@ -47,7 +47,7 @@ 受け取ったデータ並列用の Task は Code Gear のメタレベルで kernel の実行を行う。 \section{CUDAExectuor} -CUDAExectuor は \coderef{executorInterface} を実装しており、 Host から Device へのデータの送信、 kernel の実行、 Device から Host への データの書き出しを行う。 +CUDAExectuor は \coderef{executorInterface} を実装しており、 Host から Device へのデータの送信(read)、 kernel の実行(exec)、 Device から Host への データの書き出しを行う(write)。 \lstinputlisting[caption=executor Inteface, label=code:executorInterface]{./src/executorInterface.h} @@ -62,7 +62,7 @@ この問題を解決するために、CUDABuffer という CUDA データ送信用の Data Gear を用意した. CUDABuffer には Data Gear の内部にポインタを持たない Data Gear まで展開した Input/Output Data Gear を格納される。 Data Gear を CUDABuffer に格納する処理は CUDAExectuor では行わず、実行される Task の stub Code Gear で行われる。 -CUDABuffer に格納されている Data Gear のサイズを参照し、 cuMemAlloc 関数で Device のデータ領域を確保する。 +CUDABuffer に格納されている Data Gear のサイズを参照し、cuMemAlloc 関数で Device のデータ領域を確保する。 Host、Device、CUDABuffer 間の関係を\figref{cudaDataArchitecture} に示す。 @@ -76,7 +76,9 @@ Host から Device にデータをコピーするには cuMemcpyHtoD 関数を使用して行う。 この際に Host で指定するデータは CUDABuffer に格納されている Data Gear となる。 + kernel の実行後、結果を Device から Host にコピーする際は cuMemcpyDtoH 関数で行われる。 +Host のコピーされたデータは Output Data Gear も含んでいるため、 コピー後は Output Data Gear への書き kernel の実行はcuLaunchKernel 関数で行われる。 cuLaunchKernel 関数には引数として各次元のblockサイズ、thread サイズ、kernel への引数等を渡す。 @@ -87,8 +89,13 @@ Gears OS ではデータ並列 Task の際は Iterator Interface を持っており、 そこで指定した長さ、次元数に応じて cuLaunchKernel の引数を決定する(\coderef{cuLaunchKernel} 11-18行目)。 +% 少ないけどコードはなるべく載せたくない(メタ部分 + 複雑) \section{stub Code Gear による kernel の実行} Gears OS では stub Code Gear で CUDA による実行の切り替える。 -stub Code Gear での切り替えの際は CUDABuffer への Data の格納、 実行される kernel の読み込みを行う。 -実際にGPU で実行される +stub Code Gear での切り替えの際は CUDABuffer への Data の格納、実行される kernel の読み込みを行う。 +実際に GPU で実行されるプログラムは \coderef{cudaTwice} のように記述する。 + +\lstinputlisting[caption=配列の要素を二倍にする例題, label=code:cudaTwice]{./src/cudaTwice.cu} + +stub Code Gear は通常はその stub に対応した Code Gear に継続するが、 CUDA で実行する際は CUDAExectuor の Code Gear に継続する。
--- a/paper/parallelism_gears.tex Fri Feb 02 03:42:23 2018 +0900 +++ b/paper/parallelism_gears.tex Fri Feb 02 04:14:20 2018 +0900 @@ -8,8 +8,6 @@ 本章では、Gears OS の並列処理の構成、機能について説明する。 -\section{並列処理の構成} - \section{Task} Gears OS では 並列実行する Task を Context で表現する。 Context には Task 用の情報として、実行される Code Gear、Input/Output Data Gear の格納場所、待っている Input Data Gear のカウンタ等を持っている。 @@ -186,7 +184,7 @@ この Queue にはその Data Gear を Input Data Gear として使用する Task(Context)が入っている。 依存関係の解決の流れを\figref{dependency} に示す。 -Worker は Task の Code Gear を実行後、Output Data Gear の 書き出し処理を行う。 +Worker は Task の Code Gear を実行後、Output Data Gear の 書き出し処理(Commit)を行う。 書き出し処理は Data Gear の Queue から、依存関係にある Task を参照する。 参照した Task には実行に必要な Input Data Gear のカウンタをもっているので、そのカウンタのデクリメントを行う。 カウンタが $0$ になったら Task が待っている Input Data Gear が揃ったことになるので、その Task を TaskManager 経由で 実行される Worker に送信する。