系统软件层

该程序使用OpenCL API 列出了系统中所有可用的 NVIDIA 设备,包括设备名称、驱动版本、计算单元数量和全局内存大小,并创建和销毁了一个OpenCL上下文。

  • 获取OpenCL平台:使用clGetPlatformIDs获取系统中的所有 OpenCL 平台。

  • 检查NVIDIA平台:遍历平台列表,使用clGetPlatformInfo检查是否为 NVIDIA 平台。

  • 获取设备信息:通过clGetDeviceIDs获取 NVIDIA 平台中的所有设备,并使用clGetDeviceInfo获取每个设备的详细信息,如设备名称、驱动版本和全局内存大小。

  • 创建和销毁上下文:使用clCreateContext创建一个 OpenCL 上下文,并在使用后释放该上下文。

    示例代码:

#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; 
}

结果:

Platform Name: NVIDIA CUDA
Device Name: NVIDIA GeForce RTX 4080 SUPER
Driver Version: 550.107.02
Max Compute Units: 80
Global Memory Size: 16072 MB

OpenCL context created successfully.