-1

私は現在、CPUコードよりも約3〜4倍遅いパフォーマンスのCUDAコードを持っています。

ほとんどの計算がGPUで実行され、最終結果のみがCPUメモリに転送されるように、無関係なCPU/GPU転送をすべて削除しました。

これをさらに高速化するために、少し読んでみたところ、GPUメモリバスがはるかに遅いため、GPUデバイスメモリへのアクセスも遅いことがわかりました。そして、私の計算では大きな配列を使用しているため、つまり多くのメモリアクセスを使用しているthreadsPerBlockため、最大1024に設定した場合でも処理速度が低下します。

私が今持っている唯一のオプションは、データのブロックを個々のブロックによって操作されるMP共有メモリにコピーし、そのメモリで計算を行うことだと思います。

バーストモードのメモリのチャンクを共有メモリに最も効率的にコピーする方法を知りたいです。各ワープの開始スレッドインデックスをコピーして実行する必要がありますか?

これを達成するための関連するコードまたは関数を備えたソリューションは大歓迎です!

4

1 に答える 1

2

バーストモードのようなものはありません。グローバルメモリから共有メモリへの最速のメモリコピーは、単にスレッドを使用して行うことです。

__global__ void mykernel(int *globaldata){

  __shared__ int localdata[256];
  int idx = threadIdx.x + blockIdx.x * blockDim.x;
  if (threadIdx.x < 256)
    localdata[threadIdx.x] = globaldata[idx];
  __syncthreads();

  (... rest of kernel code)
}

ブロックあたり少なくとも256のtheads(およびカーネル内の多くのブロック)で上記のカーネルを起動すると、良好なメモリ帯域幅と使用率が得られます。

CUDA Cのベストプラクティスガイドには、共有メモリを使用してさまざまな操作を効率的に高速化する方法に関するコード例がさらにあります。

于 2013-02-28T00:04:48.330 に答える