2010-12-07 50 views
2

我正在开发一个使用CUDA的小应用程序。
我有一个巨大的2D数组(不适合共享内存),其中所有块中的线程都会从随机位置不断读取。
这个2d数组是一个只读数组。
我应该在哪里分配这个2d数组?全局内存?常量memroy?纹理内存?Cuda不同的内存分配

+0

我确定你知道,但随机读取不是应用CUDA的最佳位置。纹理针对空间局部进行了优化,但如果您的阅读是随机的,则没有空间局部性。基于这一点,我会与全球...但你可能看不到任何基于访问模式的CPU执行速度增加。 – Marm0t 2010-12-09 22:33:19

回答

2

根据设备纹理内存的大小,您应该在该区域实现它。事实上,纹理内存是基于顺序局部高速缓存机制。这意味着,当连续标识符的线程尝试到达相对靠近的存储位置内的数据元素时,内存访问得到优化。此外,本地实现2D访问。因此,当每个线程到达存储在纹理存储器中的数组的数据元素时,就会遇到连续的2D访问。因此,您充分利用了内存架构。

不幸的是,这个内存并不是那么大,而且有着巨大的数组,你可能会使你的数据适合它。在这种情况下,您无法避免使用全局内存。

+0

这个问题是具体的......“随机的地方”。这对缓存来说不是好消息! – jmilloy 2010-12-09 05:03:26

+0

没错,但是我们可以很容易地认为将数据放置在纹理内存中是值得的,因为它只需要在缓存未命中时花费相当于从设备内存中读取数据!因此,即使随机访问,您肯定会到达缓存元素并从纹理缓存中受益。 – jopasserat 2010-12-09 08:47:17

0

如果它足够小以适应它的不变或纹理,我会尝试所有三种。

这里没有列出的一个有趣的选项是映射主机上的内存。您可以在可从设备访问的主机上分配内存,而无需将其显式传输到设备内存。根据您需要访问的数组量,它可能比复制到全局内存和从那里读取更快。

1

我同意jHackTheRipper,一个简单的解决方案是使用纹理内存,然后使用Compute Visual Profiler进行配置文件。下面是关于图像卷积的不同存储器类型的good set of slides from NVIDIA;它表明良好的共享内存使用率和全局读取速度并不比使用纹理内存快得多。在你的情况下,你应该从texmemory中获得一些你在访问全局内存中的随机值时通常不会获得的联合读取。