【发布时间】:2012-10-23 05:44:19
【问题描述】:
我对 CUDA 中最方便的全局和共享内存访问布局有一些疑问。
全局记忆
1) 以下内存地址(0,0)、(0,1)、(1,0)和(1,1)在CPU内存和GPU内存中是如何排列的?换句话说,它们的存储顺序是什么?
2) (m, n) 中哪个是行索引,哪个是列索引?
3) 全局内存合并是通过按列主序还是行主序访问元素实现的?
共享内存
1) 银行冲突如何产生或不产生?请使用示例/案例告诉我。
2) 在64K 中配置共享内存和 L1 的命令是什么?该命令在哪里?
【问题讨论】:
-
每个问题一个问题请:stackoverflow.com/faq
-
好的,但实际上我正在缩小对问题的具体描述,所有这些都是概念的子问题;所以想这样写..
-
对于C中的二维数组:第一个索引是行索引,第二个索引是列索引。相邻列中的元素存储在内存中的相邻位置。对于 CUDA 中的二维线程数组,x 中的相邻线程将被分组到 warp 中。因此,为了实现合并访问,我们可能希望以 C[threadIdx.y][threadIdx.x] 或类似的形式访问二维数组。有关多维示例,请参阅我在this SO question 中发布的第一个示例。它应该合并。
-
对于共享内存,您可能对this webinar 或here 的幻灯片35-44 感兴趣。对于共享内存配置命令,请参阅 C 编程指南的计算架构部分(例如:CC2.0)。实际的cuda运行时函数是cudaFuncSetCacheConfig,你也可以google一下。
-
共享内存的文档在 CUDA C 编程指南中。计算能力部分的链接2.x 和3.x 设备。 CUDA Shared Memory 网络研讨会也可能会有所帮助。
标签: cuda