CUDA代码使两个GPU都;“忙”;

CUDA代码使两个GPU都;“忙”;,cuda,Cuda,我有一台电脑(Windows7x64),上面有两个NvidiaGPU,一台特斯拉和一台Gforce 两者兼备的想法是能够使用特斯拉进行计算,而Gforce用于计算机可能需要的屏幕/openGL内容 但是,每当我运行一些CUDA代码时,我都无法访问web上有webGL的任何内容(使用chrome),因为我的webGL“不可用”(选中accesing)。这仅在运行CUDA代码后发生 我使用的代码由Matlab mex调用,但不使用任何其他Matlab功能,只使用MEXERMSGIDANDTXT和一些

我有一台电脑(Windows7x64),上面有两个NvidiaGPU,一台特斯拉和一台Gforce

两者兼备的想法是能够使用特斯拉进行计算,而Gforce用于计算机可能需要的屏幕/openGL内容

但是,每当我运行一些CUDA代码时,我都无法访问web上有webGL的任何内容(使用chrome),因为我的webGL“不可用”(选中accesing)。这仅在运行CUDA代码后发生

我使用的代码由Matlab mex调用,但不使用任何其他Matlab功能,只使用
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;
    }
}