如何用CUDA选择GPU?

Fed*_*ile 2 cuda gpu gpu-programming

我有一台带2个GPU的电脑; 我写了一个CUDA C程序,我需要以某种方式告诉它我只想在2张图形卡中的1张上运行它; 我需要键入什么命令以及如何使用它?我相信某种方式与cudaSetDevice有关但我无法真正找到如何使用它.

Mic*_*ala 8

文档中cudaSetDevice可以清楚地看出,但是让我提供以下代码片段.

bool IsGpuAvailable()
{
    int devicesCount;
    cudaGetDeviceCount(&devicesCount);
    for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
    {
        cudaDeviceProp deviceProperties;
        cudaGetDeviceProperties(&deviceProperties, deviceIndex);
        if (deviceProperties.major >= 2
            && deviceProperties.minor >= 0)
        {
            cudaSetDevice(deviceIndex);
            return true;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这就是我遍历所有可用GPU(cudaGetDeviceCount)寻找至少2.0的第一个Compute Capability的方法.如果找到这样的设备,那么我使用了cudaSetDevice所有CUDA计算都在该特定设备上执行.如果不执行cudaSetDevice你的CUDA应用程序将在第一个GPU上执行,即具有deviceIndex == 0哪个特定GPU的那个应用程序取决于哪个GPU在哪个PCIe插槽中.

编辑:

在评论中澄清您的问题后,在我看来,它应该适合您根据其名称选择设备.如果您不确定实际的GPU名称,请运行此代码,将所有GPU的名称打印到控制台:

int devicesCount;
cudaGetDeviceCount(&devicesCount);
for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
{
    cudaDeviceProp deviceProperties;
    cudaGetDeviceProperties(&deviceProperties, deviceIndex);
    cout << deviceProperties.name << endl;
}
Run Code Online (Sandbox Code Playgroud)

之后,选择要用于计算的GPU的名称,让我们说它是"GTX XYZ".从您的main方法调用以下方法,由于它,所有CUDA内核将在具有名称的设备上执行"GTX XYZ".您还应检查返回值 - true如果找到具有此名称的设备,false否则:

bool SetGPU()
{
    int devicesCount;
    cudaGetDeviceCount(&devicesCount);
    string desiredDeviceName = "GTX XYZ";
    for(int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex)
    {
        cudaDeviceProp deviceProperties;
        cudaGetDeviceProperties(&deviceProperties, deviceIndex);
        if (deviceProperties.name == desiredDeviceName)
        {
            cudaSetDevice(deviceIndex);
            return true;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

当然,您必须将desiredDeviceName变量的值更改为所需的值.