运行时环境层
运行过程与结果与NV相同
OpenXLA 可以通过底层库(例如 CUDA Runtime 或 CUDA Driver API)与 GPU 交互,但它不是直接用于设备查询或管理的工具。OpenXLA 的主要作用是为机器学习模型提供跨硬件的优化执行支持。OpenXLA 依赖于 CUDA API 进行设备信息查询。
- 定义了一个宏
CHECK_CUDA
,用于检查 CUDA API 调用是否成功。如果失败,获取错误信息并退出程序。 - 调用
cuInit(0)
初始化 CUDA 驱动程序。必须在所有 CUDA API 调用之前执行。 - 使用
cuDeviceGetCount(&deviceCount)
获取系统中可用的 CUDA 设备数量,并打印出来。 - 使用
cuDeviceGet(&device, i)
获取每个 CUDA 设备的句柄,用于后续查询设备信息。 - 使用
cuDeviceGetName(name, sizeof(name), device)
获取每个设备的名称(例如 GPU 型号)。 - 使用
cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device)
和cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device)
获取设备的计算能力主版本和次版本。 - 使用
cuDeviceTotalMem(&totalMem, device)
获取设备的总内存大小(以字节为单位),并转换为 MB 打印出来。
#include <stdio.h>
#include <cuda.h>
// CUDA 错误检查宏
#define CHECK_CUDA(call) do { \
CUresult result = call; \
if (result != CUDA_SUCCESS) { \
const char *errStr; \
cuGetErrorString(result, &errStr); \
printf("CUDA Error: %s\n", errStr); \
return -1; \
} \
} while (0)
int main() {
// 初始化 CUDA Driver API
CHECK_CUDA(cuInit(0));
// 获取设备数量
int deviceCount = 0;
CHECK_CUDA(cuDeviceGetCount(&deviceCount));
printf("CUDA 设备数量: %d\n", deviceCount);
// 遍历每个设备,获取设备信息
for (int i = 0; i < deviceCount; ++i) {
CUdevice device;
char name[128];
int major = 0, minor = 0;
// 获取设备句柄
CHECK_CUDA(cuDeviceGet(&device, i));
// 获取设备名称
CHECK_CUDA(cuDeviceGetName(name, sizeof(name), device));
// 获取设备的计算能力 (Compute Capability)
CHECK_CUDA(cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device));
CHECK_CUDA(cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device));
// 获取设备的总内存
size_t totalMem = 0;
CHECK_CUDA(cuDeviceTotalMem(&totalMem, device));
printf("设备 %d: %s\n", i, name);
printf(" 计算能力: %d.%d\n", major, minor);
printf(" 总内存: %zu MB\n", totalMem / (1024 * 1024));
}
return 0;
}
结果:
CUDA 设备数量: 1
设备 0: NVIDIA GeForce RTX 4080 SUPER
计算能力: 8.9
总内存: 16072 MB