我正在编写一段CUDA C++代码,并需要每个线程从本质上通过行主和列主访问全局内存中的2D数组。具体来说,我需要每个线程块来:
在我看来,只有写或读可以合并,另一个可以为每个元素访问单独的缓存行(并且执行得非常糟糕)。我读过纹理内存有一个二维缓存机制,但不知道它是否可以用来改善这种情况。
顺便说一下,我使用的是GTX 770,所以它是一个具有计算能力3.0的GK104开普勒卡。
任何帮助或建议都将不胜感激!谢谢。
发布于 2015-03-05 23:18:52
事实证明,我的算法本身必须重新工作,因为无法避免使用上述方法进行的非合并操作对性能的影响。相反,我能够合并每个块上的值,并且使用的全局内存要少得多。
顺便提一句,我做了一些合并和非合并操作的实验,以确定它会导致多大程度的减速。结果表明,非合并读比合并读慢约10倍,而非合并写入则慢约15倍。所以我想非合并阅读是两种罪恶中较小的一种.
发布于 2015-03-01 17:47:54
在这样的情况下,在每种访问模式之间进行转置操作是值得的,以便将数据按最佳顺序排列。转置本身可以写成使用SMEM,因此它的读和写结合在一起。
请参阅:CUDA.pdf
或者(克里斯蒂安在他的评论中提到),如果您能够使您的次优传递做一些类似于SMEM转置作为它的第一步,您可以跳过完整的转置,只需使用它的概念来优化它。
https://stackoverflow.com/questions/28788728
复制相似问题