CUDA中,本地内存比共享内存慢吗?

16

我只发现一条注释,说本地内存比寄存器内存慢,每个线程两种类型。

共享内存应该很快,但它比线程的本地内存更快吗?

我想做的是一种中位数滤波器,但使用给定的百分位数而不是中位数。因此,我需要取出列表的块,对它们进行排序,然后选择一个合适的块。但如果我开始对共享内存列表进行排序,事情就会出错。如果只是复制到本地内存,我会失去很多性能吗?


这与编程关系不太大,是吗?我也没有看到与Mathematica标签之间有强烈的联系。 - Sjoerd C. de Vries
9
@Sjoerd C. de Vries:在CUDA的上下文中,这是一个与编程有关的问题 - 架构具有非均匀内存空间,程序员必须明确选择在写入任何代码时应使用哪种内存类型和访问方法。这是CUDA编程的基本原则。 - talonmies
@talonmies 我明白这一点,但是这个问题并不涉及编程选择内存、API差异、编程寄存器与编程共享内存等方面。它基本上是关于哪种内存类型更快的硬件问题。我认为OP应该重新表述问题,例如朝着使用CUDA中的共享内存查找数据的某个百分位数的问题方向。 - Sjoerd C. de Vries
好的,我正在使用Mathematica的优秀CUDALink功能进行此操作,它允许您直接将CUDA代码编写到Mathematica中。虽然这是Mathematica经常用于的任务,但当然可以做到。 - JohnKay
1个回答

25

本地内存就是线程本地的全局内存。无论是带宽还是延迟,都比寄存器或共享内存慢得多。它还会消耗本应用于全局内存事务的内存控制器带宽。溢出或故意使用本地内存的性能影响可能从轻微到严重不等,具体取决于您使用的硬件和本地内存的使用方式。

根据Vasily Volkov的研究 - 见在更低的占用率下获得更好的性能 (pdf) -- 在Fermi GPU上,共享内存和寄存器之间的有效带宽存在大约8倍的差异(共享内存约1000 Gb/s,寄存器约8000 Gb/s)。这在某种程度上与CUDA文档相矛盾,后者暗示共享内存的速度与寄存器相当。


是的,谢谢talonmies。进一步阐述我的实验结果支持这个信息:对于我的问题,在本地内存中工作确实慢了几个数量级。由于我的程序已经在硬件共享内存大小的极限上运行,每个块我不能使用共享内存进行重新计算,所以我不得不使用一些不太聪明的寄存器内存算法来查找我的百分位数,但这种方法最终证明还是相当快的。 - JohnKay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接