在攻读学士论文时,其中一部分将是使用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在几秒钟后完全充满。
我希望有人知道答案。 非常感谢, 最大
答案 0 :(得分:1)
好的,我搞砸了每次迭代中清理流。所以对于每个人来说,你需要每次清理流,否则它们会变得非常大。
答案 1 :(得分:0)
您似乎找到了问题的答案。如果您希望能够单独解决此类问题,建议您使用cuda-memcheck
:
http://docs.nvidia.com/cuda/cuda-memcheck/
如果您只进行CPU计算,我建议您使用valgrind
:
使用这两种工具,您可以在执行后知道是否有任何内存泄漏,更重要的是,它们发生在哪里。