我正在分析以下 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;
}
}
它基本上将二维双精度复数数据矩阵乘以标量双精度变量。
可以看出,我正在执行合并的全局内存访问,我想通过 NVIDIA Visual Profiler 通过检查全局内存负载和存储效率来验证这一点。令人惊讶的是,这样的效率都恰好是 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 可以是任意偶数。
该卡是 NVIDIA GT 540M。