运行时环境层
实现了使用 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