我正在访问全局内存以将数据加载到共享内存,并想知道是否存在银行冲突。 这是设置:
在全球记忆中: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()
.....
答案 0 :(得分:2)
我实际上没有运行你的代码,我的fortran不如我的c / c ++,但我相信一般来说你的代码应该很好地融合(在全局内存访问上)并且没有银行冲突(在共享内存中)访问)。
重要的因素是你已经将threadIdx%x
索引与快速变化的矩阵下标匹配,其中fortran是第一个索引(因为fortran以列主要顺序存储)而在c / c ++中它是第二个(或最后一个)索引(因为c / c ++矩阵以行主要顺序存储)。
由于除了直接使用线程索引之外你没有使用子指令做任何其他事情,所以应该没有问题。
通常,对于这样的访问,用于实现全局内存合并访问的相同规则也可以避免共享内存上的库冲突。