-2

我有一个驻留在 GPU 上的 3D 矩阵 M[i*strideyz+j*stridez+k],我想逐层移动这个矩阵: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];
}
4

2 回答 2

1

从您的评论来看,您似乎需要移动“场”矩阵M来计算有限差分。从你的帖子来看,我认为你走错了方向。

您正在定义并且可能正在运行一个内核函数,只是为了执行移位和更改的值,M但您不应该更改它;您应该通过更新到新值(由有限差分方案决定)来更好地定义一个计算有限差分即时执行移位的内核。M

看看纸

V. Demir 和 AZ Elsherbeni,“基于计算统一设备架构 (CUDA) 的有限差分时域 (FDTD) 实现”,应用计算电磁学杂志,第一卷。25,名词。4,第 303-314 页,2010 年 4 月。

它彻底讨论了 3D 有限差分的计算,尽管涉及电磁学,但您可以从其他领域(例如声学)的阅读中受益。需要注意的是,考虑到讨论涉及到旧的 GPU 架构,因此某些解决方案(例如使用共享内存的重要性)可能会针对较新的(例如,Fermi/Kepler)卡进行修改。

最后,您可以在以下位置找到一些有用的材料

时域有限差分法

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

于 2013-10-01T20:02:05.543 回答
0

我假设您使用全局内存。如果您使用共享或注册内存,操作应该会快得多。

于 2013-10-01T15:10:07.803 回答