【问题标题】:cuda, dynamic memory allocation in kernel memory imprint?cuda,内核内存印记中的动态内存分配?
【发布时间】: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 failurecuda-memcheck 仍然给出 0 个错误。我做了一些实验。当我评论其中一个MyLongArray2[i]=calculation_result2; 时,代码再次起作用。当我将array_size 设为前一种情况的一半时,我可以将核心数增加 2 倍。看起来动态分配需要更多的内存?我在 3Gb 内存的 fermi 上,所以我的数组应该适合全局内存。

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

【问题讨论】:

  • 如果设备newmalloc 失败,它将返回一个NULL 指针。所以很容易测试成功/失败。如果失败,最可能的原因会在发布的答案中给出。设备堆默认为 8MB,所以不是很大。

标签: c memory-management cuda gpu gpgpu


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2011-10-19
    • 2012-04-06
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2010-09-21
    相关资源
    最近更新 更多