GPUにFDTD方程式を実装しようとしていました。私は当初、グローバル メモリを使用するカーネルを実装していました。記憶の合体はそれほど素晴らしいものではありませんでした。したがって、共有メモリを使用して値をロードする別のカーネルを実装しました。私はのグリッドに取り組んでい1024x1024
ます。
コードは以下です
__global__ void update_Hx(float *Hx, float *Ez, float *coef1, float* coef2){
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x;
__shared__ float Ez_shared[BLOCKSIZE_HX][BLOCKSIZE_HY + 1];
/*int top = offset + x_index_dim;*/
if(threadIdx.y == (blockDim.y - 1)){
Ez_shared[threadIdx.x][threadIdx.y] = Ez[offset];
Ez_shared[threadIdx.x][threadIdx.y + 1] = Ez[offset + x_index_dim];
}
else{
Ez_shared[threadIdx.x][threadIdx.y] = Ez[offset];
}
}
定数BLOCKSIZE_HX
=16
およびBLOCKSIZE_HY
= 16
。
ビジュアル プロファイラーを実行すると、メモリが結合されていないと表示されます。
編集: 2.1 の cuda 計算機能を備えた GT 520 グラフィック カードを使用しています。My Global L2 transactions / Access =7.5
つまり、回線の実行の
245 760
ための L2 トランザクション
があります32768
Ez_shared[threadIdx.x][threadIdx.y] = Ez[offset];
Global memory load efficiency
です50%
。
Global memory load efficiency
=100 * gld_requested_throughput/ gld_throughput
スレッドが 16 個の連続した値を参照しているにもかかわらず、メモリ アクセスが非常に多い理由がわかりません。誰かが私が間違っていることを指摘できますか?
編集:すべての助けをありがとう。