1

我应该在 CUDA 中编写一个代码,它在递归循环中计算一个数组。有可能在它之前预先计算这个递归循环的一些中间步骤,即分配一些常量数组和标量,这将避免循环中的一些计算。

第一个想法是将常量数组存储在全局内存中,而标量参数每次都从 CPU 传递到 GPU(如这里建议的:CUDA 和不同全局函数之间的共享变量)。

我想尝试使用 GPU 常量内存,因为它应该更快。但是,我发现的几个示例代码说明了如何从主机分配常量内存。是否可以从 GPU 分配一些常量内存,即在那里计算它的值(就像我们对全局内存所做的那样)?你能提供一个示例代码吗?

编辑:因为我可以分配很多常量数组,所以在这种情况下可能会更好地使用纹理内存。是否有一些关于如何从 GPU 分配内存的示例代码?

4

3 回答 3

2

回答你的第一个问题:'是否可以从 GPU 分配一些常量内存'。简短的回答是肯定的,正如其他人回答的那样,将数据从设备复制到设备常量内存。

从这里开始,您需要考虑访问模式和问题所需的数据量。

对于常量内存,可用内存量为 65536 字节,如果一个 warp 中的所有线程同时访问同一个元素,则广播数据。但是,64KB 的内存是不够的。

纹理内存具有过滤和缓存的 2D 空间局部性等特殊功能。因此,将纹理内存用于 3x3 窗口中的典型过滤器是典型的使用案例。

最后,如果您需要更新数据并在某些内核中使用它们,您可以选择使用全局内存。此外,您可以使用作为读/写纹理内存的表面内存(CUDA C Programming Guire,第 3.2.10.2 章)。

由于您正处于我应该在 CUDA 中编写代码以在递归循环中计算数组的阶段,因此您应该首先尝试全局内存以获得未来改进的基础。当您的内核工作时,您将看到可以以不同的方式重新安排或分配哪些访问,以获得 GPU 内存的最大性能。

最后一点,考虑到新的 Fermi 和 Kepler 架构已经为全局内存访问合并了 L1 和 L2 缓存层次结构,这可以缓解随机访问模式,甚至优于纹理内存,因为 L1/L2 缓存的数量更大。

最后,您可以在 CUDA SDK 中找到大量示例代码。

于 2013-01-28T12:27:38.677 回答
1

正如您在此处所读到的,如果cudaMemcpyToSymbolcudaMemcpyDeviceToDevice标志一起使用,应该可以将数据从 gpu 直接复制到常量内存。但是不可能像编辑全局内存那样编辑常量内存的日期。您只能从中读取。

于 2013-01-28T10:53:04.637 回答
0

可以从主机读取和写入常量内存。您只能从设备中读取常量内存。

于 2013-01-28T10:55:29.243 回答