次のCUDAカーネルをプロファイリングしています
__global__ void fftshift_2D(double2 *data, int N1, int N2)
{
int i = threadIdx.x + blockDim.x * blockIdx.x;
int j = threadIdx.y + blockDim.y * blockIdx.y;
if (i < N1 && j < N2) {
double a = pow(-1.0, (i+j)&1);
data[j*blockDim.x*gridDim.x+i].x *= a;
data[j*blockDim.x*gridDim.x+i].y *= a;
}
}
これは基本的に、2D倍精度複素数データ行列にスカラー倍精度変数を乗算します。
ご覧のとおり、私は統合されたグローバルメモリアクセスを実行しています。グローバルメモリの負荷とストアの効率を検査することにより、NVIDIAVisualProfilerでこれを確認したいと思います。驚いたことに、そのような効率は両方とも正確に50%であり、合体したメモリアクセスで期待される100%からはほど遠いことがわかりました。これは、複素数の実数部と虚数部のインターレースストレージに関連していますか?もしそうなら、100%の効率を回復するために私が利用できるトリックはありますか?
前もって感謝します。
追加情報
BLOCK_SIZE_x=16
BLOCK_SIZE_y=16
dim3 dimBlock2(BLOCK_SIZE_x,BLOCK_SIZE_y);
dim3 dimGrid2(N2/BLOCK_SIZE_x + (N2%BLOCK_SIZE_x == 0 ? 0:1),N1/BLOCK_SIZE_y + (N1%BLOCK_SIZE_y == 0 ? 0:1));
N1とN2は任意の偶数にすることができます。
カードはNVIDIAGT540Mです。