网络上的大多数教程、指南、书籍和问答似乎都指的是 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 调用。我没有把它放在这里是为了代码的可读性。