【发布时间】:2014-06-10 13:50:59
【问题描述】:
我的内核中有一个动态内存分配:
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 内存的 fermi 上,所以我的数组应该适合全局内存。
在这种情况下可能的解决方案是什么?我应该避免为 CUDA 应用程序分配动态内存吗?
【问题讨论】:
-
如果设备
new或malloc失败,它将返回一个NULL 指针。所以很容易测试成功/失败。如果失败,最可能的原因会在发布的答案中给出。设备堆默认为 8MB,所以不是很大。
标签: c memory-management cuda gpu gpgpu