运行时环境层

运行过程与结果与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