从全局内存加载2D数据时CUDA Fortran中的共享内存库冲突
我正在访问全局内存以将数据加载到共享内存中,我想知道是否存在银行冲突。 以下是设置: 在全局内存中:从全局内存加载2D数据时CUDA Fortran中的共享内存库冲突,cuda,gpu-shared-memory,bank-conflict,Cuda,Gpu Shared Memory,Bank Conflict,我正在访问全局内存以将数据加载到共享内存中,我想知道是否存在银行冲突。 以下是设置: 在全局内存中:g_数组。大小为(256,64)的二维矩阵 这就是我将数组数据从全局内存加载到共享内存的方式。 我用gridDim(4,1)和blockDim(16,16)调用内核 我还没有实际运行过你的代码,我的fortran也没有我的c/c++好,但我相信一般来说,你的代码应该结合得很好(在全局内存访问上),并且没有库冲突(在共享内存访问上) 重要的因素是,您已将threadIdx%x索引与快速变化的矩阵下标
g_数组
。大小为(256,64)的二维矩阵
这就是我将数组数据从全局内存加载到共享内存的方式。
我用gridDim(4,1)和blockDim(16,16)调用内核
我还没有实际运行过你的代码,我的fortran也没有我的c/c++好,但我相信一般来说,你的代码应该结合得很好(在全局内存访问上),并且没有库冲突(在共享内存访问上) 重要的因素是,您已将
threadIdx%x
索引与快速变化的矩阵下标相匹配,在fortran中,下标是第一个索引(因为fortran是按列主顺序存储的),而在c/c++中,下标是第二个(或最后一个)索引(因为c/c++矩阵是按行主顺序存储的)
因为除了直接使用线程索引之外,您没有对子脚本执行任何其他操作,所以应该没有问题
一般来说,对于这样的访问,用于实现全局内存合并访问的相同规则也将允许您避免共享内存上的银行冲突 您正在将10个不同的值加载到共享内存中的同一位置。这个密码对我来说没有意义,罗伯特,谢谢。在CUDAC中,检查银行冲突是否发生的一种方法是使用可视化探查器。您可能希望检查Fortran是否也存在类似的可能性。我(幸运的是:-)从几年前就放弃了用Fortran编程,但我认为在2010年我们有过使用PGI Fortran的经验,我们发现转置示例很有用。你可以看看这两份文件,它们讨论了银行冲突的发生,并指出了可能的补救措施。您还可以查看最近讨论同一主题的文档。当然,这个评论只是给罗伯特·克罗维拉已经回答的问题增加了一小部分信息。独立视觉分析器(nvvp)也可以用于PGI Fortran程序。正如@jackolanten所指出的,这将是对我可能说的任何话的有用的双重检查。
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()
.....