系统软件层

编写了一个使用 CUDA Driver API 的程序,列出系统中可用的 CUDA 设备,获取设备的名称、计算能力、驱动版本和全局内存大小,并创建和销毁 CUDA 上下文。

  • 初始化 CUDA 驱动

  • 获取可用 CUDA 设备的数量,并循环遍历每个设备

  • 使用 cuDeviceGetName、cuDeviceGetAttribute 、cuDeviceTotalMem和cuDriverGetVersion 获取设备的详细信息

  • 创建 CUDA 上下文并设置为当前上下文

  • 输出设备信息,并在结束时销毁上下文

    示例代码:

#include <iostream>
#include <cuda.h>

// Check the return value of CUDA functions and print error message on failure
void checkCudaErrors(CUresult result) {
    if (result != CUDA_SUCCESS) {
        const char *errorStr;
        cuGetErrorString(result, &errorStr); 
        std::cerr << "CUDA Error: " << errorStr << std::endl;
        exit(EXIT_FAILURE); 
    }
}

// Print information about a CUDA device
void printDeviceInfo(CUdevice device) {
    int driverVersion = 0;
    char deviceName[256];
    // Get device name
    checkCudaErrors(cuDeviceGetName(deviceName, sizeof(deviceName), device));
    
    int computeCapabilityMajor, computeCapabilityMinor;
    // Get the major and minor version of compute capability
    checkCudaErrors(cuDeviceGetAttribute(&computeCapabilityMajor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device));
    checkCudaErrors(cuDeviceGetAttribute(&computeCapabilityMinor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device));

    size_t totalGlobalMem;
    checkCudaErrors(cuDeviceTotalMem(&totalGlobalMem, device)); 
    checkCudaErrors(cuDriverGetVersion(&driverVersion));

    // Print device details
    std::cout << "Device Name: " << deviceName << std::endl;
    std::cout << "Compute Capability: " << computeCapabilityMajor << "." << computeCapabilityMinor << std::endl;
    std::cout << "CUDA Driver Version: " << driverVersion / 1000 << "." << (driverVersion % 100) / 10 << std::endl;
    std::cout << "Total Global Memory: " << totalGlobalMem / (1024 * 1024) << " MB" << std::endl; 
}

int main() {
    // Initialize CUDA
    checkCudaErrors(cuInit(0)); 

    // Get the number of available CUDA devices
    int deviceCount;
    checkCudaErrors(cuDeviceGetCount(&deviceCount)); 
    std::cout << "Number of CUDA Devices: " << deviceCount << std::endl; 

    CUdevice device; 
    // Iterate through each device and print its information
    for (int i = 0; i < deviceCount; i++) {
        checkCudaErrors(cuDeviceGet(&device, i));
        printDeviceInfo(device);
        std::cout << std::endl;
    }

    CUcontext context;
    // Create a CUDA context and set it as the current context
    checkCudaErrors(cuCtxCreate(&context, 0, deviceCount > 0 ? device : 0)); 
    checkCudaErrors(cuCtxSetCurrent(context));

    std::cout << "CUDA context created successfully." << std::endl; 

    checkCudaErrors(cuCtxDestroy(context)); 

    return 0; 
}

结果:

Number of CUDA Devices: 1
Device Name: NVIDIA GeForce RTX 4080 SUPER
Compute Capability: 8.9
CUDA Driver Version: 12.4
Total Global Memory: 16072 MB

CUDA context created successfully.