系统软件层
编写了一个使用 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.