cuda,内核内存中的动态内存分配印记?

时间:2014-04-25 02:18:15

标签: c memory-management cuda gpu gpgpu

我的内核中有动态内存分配:

float MyLongArray1 = new float [array_size]
float MyLongArray2 = new float [array_size]

where array_size取自内核调用。 array_size大约为100000,非常高。

内存分配似乎运行良好。然后我尝试用两个数组做一些事情

for(int i=0; i<array_size; i++)
{
    for(int j=0; j<array_size; j++)
    {
          do some calculations;
    }
    MyLongArray1[i]=calculation_result1;
    MyLongArray2[i]=calculation_result2;
}

我编写的代码在1个内核和最多15个内核上运行良好。但是,当我执行16个核心时,我得到GPUassert: unspecified launch failurecuda-memcheck仍会给出0错误。我做了一些实验。当我评论其中一个MyLongArray2[i]=calculation_result2;时,代码再次起作用。当我将前一个案例的array_size一半时,我可以将核心数增加2倍。看起来动态分配需要更多内存?我使用的是3Gb内存,因此我的数组应该适合全局内存。

在这种情况下可能的解决方案是什么?我应该避免为CUDA应用程序分配动态内存吗?

1 个答案:

答案 0 :(得分:3)

很可能,您的设备超出了堆的大小。您可以使用cuda API调用来解决此问题。

cudaDeviceSetLimit(cudaLimitMallocHeapSize, n*100000*sizeof(float));

确保在任何内核调用之前执行此操作。话虽如此,你应该强烈考虑使用cudaMalloc一次分配一个大型数组,而不是这样做。