1

我正在访问全局内存以将数据加载到共享内存,并想知道是否存在银行冲突。这是设置:

在全局内存中:g_array. 大小为 (256, 64) 的二维矩阵

这就是我将数组数据从全局内存加载到共享内存的方式。我用 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()
.....
4

1 回答 1

2

我实际上并没有运行你的代码,而且我的 fortran 不如我的 c/c++ 好,但我相信一般来说你的代码应该很好地合并(在全局内存访问上)并且没有银行冲突(在共享内存访问上)。

重要的因素是您已将threadIdx%x索引与快速变化的矩阵下标匹配,在 fortran 中是第一个索引(因为 fortran 以列优先顺序存储),而在 c/c++ 中它是第二个(或最后一个)索引(因为 c/c++ 矩阵以行优先顺序存储)。

由于除了直接使用线程索引之外,您没有对 subsripts 做任何其他事情,所以应该没有问题。

一般来说,通过这样的访问,用于实现全局内存合并访问的相同规则也将允许您避免共享内存上的银行冲突。

于 2013-09-07T19:56:34.700 回答