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