我正在访问全局内存以将数据加载到共享内存,并想知道是否存在库冲突。这是设置:
在全局内存中:g_array
.大小为 (256, 64) 的 2D 矩阵
这就是我将数组数据从全局内存加载到共享内存的方式。我用gridDim(4,1)和blockDim(16,16)调用内核。
d_j = (blockIdx%x-1) * blockDim%x + threadIdx%x-1
d_l = (blockIdx%y-1) * blockDim%y + threadIdx%y-1
tIdx = threadIdx%x -1
tIdy = threadIdx%y -1
real, shared :: s_array(0:15,0:15)
s_array(tIdx,tIdy) = g_array(d_j,d_l)
doSomthingwithMySharedMemoryData()
.....
我实际上还没有运行过你的代码,我的 fortran 不如我的 c/c++,但我相信一般来说,你的代码应该很好地合并(在全局内存访问上)并且没有银行冲突(在共享 mem 访问上)。
重要的因素是,您已将threadIdx%x
索引与快速变化的矩阵下标匹配,在 fortran 中,矩阵下标是第一个索引(因为 fortran 按列主顺序存储),而在 c/c++ 中,它是第二个(或最后一个)索引(因为 c/c++ 矩阵按行主顺序存储)。
由于除了直接使用线程索引之外,您没有对子服务器执行任何其他操作,因此应该没有问题。
通常,对于这样的访问,用于实现全局内存合并访问的相同规则也将允许您避免共享内存上的库冲突。