CUDA内存分配 - 是否有效

时间:2011-06-07 12:04:06

标签: cuda

这是我的代码。我有很多线程,所以这些线程多次调用此函数。 在这个函数里面我创建了一个数组。这是一个有效的实现?如果不是,请建议我有效的实施。

__device__ float calculate minimum(float *arr)
 {
     float vals[9];      //for each call to this function I am creating this arr
                        // Is it efficient?? Or how can I implement this efficiently?
                        // Do I need to deallocate the memory after using this array?
     for(int i=0;i<9;i++)
         vals[i] = //call some function and assign the values
     float min = findMin(vals);
     return min;
 }

3 个答案:

答案 0 :(得分:4)

该代码中没有“数组创建”。有一个静态声明的数组。此外,标准CUDA编译模型将内联扩展__device__函数,这意味着vals将被编译为本地内存,或者甚至可能在寄存器中。

所有这些都发生在编译时,而不是运行时。

答案 1 :(得分:1)

也许我错过了一些东西,但是根据您发布的代码,您根本不需要临时数组。如果您执行以下操作,您的代码将会更快(

 #include "float.h" // for FLT_MAX

__device__ float calculate minimum(float *arr)
 {
     float minVal = FLT_MAX:
     for(int i=0;i<9;i++)
         thisVal = //call some function and assign the values
         minVal = min(thisVal,minVal);
     return minVal;
 }

如果实际需要数组,以这种方式声明它就没有错(正如许多人所说的那样)。

答案 2 :(得分:1)

关于“浮点数[9]”,这在CUDA中是有效的。对于小尺寸的数组,编译器几乎肯定会直接将所有元素分配到寄存器中。所以“vals [0]”将是一个寄存器,“vals [1]”将是一个寄存器等。

如果编译器开始耗尽寄存器,或者数组大小大于16,则使用本地内存。您不必担心分配/解除分配本地内存,编译器/驱动程序会为您完成所有这些操作。

计算能力2.0及更高版本的设备确实有一个调用堆栈来允许递归之类的事情。例如,您可以使用以下命令将堆栈大小设置为每个线程6KB:

cudaStatus = cudaThreadSetLimit(cudaLimitStackSize, 1024*6);

通常你不需要自己触摸堆栈。即使你在设备函数中放置了大的静态数组,编译器和驱动程序也会看到它们的内容并为你腾出空间。