我有一台PC(Windows 7 x64),上面有2个Nvidia GPU,一个特斯拉和一个Gforce。
让两者兼顾的想法是能够使用特斯拉进行计算,并将Gforce用于计算机可能需要的屏幕/ openGL内容。
但是,每当我运行一些CUDA代码时,我都无法访问Web上的任何WebGL(使用chrome),因为我的webGL“不可用”(已检查访问chrome://gpu/)。这只在运行CUDA代码后发生。
我正在使用的代码由Matlab mex调用,但不使用任何其他Matlab功能,仅使用mexErrMsgIdAndTxt
和其他一些io
代码来包装Matlab和C.
在我的代码中,我有以下代码来选择正确的图形卡:
int deviceCount = 0;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0)
{
mexErrMsgIdAndTxt("CBCT:CUDA:Ax:cudaGetDeviceCount","No CUDA enabled NVIDIA GPUs found");
}
bool found=false;
for (int dev = 0; dev < deviceCount; ++dev)
{
cudaSetDevice(dev);
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (strcmp(deviceProp.name, "Tesla K40c") == 0){
found=true;
break;
}
}
if (!found)
mexErrMsgIdAndTxt("CBCT:CUDA:Ax:cudaDevice","No Tesla K40c found");
当代码结束时我打电话
cudaDeviceReset();
我的印象当然是错误的(当然是错误的),这段代码会确保Gforce免费供PC使用,但不是。
为什么会这样? 我应该在代码中添加什么来确保Gforce可以免费用于计算机?
答案 0 :(得分:2)
这不是您应该添加的内容,而是您应该删除的内容。不要这样做:
for (int dev = 0; dev < deviceCount; ++dev)
{
cudaSetDevice(dev);
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (strcmp(deviceProp.name, "Tesla K40c") == 0){
found=true;
break;
}
}
改为:
for (int dev = 0; dev < deviceCount; ++dev)
{
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (strcmp(deviceProp.name, "Tesla K40c") == 0){
cudaSetDevice(dev);
found=true;
break;
}
}
自CUDA 4.0起,cudaSetDevice()
在设备上建立了上下文。因此,仅仅通过寻找正确的GPU,您实际上是在初始化上下文并使每个设备忙于OpenGL。带走无条件的cudaSetDevice()
,问题就会消失(并且也不需要cudaDeviceReset()
。)