我有一个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];
}
答案 0 :(得分:1)
根据您的评论,您似乎需要移动“字段”矩阵M
来计算有限差异。从你的帖子来看,我认为你的方向是错误的。
您正在定义并且可能正在运行内核函数,只是为了执行移位和更改M
的值,但您不应该更改它;您应该通过将M
更新为新值(由有限差分格式指示)来更好地定义计算有限差分和执行移位的内核。
看看论文
它彻底讨论了三维有限差分的计算,虽然参考电磁学,但您可以从其他领域(例如声学)的读数中受益。仅作为注意事项,请考虑到讨论涉及旧的GPU架构,因此可能会针对较新的(例如,Fermi / Kepler)卡修改某些解决方案,例如使用共享内存的重要性。
最后,您可以在
找到一些有用的资料Finite Difference Time Domain Method
虽然参考2D案例,但您可能会发现一些有用的技巧。
答案 1 :(得分:0)
我假设您使用全局内存。如果使用共享或寄存器内存,操作应该更快。