Memory CUDA在一条指令中读取128字节

Memory CUDA在一条指令中读取128字节,memory,optimization,cuda,Memory,Optimization,Cuda,我是CUDA的新手,目前正在优化现有的分子动力学应用程序。它所做的是,它将double4数组与坐标结合起来,并根据邻接关系计算力。我用以下几行代码编写了一个内核: double4 mPos=d_arr_xyz[gid]; while(-1!=(id=d_neib_list[gid*MAX_NEIGHBORS+i])){ Calc(gid,mPos,AA,d_arr_xyz,id);i++; } 然后计算取d_arr_xyz[id]并计算力。在每次调用Calc(65是每个粒子在d_neib_列表

我是CUDA的新手,目前正在优化现有的分子动力学应用程序。它所做的是,它将double4数组与坐标结合起来,并根据邻接关系计算力。我用以下几行代码编写了一个内核:

double4 mPos=d_arr_xyz[gid];
while(-1!=(id=d_neib_list[gid*MAX_NEIGHBORS+i])){
Calc(gid,mPos,AA,d_arr_xyz,id);i++;
}
然后计算取d_arr_xyz[id]并计算力。在每次调用Calc(65是每个粒子在d_neib_列表中的平均邻居数(不等于-1))时,给出1次读取double4+65次读取(int+double4)

有可能减少这些读数吗?不同粒子的邻域列表,即d_arr_xyz[gid]和d_arr_xyz[id]不相关,因此我无法使用线程块的共享内存来缓存d_arr_xyz

我看到的是,如果以某种方式在一个或几个大型事务中将整个列表int*MAX_邻居加载到共享内存中,将删除65个单独的int读取

所以问题是:有没有可能将这65次int读取转换成几个大型事务。我在文档中读到,读取长度甚至可以达到128字节。我应该写些什么,这样汇编器才能进行一次大的调用

更新:


谢谢你的回复。根据下面用户技巧的回答,我更改了代码,替换了邻域矩阵的尺寸x和y。现在连续线程加载连续int[gid],我想这可能会导致128字节的读取。该程序的运行速度提高了8%。

所有内存事务(如果可能)都是按每一次扭曲发出的。因此,您所询问的128字节事务是当一个warp中的所有32个线程发出一条内存加载指令时,该指令可以在单个“联合”事务中提供服务。单个线程不能发出大内存事务,只有32个线程的扭曲才能发出,并且只有在运行代码的任何体系结构的内存聚合需求能够得到满足时才能发出


我无法真正理解您对代码实际执行情况的描述,但仅从第一原则来看,答案似乎是否定的。

所有内存事务都是(在可能的情况下)基于每个扭曲发出的。因此,您所询问的128字节事务是当一个warp中的所有32个线程发出一条内存加载指令时,该指令可以在单个“联合”事务中提供服务。单个线程不能发出大内存事务,只有32个线程的扭曲才能发出,并且只有在运行代码的任何体系结构的内存聚合需求能够得到满足时才能发出


我无法真正理解您对代码实际操作的描述,但仅从第一原理来看,答案似乎是否定的。

如果您有
N
粒子和
p
核心,那么,如果每个核心都分配了一些
N/p
粒子,如果将每个粒子的邻域信息存储到共享内存中,可能会保存一些全局内存事务。请看第5节。只要掌握主要概念,并考虑到本文涉及的是一个非常古老的体系结构。如果你有
N
粒子和
P
内核,那么,如果每个内核都分配了一些
N/P
粒子,如果将每个粒子的邻域信息存储到共享内存中,可能会保存一些全局内存事务。请看第5节。只需掌握主要概念,并考虑到本文涉及的是一个非常古老的体系结构。