Fed*_*ile 2 cuda gpu gpu-programming
我有一台带2个GPU的电脑; 我写了一个CUDA C程序,我需要以某种方式告诉它我只想在2张图形卡中的1张上运行它; 我需要键入什么命令以及如何使用它?我相信某种方式与cudaSetDevice有关但我无法真正找到如何使用它.
从文档中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变量的值更改为所需的值.