我应该在CUDA中编写一个代码,用于在递归循环中计算数组。有可能在它之前预先计算这个递归循环的一些中间步骤,即分配一些常量数组和标量,这将避免循环中的某些计算。
第一个想法是将常量数组存储在全局内存中,而标量参数每次都从CPU传递到GPU(如下所示:CUDA and shared variables among different global functions)。
我想尝试使用GPU常量内存,因为它应该更快。但是,我发现的几个示例代码说明了如何从主机分配常量内存。是否有可能从GPU中分配一些常量内存,即计算其值(就像我们对全局内存一样)?你能提供一个示例代码吗?
编辑:因为我可以分配很多常量数组,所以在这种情况下可能更好地使用纹理内存。是否有一些关于如何从GPU分配内存的示例代码?
答案 0 :(得分: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中找到大量示例代码。
答案 1 :(得分:1)
正如您可以阅读here一样,如果您使用带有cudaMemcpyToSymbol
标志的cudaMemcpyDeviceToDevice
,则应该可以将数据从gpu直接复制到常量内存。
但是不可能像对待全局记忆那样编辑常量memeroy的日期。你只能从中读取。
答案 2 :(得分:0)
可以从主机读取和写入常量内存。你只能从设备中读取常量内存。