【发布时间】:2013-01-28 02:45:20
【问题描述】:
似乎大多数来自网络的教程、指南、书籍和问答都提到了 CUDA 3 和 4.x,所以这就是我专门询问 CUDA 5.0 的原因。问题...
我想为一个有两个 CUDA 设备的环境编程,但只使用一个线程,以简化设计(特别是因为它是一个原型)。我想知道以下代码是否有效:
float *x[2];
float *dev_x[2];
for(int d = 0; d < 2; d++) {
cudaSetDevice(d);
cudaMalloc(&dev_x[d], 1024);
}
for(int repeats = 0; repeats < 100; repeats++) {
for(int d = 0; d < 2; d++) {
cudaSetDevice(d);
cudaMemcpy(dev_x[d],x[d],1024,cudaMemcpyHostToDevice);
some_kernel<<<...>>>(dev_x[d]);
cudaMemcpy(x[d],dev_x[d],1024,cudaMemcpyDeviceToHost);
}
cudaStreamSynchronize(0);
}
我想具体了解测试之前的cudaMalloc(...)s 是否持续存在,即使cudaSetDevice() 的交换发生在同一个线程中。另外,我想知道 cudaEvent_t 和 cudaStream_t 等依赖于上下文的对象是否也会发生同样的情况。
我之所以问它是因为我有一个这种风格的应用程序,它不断出现一些映射错误,如果缺少内存泄漏或错误的 API 使用,我找不到它是什么。
注意:在我的原始代码中,我会检查每个 CUDA 调用。为了代码的可读性,我没有把它放在这里。
【问题讨论】:
-
您不必调用 cudaStreamSynchronize() 因为 cudaMemcpy() 调用是同步的。另外,请注意,在您的循环终止后,设备 1 将是 CPU 线程的当前线程。
标签: c++ memory-management cuda multiple-gpu cuda-context