GPU cudaでsorプログラムを並列化してみた
課題の為に初めてcudaプログラミングをした。
内容を予めCで書かれてる逐次のsorプログラムを並列化すること。
↓以下勉強したこと
- cudaの基本はホストプログラムからGPU上で呼び出されるカーネル関数を呼び出して実行。
- 重要なのはメモリ割当で、関数を呼び出す前に予めcudamallocによりgpu上で用いるメモリ領域を割り当てる必要がある。
- host<=>gpu間のメモリコピーにはcudaMemcpyを使って行うことができる。どこからどこへ転送するかを転送タイプ(cudaMemcpyHostToDevice,cudaMemcpyDeviceToHost)に明記する必要がある。
- カーネル関数は__global__ void {関数名}({param}) {...}のように定義し、{関数名}<<<{ブロック数}, {ブロック内スレッド数}>>>({param})と呼び出すことができる。
- bottoleneckとなるのは当然I/O処理で変数をどこのメモリに置くかが重要
- global memoryではなく、1ブロック内で利用出来るshared memoryを利用する
- shared memoryを使う場合はconflictを避けるためにも適宜__syncthread()などでスレッド間の同期を取る必要がある。
とりあえず、2,3時間で最適化なしの並列化はできたから、後はshared memory使って高速化してみよう。提出期限まであと3週間あるのでまだ余裕はあるのだ!