首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与CUDA合并对2d数组的内存访问

与CUDA合并对2d数组的内存访问
EN

Stack Overflow用户
提问于 2015-03-01 00:38:42
回答 2查看 767关注 0票数 0

我正在编写一段CUDA C++代码,并需要每个线程从本质上通过行主和列主访问全局内存中的2D数组。具体来说,我需要每个线程块来:

  • 生成它自己的一维数组(比如说,元素的gridDim #)
  • 把这些写到全局内存中
  • 读取每个写入数组的第n个元素,其中n为块ID.

在我看来,只有写或读可以合并,另一个可以为每个元素访问单独的缓存行(并且执行得非常糟糕)。我读过纹理内存有一个二维缓存机制,但不知道它是否可以用来改善这种情况。

顺便说一下,我使用的是GTX 770,所以它是一个具有计算能力3.0的GK104开普勒卡。

任何帮助或建议都将不胜感激!谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-05 23:18:52

事实证明,我的算法本身必须重新工作,因为无法避免使用上述方法进行的非合并操作对性能的影响。相反,我能够合并每个块上的值,并且使用的全局内存要少得多。

顺便提一句,我做了一些合并和非合并操作的实验,以确定它会导致多大程度的减速。结果表明,非合并读比合并读慢约10倍,而非合并写入则慢约15倍。所以我想非合并阅读是两种罪恶中较小的一种.

票数 1
EN

Stack Overflow用户

发布于 2015-03-01 17:47:54

在这样的情况下,在每种访问模式之间进行转置操作是值得的,以便将数据按最佳顺序排列。转置本身可以写成使用SMEM,因此它的读和写结合在一起。

请参阅:CUDA.pdf

或者(克里斯蒂安在他的评论中提到),如果您能够使您的次优传递做一些类似于SMEM转置作为它的第一步,您可以跳过完整的转置,只需使用它的概念来优化它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28788728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档