Cuda不同的内存分配

Cuda不同的内存分配,cuda,nvidia,Cuda,Nvidia,我正在使用CUDA开发一个小应用程序。 我有一个巨大的2d数组(不适合共享内存),其中所有块中的线程都将在随机位置不断读取数据。 此2d数组是只读数组。 我应该在哪里分配此2d阵列?全局内存?常量内存?纹理内存?根据设备纹理内存的大小,您应该在此区域实现它。实际上,纹理内存是基于顺序局部缓存机制的。这意味着当连续标识符的线程试图访问相对较近的存储位置内的数据元素时,内存访问会得到优化。 此外,这种局部性在这里是为2D访问实现的。因此,当每个线程到达存储在纹理内存中的数组的数据元素时,就处于连续2

我正在使用CUDA开发一个小应用程序。
我有一个巨大的2d数组(不适合共享内存),其中所有块中的线程都将在随机位置不断读取数据。
此2d数组是只读数组。

我应该在哪里分配此2d阵列?全局内存?常量内存?纹理内存?

根据设备纹理内存的大小,您应该在此区域实现它。实际上,纹理内存是基于顺序局部缓存机制的。这意味着当连续标识符的线程试图访问相对较近的存储位置内的数据元素时,内存访问会得到优化。
此外,这种局部性在这里是为2D访问实现的。因此,当每个线程到达存储在纹理内存中的数组的数据元素时,就处于连续2D访问的情况下。因此,您可以充分利用内存体系结构


不幸的是,这个内存并没有那么大,使用巨大的阵列,您可能可以将数据放入其中。在这种情况下,您无法避免使用全局内存。

如果它足够小,可以容纳常量或纹理,我将尝试所有三种


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

我同意jHackTheRipper,一个简单的解决方案是使用纹理内存,然后使用Compute Visual Profiler进行配置。这里有一个关于图像卷积的不同存储器类型的例子;它表明,良好的共享内存使用和全局读取并不比使用纹理内存快多少。在您的情况下,您应该从texmemory中获得一些联合读取,这是访问全局内存中的随机值通常无法获得的。

问题是具体的。。。“随机地点”。这对缓存来说不是好消息!!是的,但是我们可以很容易地认为将数据放在纹理存储器中是值得的,因为它只需要从缓存中读取设备内存的等价物。因此,即使使用随机访问,您也一定能够访问缓存的元素,并从纹理缓存中获益。很好的幻灯片!同样,取决于所使用的体系结构:例如,非合并访问对计算能力为2.0(费米)的设备上的内存性能影响较小。然而,为计算1.0编写良好优化的代码会产生很好的2.0加速效果我相信您知道,但随机读取并不是应用CUDA的最佳位置。纹理针对空间局部性进行了优化,但如果读取是随机的,则没有空间局部性。基于此,我会选择全球。。。但是,在基于访问模式的CPU实现中,您可能看不到任何速度提升。