如何在cuda中有效地移动3D矩阵

时间:2013-10-01 14:45:59

标签: cuda

我有一个3D矩阵M [i * strideyz + j * stridez + k]驻留在GPU上,我想逐层移动这个矩阵:i + 1 - > i,并将新数据附加到最后一层。我写了一个内核来做到这一点,但它很慢。我知道这里有一些讨论,但不知怎的,我没有找到答案。

这是我的实施:

__global void shift(int nlayers, float* M, float* inp,
                    size_t strideyz,size_t stridez)
{
  int k=blockIdx.x*blockDim.x+threadIdx.x;
  int j=blockIdx.y*blockDim.y+threadIdx.y;
  for(i=0;i<nlayers-1;i++)
    M[i*strideyz+j*stridez+k]=M[(i+1)*strideyz+j*stridez+k];
  M[(Nlayers-1)*strideyz+j*stridez+k]=inp[j*stridez+k];
}

2 个答案:

答案 0 :(得分:1)

根据您的评论,您似乎需要移动“字段”矩阵M来计算有限差异。从你的帖子来看,我认为你的方向是错误的。

您正在定义并且可能正在运行内核函数,只是为了执行移位和更改M的值,但您不应该更改它;您应该通过将M更新为新值(由有限差分格式指示)来更好地定义计算有限差分执行移位的内核。

看看论文

V. Demir and A.Z. Elsherbeni, "Compute Unified Device Architecture (CUDA) Based Finite-Difference Time-Domain (FDTD) Implementation", Applied Computational Electromagnetics Journal, vol. 25, n. 4, pp. 303-314, Apr. 2010.

它彻底讨论了三维有限差分的计算,虽然参考电磁学,但您可以从其他领域(例如声学)的读数中受益。仅作为注意事项,请考虑到讨论涉及旧的GPU架构,因此可能会针对较新的(例如,Fermi / Kepler)卡修改某些解决方案,例如使用共享内存的重要性。

最后,您可以在

找到一些有用的资料

Finite Difference Time Domain Method

虽然参考2D案例,但您可能会发现一些有用的技巧。

答案 1 :(得分:0)

我假设您使用全局内存。如果使用共享或寄存器内存,操作应该更快。