CUDA代码使两个GPU都;“忙”;
我有一台电脑(Windows7x64),上面有两个NvidiaGPU,一台特斯拉和一台Gforce 两者兼备的想法是能够使用特斯拉进行计算,而Gforce用于计算机可能需要的屏幕/openGL内容 但是,每当我运行一些CUDA代码时,我都无法访问web上有webGL的任何内容(使用chrome),因为我的webGL“不可用”(选中accesing)。这仅在运行CUDA代码后发生 我使用的代码由Matlab mex调用,但不使用任何其他Matlab功能,只使用CUDA代码使两个GPU都;“忙”;,cuda,Cuda,我有一台电脑(Windows7x64),上面有两个NvidiaGPU,一台特斯拉和一台Gforce 两者兼备的想法是能够使用特斯拉进行计算,而Gforce用于计算机可能需要的屏幕/openGL内容 但是,每当我运行一些CUDA代码时,我都无法访问web上有webGL的任何内容(使用chrome),因为我的webGL“不可用”(选中accesing)。这仅在运行CUDA代码后发生 我使用的代码由Matlab mex调用,但不使用任何其他Matlab功能,只使用MEXERMSGIDANDTXT和一些
MEXERMSGIDANDTXT
和一些其他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");
我的印象是(当然是错误的),这段代码可以确保Gforce可以免费供PC使用,但事实并非如此
为什么会这样?
我应该在代码中添加什么来确保Gforce可以免费用于计算机?这不是你应该添加的,而是你应该删除的。不要这样做:
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
改为这样做:
for (int dev = 0; dev < deviceCount; ++dev)
{
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (strcmp(deviceProp.name, "Tesla K40c") == 0){
cudaSetDevice(dev);
found=true;
break;
}
}
for(int-dev=0;dev
由于CUDA 4.0,
cudaSetDevice()
在设备上建立上下文。因此,仅仅通过寻找正确的GPU,您实际上正在初始化一个上下文,并使每个设备都忙于OpenGL。去掉无条件的cudaSetDevice()
,问题就会消失(而且也不需要cudadeviceSet()
。事实上,就这么简单!值得注意的是,我从cudaSamples中截取了这段代码。他们也应该听从你的建议!公平地说,cudaDeviceReset
的功能可能随着时间的推移略有变化。文档有点暗示它应该销毁并弹出设备上的上下文,但可能不是这样。重要的一点是,CudaGetDeviceProperty
不(也从来没有)需要上下文才能工作,而且建立上下文然后尝试销毁它(如果不需要)似乎是一个相当糟糕的设计选择,而另一种选择是完全跳过上下文的建立。谢谢!很高兴知道。实际上,在不需要时设置device()是一个可怕的设计选择。谢谢你的提示;)您具体指的是哪一个cuda样本?
for (int dev = 0; dev < deviceCount; ++dev)
{
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (strcmp(deviceProp.name, "Tesla K40c") == 0){
cudaSetDevice(dev);
found=true;
break;
}
}