CUDA代码使两个GPU“忙”

时间:2015-09-15 09:17:37

标签: cuda

我有一台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可以免费用于计算机?

1 个答案:

答案 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()。)