2011-11-04 46 views
3

我有一个巨大的数组,必须由不同的线程并行读取。每个线程必须从整个阵列的不同位置读取不同的条目,从头到尾。该缓冲区是只读的,所以我不认为需要“临界区”。使用CUDA尽可能快地访问只读全局数组?

但是恐怕这种方法的性能很差。但我没有看到其他方式去做。我可以将整个数组加载到每个块的共享内存中,但我认为这没有足够的共享内存。

任何想法?

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

+0

你的应用程序试图计算什么?有可能有另一种方式来以结构化的方式访问数据。 –

+0

你可以在内核中添加一个访问模式的例子吗? – pQB

+0

我编辑的问题更加明确! –

回答

2

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

Cuda Best practice guide 的3.2节有关于这个和其他内存技术的很好的信息。

1

与从全局内存读取相比,从共享内存读取速度要快得多。也许你可以将数组的一个子集加载到块中线程所需的共享内存中。如果块中的线程需要来自阵列的大部分不同部分的值,则应该更改算法,因为这会导致速度慢的非扇区访问。此外,在从共享内存中读取数据时,请注意两个线程在共享内存中从同一个存储区读取时发生的bank冲突。纹理内存也可能是一个不错的选择,因为它被缓存了