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週間あるのでまだ余裕はあるのだ!