这是我的代码。我有很多线程,所以这些线程多次调用此函数。 在这个函数里面我创建了一个数组。这是一个有效的实现?如果不是,请建议我有效的实施。
__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;
}
答案 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);
通常你不需要自己触摸堆栈。即使你在设备函数中放置了大的静态数组,编译器和驱动程序也会看到它们的内容并为你腾出空间。