【问题标题】:Why do my in-kernel dynamic memory allocations fail for larger grid sizes?为什么我的内核动态内存分配对于较大的网格大小会失败?
【发布时间】:2017-11-02 07:27:02
【问题描述】:

我需要在内核函数内部动态分配一些数组。代码如下:

__global__
void kernel3(int N)
{
    int index = blockIdx.x*blockDim.x + threadIdx.x;
    if (index < N)
    {
        float * cost = new float[100];
        for (int i = 0; i < 100; i++)
            cost[i] = 1;
    }
}

int main()
{
    cudaDeviceSynchronize();
    cudaThreadSynchronize();
    size_t mem_tot_01 = 0;
    size_t mem_free_01 = 0;
    cudaMemGetInfo(&mem_free_01, &mem_tot_01);
    cout << "Free memory " << mem_free_01 << endl;
    cout << "Total memory " << mem_tot_01 << endl;
    system("pause");
    int blocksize = 256;
    int aaa = 16000;
    int numBlocks = (aaa + blocksize - 1) / blocksize;
    kernel3 << <numBlocks, blocksize >> >(aaa);
    cudaDeviceSynchronize();
    cudaError_t err1 = cudaGetLastError();
    if (err1 != cudaSuccess)
    {
        printf("Error: %s\n", cudaGetErrorString(err1));
        system("pause");

    }


    cudaMemGetInfo(&mem_free_01, &mem_tot_01);
    cout << "Free memory " << mem_free_01 << endl;
    cout << "Total memory " << mem_tot_01 << endl;
    system("pause");
}

在第一轮cudaMemGetInfo中: 可用内存:3600826368 总内存:4294967297

我得到一个错误: 错误:未指定的启动失败

我尝试将“int aaa”更改为更小的值,它不会出错,但内存信息不等于我分配的值。 它出什么问题了?内存应该够用,16000x100x32=512x10e5

【问题讨论】:

    标签: memory cuda gpgpu


    【解决方案1】:

    new 运算符分配的设备内存来自固定大小的运行时堆。

    如果您的代码需要大量运行时堆内存,您可能需要在运行任何内核之前增加堆的大小。 NVIDIA 为此提供了cudaDeviceSetLimit API,它与cudaLimitMallocHeapSize 标志一起使用来设置堆的大小。

    【讨论】:

    • 一个很好的答案,但我相信你只是在帮助 OP 修理他们用来射击自己脚的枪。
    • @einpoklum:Stack Overflow 的存在是为了回答问题,而不是进行社论。问题是为什么在使用内核内存分配时会出现内存耗尽。这就是我的回答。
    • 这就是我支持你的原因(在你写评论之前)。尽管如此,OP 并没有只问标题中出现的一般问题——他/她询问了他/她遇到问题的特定程序。所以这至少部分是一个 XY 问题。另外,如果不是因为方法不正确,他/她不会遇到堆大小限制。
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2019-04-26
    • 2020-10-25
    • 2020-11-23
    • 1970-01-01
    • 2014-01-11
    • 2016-05-14
    • 2022-08-18
    相关资源
    最近更新 更多