似乎大多数来自Web的教程,指南,书籍和问答均涉及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(...)
交换时,测试之前的cudaSetDevice()
是否仍然存在。另外,我想知道是否会发生与上下文相关的对象(例如cudaEvent_t
和cudaStream_t
)相同的情况。
我之所以这样问,是因为我有一个这种风格的应用程序,不断出现一些映射错误,如果缺少一些内存泄漏或错误的API使用,我将找不到它。
注意:在我的原始代码中,我确实检查了每个CUDA调用。我没有将其放在此处以提高代码可读性。
这只是错字吗?
for(int d = 0; d < 2; d++) {
cudaSetDevice(0); // shouldn't that be 'd'
cudaMalloc(&dev_x, 1024);
}
请检查所有API调用的返回值!