使用CUDA尽可能快地访问只读全局数组?

时间:2011-11-04 20:36:49

标签: performance memory cuda

我有一个巨大的数组,必须由不同的线程并行读取。每个线程必须从头到尾读取整个阵列中不同位置的不同条目。缓冲区是只读的,所以我认为不需要“关键部分”。

但我担心这种方法的表现非常糟糕。但我没有看到另一种方法。我可以在每个块的共享内存中加载整个数组,但我认为没有足够的共享内存。

有什么想法吗?

编辑:有些人问我为什么要访问数组的不同部分,所以这里有一些解释:我正在尝试实现"auction algorithm"。在一个内核中,每个线程(人)必须对具有价格的项目进行投标,具体取决于其对该项目的兴趣。每个线程都必须检查它对大数组中给定对象的兴趣,但这不是问题,我可以在共享内存中合并读取。问题是当一个线程选择竞标某个项目时,它必须首先检查它的价格,并且由于有许多对象要竞标,我无法将所有这些信息带入共享内存。此外,每个线程都必须访问整个价格缓冲区,因为它们可以对任何对象进行出价。我唯一的优点是缓冲区是只读的。

2 个答案:

答案 0 :(得分:2)

访问全局内存的最快方法是通过合并访问,但在您的情况下,这可能无法实现。您可以调查只读的纹理内存,但通常用于空间2D访问。

Cuda Best practice guide的第3.2节 有关于这种和其他记忆技术的很好的信息。

答案 1 :(得分:1)

与从全局内存中读取相比,从共享内存中读取要快得多。也许你可以将数组的一个子集加载到块中线程所需的共享内存中。如果块中的线程需要来自阵列的大部分不同部分的值,则应该更改算法,因为这会导致非易受访问的速度很慢。

此外,在从共享内存中读取数据时,请注意当两个线程从共享内存中的同一个存储区读取时发生的存储体冲突。纹理内存也可能是一个很好的选择,因为它是缓存的