CUDA正在采用越来越多的VRAM

时间:2018-01-26 12:57:54

标签: c++ cuda

在攻读学士论文时,其中一部分将是使用CUDA实现算法。我在阅读了NVIDIA提供的CUDA文档指南后,开始这样做了。

最终的程序应该在运行数小时的模拟中运行。现在,如果我启动我的程序主要包含一个调用CUDA函数的for循环,似乎for循环将执行的迭代越多,CUDA函数所花费的VRAM就越多。 我完全不知道为什么,希望你能做到。

守则的某些部分: main.cpp中:

for (int i = 0; i < 100000; ++i) {
    auto t1 = std::chrono::steady_clock::now();
    copy_sm(&information, cpu_info.first);
    update_gpu(cpu_info.first, cpu_info.second, 4);
    copy_sm(cpu_info.first, &information);
    auto t2 = std::chrono::steady_clock::now();
    auto dur = std::chrono::duration<double>(t2 - t1);
    dur_all += dur;
}

kernel.cu:

int update_gpu(entity_cdb_cpu *information, entity_cdb_cpu *d_info, int noStreams) {
    cudaStream_t* streams = create_streams(noStreams);
    dim3 blocksize(16, 16);
    dim3 numBlocks(96, 96);
    int N = 8*940*940;
    int streamSize = N/noStreams;
    int streamBytes = streamSize * sizeof(float);

    for (int i = 0; i < noStreams; ++i) {
        int offset = streamSize * i;
        cudaMemcpyAsync(&d_info[offset], &information[offset], streamBytes, cudaMemcpyHostToDevice, streams[i]);
    }
    for (int i = 0; i < noStreams; ++i) {
        int offset = streamSize * i;
        update<<<numBlocks, blocksize, 0, streams[i]>>>(d_info, offset);
    }
    for (int i = 0; i < noStreams; ++i) {
        int offset = streamSize * i;
        cudaMemcpyAsync(&information[offset], &d_info[offset], streamBytes, cudaMemcpyDeviceToHost, streams[i]);
    }
    for (int i = 0; i < noStreams; ++i)
        cudaStreamSynchronize(streams[i]);
    cudaDeviceSynchronize();
}

基本上,代码适用于包含8x 940 * 940浮点矩阵的结构。 目前,我正在使用流来传输数据并同时执行内核。

我的GPU目前是配备2GB VRAM的NVIDIA Quadro K620。这不会是我将要使用的最终GPU,但对于测试它应该没问题。

当我使用100或1000或甚至10000次迭代运行for循环时,GPU有足够的VRAM可供使用,但是当以100000次迭代开始时,2GB VRAM在几秒钟后完全充满。

我希望有人知道答案。 非常感谢, 最大

2 个答案:

答案 0 :(得分:1)

好的,我搞砸了每次迭代中清理流。所以对于每个人来说,你需要每次清理流,否则它们会变得非常大。

答案 1 :(得分:0)

您似乎找到了问题的答案。如果您希望能够单独解决此类问题,建议您使用cuda-memcheck

http://docs.nvidia.com/cuda/cuda-memcheck/

如果您只进行CPU计算,我建议您使用valgrind

http://valgrind.org/

使用这两种工具,您可以在执行后知道是否有任何内存泄漏,更重要的是,它们发生在哪里。