Mercurial > hg > Papers > 2018 > parusu-master
comparison paper/gpu.tex @ 48:87c3ca104689
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 06 Feb 2018 06:29:31 +0900 |
parents | 9fbe922723e1 |
children | 7d72512ac2e8 |
comparison
equal
deleted
inserted
replaced
47:7ddbad0c4b5d | 48:87c3ca104689 |
---|---|
47 | 47 |
48 データ並列用の Task は CUDAWorker に送信する際は Task のコピーを行わず送信する。 | 48 データ並列用の Task は CUDAWorker に送信する際は Task のコピーを行わず送信する。 |
49 受け取ったデータ並列用の Task は Code Gear のメタレベルで kernel の実行を行う。 | 49 受け取ったデータ並列用の Task は Code Gear のメタレベルで kernel の実行を行う。 |
50 | 50 |
51 \section{CUDAExectuor} | 51 \section{CUDAExectuor} |
52 CUDAExectuor は \coderef{executorInterface} を実装しており、 Host から Device へのデータの送信(read)、 kernel の実行(exec)、 Device から Host への データの書き出しを行う(write)。 | 52 CUDAExectuor は \coderef{executorInterface} に示す ExecutorInterfaceを実装しており、 Host から Device へのデータの送信(read)、 kernel の実行(exec)、 Device から Host への データの書き出しを行う(write)。 |
53 | 53 |
54 \lstinputlisting[caption=executor Inteface, label=code:executorInterface]{./src/executorInterface.h} | 54 \lstinputlisting[caption=executor Inteface, label=code:executorInterface]{./src/executorInterface.h} |
55 | 55 |
56 Gears OS では データは Data Gear で表現される。 | 56 Gears OS では データは Data Gear で表現される。 |
57 つまり、Host、Device 間でデータのやり取りを行うということは Data Gear を GPU のデータ領域に沿った形に適用する必要がある。 | 57 つまり、Host、Device 間でデータのやり取りを行うということは Data Gear を GPU のデータ領域に沿った形に適用する必要がある。 |
58 Host から Device へデータを送信する際、 CUDA では cuMemAlloc 関数を使用して Device 側のデータ領域を確保する。 | 58 Host から Device へデータを送信する際、 CUDA では cuMemAlloc 関数を使用してサイズを指定し、Device 側のデータ領域を確保する。 |
59 cuMemAlloc 関数には確保するデータ領域のサイズを指定する必要がある。 | |
60 全ての Data Gear には Meta Data Gear として Data Gear のサイズを持っており、基本的にはこのサイズでデータ領域を取ればよい。 | 59 全ての Data Gear には Meta Data Gear として Data Gear のサイズを持っており、基本的にはこのサイズでデータ領域を取ればよい。 |
61 しかし、Data Gear によっては内部に更にポインタで Data Gear を持っている場合がある。 | 60 しかし、Data Gear によっては内部に更にポインタで Data Gear を持っている場合がある。 |
62 このような Data Gear は Data Gear の実際のサイズではなく、ポインタのサイズで計算されてしまうため、そのままでは Device 用のデータ領域を確保することができない。 | 61 このような Data Gear は Data Gear の実際のサイズではなく、ポインタのサイズで計算されてしまうため、そのままでは Device 用のデータ領域を確保することができない。 |
63 | 62 |
64 この問題を解決するために、CUDABuffer という CUDA データ送信用の Data Gear を用意した. | 63 この問題を解決するために、CUDABuffer という CUDA データ送信用の Data Gear を用意した. |
82 kernel の実行後、結果を Device から Host にコピーする際は cuMemcpyDtoH 関数で行われる。 | 81 kernel の実行後、結果を Device から Host にコピーする際は cuMemcpyDtoH 関数で行われる。 |
83 Host のコピーされたデータは Output Data Gear も含んでいるため、 コピー後は Output Data Gear への書き出す処理に継続する。 | 82 Host のコピーされたデータは Output Data Gear も含んでいるため、 コピー後は Output Data Gear への書き出す処理に継続する。 |
84 | 83 |
85 kernel の実行はcuLaunchKernel 関数で行われる。 | 84 kernel の実行はcuLaunchKernel 関数で行われる。 |
86 cuLaunchKernel 関数には引数として各次元のblockサイズ、thread サイズ、kernel への引数等を渡す。 | 85 cuLaunchKernel 関数には引数として各次元のblockサイズ、thread サイズ、kernel への引数等を渡す。 |
87 | 86 Gears OS ではデータ並列 Task の際は Iterator Interface を持っており、 そこで指定した長さ、次元数に応じて cuLaunchKernel の引数を決定する。 |
88 実際にcuLaunchKernel 関数を使用している部分を \coderef{cuLaunchKernel} に示す。 | |
89 | |
90 \newpage | |
91 | |
92 \lstinputlisting[caption=kernel の起動, label=code:cuLaunchKernel]{./src/cuLaunchKernel.cbc} | |
93 | |
94 Gears OS ではデータ並列 Task の際は Iterator Interface を持っており、 そこで指定した長さ、次元数に応じて cuLaunchKernel の引数を決定する(\coderef{cuLaunchKernel} 11-18行目)。 | |
95 | 87 |
96 % 少ないけどコードはなるべく載せたくない(メタ部分 + 複雑) | 88 % 少ないけどコードはなるべく載せたくない(メタ部分 + 複雑) |
97 \section{stub Code Gear による kernel の実行} | 89 \section{stub Code Gear による kernel の実行} |
98 Gears OS では stub Code Gear で CUDA による実行の切り替える。 | 90 Gears OS では stub Code Gear で CUDA による実行の切り替える。 |
99 | 91 |