我的内核中有动态内存分配:
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 failure
。 cuda-memcheck
仍会给出0错误。我做了一些实验。当我评论其中一个MyLongArray2[i]=calculation_result2;
时,代码再次起作用。当我将前一个案例的array_size
一半时,我可以将核心数增加2倍。看起来动态分配需要更多内存?我使用的是3Gb内存,因此我的数组应该适合全局内存。
在这种情况下可能的解决方案是什么?我应该避免为CUDA应用程序分配动态内存吗?
答案 0 :(得分:3)
很可能,您的设备超出了堆的大小。您可以使用cuda API调用来解决此问题。
cudaDeviceSetLimit(cudaLimitMallocHeapSize, n*100000*sizeof(float));
确保在任何内核调用之前执行此操作。话虽如此,你应该强烈考虑使用cudaMalloc一次分配一个大型数组,而不是这样做。