如何 select 带有 CUDA 的 GPU?
How to select a GPU with CUDA?
我有一台带 2 个 GPU 的计算机;我写了一个 CUDA C 程序,我需要以某种方式告诉它我想 运行 它只在 2 个显卡中的 1 个上;我需要输入什么命令,我应该如何使用它?我相信这与 cudaSetDevice 有某种关系,但我真的不知道如何使用它。
从 documentation of 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;
}
我就是这样遍历所有可用的 GPU (cudaGetDeviceCount
) 寻找第一个计算能力至少为 2.0 的。如果找到这样的设备,那么我使用 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;
}
之后,选择要用于计算的 GPU 的名称,假设它是 "GTX XYZ"
。从您的 main
方法中调用以下方法,多亏了它,所有 CUDA 内核都将在名称为 "GTX XYZ"
的设备上执行。您还应该检查 return 值 - 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;
}
当然,您必须将 desiredDeviceName
变量的值更改为所需的值。
在网上仔细搜索,我发现了这行代码,selectPC中安装的所有设备中具有更多核心的GPU。
int num_devices, device;
cudaGetDeviceCount(&num_devices);
if (num_devices > 1) {
int max_multiprocessors = 0, max_device = 0;
for (device = 0; device < num_devices; device++) {
cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
if (max_multiprocessors < properties.multiProcessorCount) {
max_multiprocessors = properties.multiProcessorCount;
max_device = device;
}
}
cudaSetDevice(max_device);
}
我有一台带 2 个 GPU 的计算机;我写了一个 CUDA C 程序,我需要以某种方式告诉它我想 运行 它只在 2 个显卡中的 1 个上;我需要输入什么命令,我应该如何使用它?我相信这与 cudaSetDevice 有某种关系,但我真的不知道如何使用它。
从 documentation of 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;
}
我就是这样遍历所有可用的 GPU (cudaGetDeviceCount
) 寻找第一个计算能力至少为 2.0 的。如果找到这样的设备,那么我使用 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;
}
之后,选择要用于计算的 GPU 的名称,假设它是 "GTX XYZ"
。从您的 main
方法中调用以下方法,多亏了它,所有 CUDA 内核都将在名称为 "GTX XYZ"
的设备上执行。您还应该检查 return 值 - 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;
}
当然,您必须将 desiredDeviceName
变量的值更改为所需的值。
在网上仔细搜索,我发现了这行代码,selectPC中安装的所有设备中具有更多核心的GPU。
int num_devices, device;
cudaGetDeviceCount(&num_devices);
if (num_devices > 1) {
int max_multiprocessors = 0, max_device = 0;
for (device = 0; device < num_devices; device++) {
cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
if (max_multiprocessors < properties.multiProcessorCount) {
max_multiprocessors = properties.multiProcessorCount;
max_device = device;
}
}
cudaSetDevice(max_device);
}