CUDA和不同全局函数之间的共享变量

CUDA和不同全局函数之间的共享变量,cuda,global-variables,Cuda,Global Variables,只是对库达有点怀疑。也许这些问题看起来很愚蠢;我为此道歉 如果我在GPU上声明一个变量(例如,一个包含N个元素的数组alpha,cudaMalloc((void**)&alpha,N*sizeof(double))),并在一个全局函数中分配它的值,而不释放它的内存,那么这个变量应该可以用于其他连续的全局函数,对吗 此外,是否有可能(或建议)在GPU上计算一个标量变量,并使其在GPU上的多个全局函数之间共享,还是每次都将其作为CPU的参数传递更好 谢谢您的关注。是的,如果您将值写入分配的全局内存中

只是对库达有点怀疑。也许这些问题看起来很愚蠢;我为此道歉

如果我在GPU上声明一个变量(例如,一个包含N个元素的数组alpha,
cudaMalloc((void**)&alpha,N*sizeof(double))
),并在一个全局函数中分配它的值,而不释放它的内存,那么这个变量应该可以用于其他连续的全局函数,对吗

此外,是否有可能(或建议)在GPU上计算一个标量变量,并使其在GPU上的多个全局函数之间共享,还是每次都将其作为CPU的参数传递更好


谢谢您的关注。

是的,如果您将值写入分配的全局内存中,这些值将一直保持,直到您释放该内存为止,即使在内核调用期间也是如此


至于访问标量变量(常数),更好的方法是将其作为参数传递给全局内核启动,而不是将其放在全局内存中并从那里读取。全局内存访问非常昂贵,这样可以避免每次需要读取时都从全局内存加载标量。

如果我没弄错,您将分配一个数组,在GPU上的全局内核函数中填充该数组,然后在另一个内核调用中处理该数组的值

只要不释放分配的数组,其值就保留在全局内存中。因此,您可以这样做并处理相同的阵列,而无需将其复制回CPU。当您有执行时间限制或某个内核函数在库中时,在多个内核调用之间划分作业可能很方便。但在大多数其他情况下,似乎最好在一个函数调用中完成所有工作

似乎最好将标量值作为参数传递,因为从全局内存中读取标量值的开销非常大

如果我在GPU上声明一个变量(例如,一个包含N个元素的数组alpha,cudamaloc((void**)和alpha,N*sizeof(double)),并在不释放内存的情况下在全局函数中分配其值,那么这个变量应该可用于其他连续的全局函数,对吗

不能从全局函数(内核)调用
cudamaloc()
。这是一个主机功能。您可以在内核中使用
malloc()
new
,但这可能效率低下

可以在多个内核中使用同一数组,例如,可以使用不同的内核执行多个计算步骤

此外,是否有可能(或建议)在GPU上计算一个标量变量,并使其在GPU上的多个全局函数之间共享,还是每次都将其作为CPU的参数传递更好

如果将常量作为参数传递给内核,那么它将在所有线程之间高效地共享。因此,在CPU上计算参数并将其传递给内核通常效率更高

如果在创建标量时需要进行大量并行计算,那么最好使用单独的内核进行计算,将其传递回主机,然后将其作为参数传递给下一个内核。替代方案只会增加代码的复杂性,而不会对性能产生任何好处


如果标量几乎不需要计算,那么使用内核计算标量就没有意义。另外,请记住,无法保证在内核中启动块的顺序,因此您必须在内核中创建单独的代码路径来设置标量,然后进行昂贵的线程索引测试和同步,以计算标量并使其可供所有线程使用。

谢谢。关于cudamaloc()的使用,我在我的问题中没有很好地解释,但我是指你说的(即,在GPU的主函数中分配内存空间,而不是在全局函数中分配内存空间)。谢谢你的回答。我无法在GPU上计算所有项目,因为我有一个递归循环。因此,我的目标是在这个循环之外计算GPU上的一些常量数组,而不释放使用的内存,以及CPU上的一些常量标量。然后,在递归循环中,我将尽可能长时间地使用全局函数。内核参数也存储在全局内存中,但它们是通过常量缓存读取的。如果参数是指向数组的指针,那么还可以使用内核参数列表中的
const
限定符通过常量缓存读取数组本身。