运行时环境层

实现了使用 OpenACC 和 CUDA Runtime API 的 C 程序,用于获取和打印 CUDA 设备的信息。

这段代码的主要功能和要点如下:

  • CUDA 设备数量获取:通过 acc_get_num_devices 获取系统中可用的 NVIDIA CUDA 设备数量,并打印出来。
  • 设备属性查询:循环遍历每个设备,使用 cudaGetDeviceProperties 获取设备名称、计算能力和全局内存大小。
  • 错误处理:使用 cudaCheckError 宏简化了对 CUDA 函数调用的错误检查。
  • CUDA 驱动版本获取:通过 cudaDriverGetVersion 获取当前 CUDA 驱动的版本信息并打印。
#include <stdio.h>
#include <openacc.h>
#include <cuda_runtime.h>

// CUDA 错误检查宏
#define cudaCheckError(call)                                                    \
    {                                                                           \
        cudaError_t cudaStatus = call;                                          \
        if (cudaStatus != cudaSuccess) {                                        \
            fprintf(stderr, "CUDA Error: %s at line %d\n",                      \
                    cudaGetErrorString(cudaStatus), __LINE__);                  \
            exit(cudaStatus);                                                   \
        }                                                                       \
    }

int main() {
    int num_devices = acc_get_num_devices(acc_device_nvidia);
    printf("Total CUDA devices found: %d\n", num_devices);

    for (int device_id = 0; device_id < num_devices; device_id++) {
        acc_set_device_num(device_id, acc_device_nvidia);

        // 使用 CUDA Runtime API 获取设备信息
        cudaDeviceProp deviceProp;
        cudaCheckError(cudaGetDeviceProperties(&deviceProp, device_id));

        printf("\nDevice %d: %s\n", device_id, deviceProp.name);
        printf("  Compute capability: %d.%d\n", deviceProp.major, deviceProp.minor);
        printf("  Total global memory: %.2f GB\n", (float)deviceProp.totalGlobalMem / (1024 * 1024 * 1024));
    }

    // 获取 CUDA 驱动版本
    int driver_version = 0;
    cudaCheckError(cudaDriverGetVersion(&driver_version));
    printf("\nCUDA Driver version: %d\n", driver_version / 1000);

    return 0;
}

结果:

Total CUDA devices found: 1

Device 0: NVIDIA GeForce RTX 4080 SUPER
  Compute capability: 8.9
  Total global memory: 15.70 GB

CUDA Driver version: 12