CUDA Samples: 获取设备属性信息
生活随笔
收集整理的這篇文章主要介紹了
CUDA Samples: 获取设备属性信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過調用CUDA的cudaGetDeviceProperties函數可以獲得指定設備的相關信息,此函數會根據GPU顯卡和CUDA版本的不同得到的結果也有所差異,下面code列出了經常用到的設備信息:
#include "funset.hpp"
#include <iostream>
#include <cuda_runtime.h> // For the CUDA runtime routines (prefixed with "cuda_")
#include <device_launch_parameters.h>/* reference:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\1_Utilities\deviceQuery
*/
int get_device_info()
{int device_count{ 0 };// cudaGetDeviceCount: 獲得計算能力設備的數量cudaGetDeviceCount(&device_count);fprintf(stdout, "GPU設備的數量: %d\n", device_count);for (int dev = 0; dev < device_count; ++dev) {int driver_version{ 0 }, runtime_version{ 0 };/* cudaSetDevice: 設置GPU執行時使用的設備,0表示能搜索到的第一個設備號,如果有多個設備,則編號為0,1,2... */cudaSetDevice(dev);/* cudaDeviceProp: 設備屬性結構體name: 設備名字,如GeForce 940MXtotalGlobalMem: 設備上可用的全局內存總量(字節)sharedMemPerBlock: 每一個線程塊上可用的共享內存總量(字節)regsPerBlock: 每一個線程塊上可用的32位寄存器數量warpSize: 一個線程束包含的線程數量,在實際運行中,線程塊會被分割成更小的線程束(warp),線程束中的每個線程都將在不同數據上執行相同的命令memPitch: 在內存拷貝中允許的最大pitch數(字節)maxThreadsPerBlock: 每一個線程塊中支持的最大線程數量maxThreadsDim[3]: 每一個線程塊的每個維度的最大大小(x,y,z)maxGridSize: 每一個線程格的每個維度的最大大小(x,y,z)clockRate: GPU最大時鐘頻率(千赫茲)totalConstMem: 設備上可用的常量內存總量(字節)major: 設備計算能力主版本號,設備計算能力的版本描述了一種GPU對CUDA功能的支持程度minor: 設備計算能力次版本號textureAlignment: 紋理對齊要求deviceOverlap: GPU是否支持設備重疊(Device Overlap)功能,支持設備重疊功能的GPU能夠在執行一個CUDA C核函數的同時,還能在設備與主機之間執行復制等操作,已廢棄,使用asyncEngineCount代替multiProcessorCount: 設備上多處理器的數量kernelExecTimeoutEnabled: 指定執行核函數時是否有運行時間限制integrated: 設備是否是一個集成GPUcanMapHostMemory: 設備是否支持映射主機內存,可作為是否支持零拷貝內存的判斷條件computeMode: CUDA設備計算模式,可參考cudaComputeModemaxTexture1D: 一維紋理支持的最大大小maxTexture2D[2]:二維紋理支持的最大大小(x,y)maxTexture3D[3]: 三維紋理支持的最大大小(x,y,z)memoryClockRate: 內存時鐘頻率峰值(千赫茲)memoryBusWidth: 全局內存總線寬度(bits)l2CacheSize: L2緩存大小(字節)maxThreadsPerMultiProcessor: 每個多處理器支持的最大線程數量concurrentKernels: 設備是否支持同時執行多個核函數asyncEngineCount: 異步引擎數量unifiedAddressing: 是否支持設備與主機共享一個統一的地址空間*/cudaDeviceProp device_prop;/* cudaGetDeviceProperties: 獲取指定的GPU設備屬性相關信息 */cudaGetDeviceProperties(&device_prop, dev);fprintf(stdout, "\n設備 %d 名字: %s\n", dev, device_prop.name);/* cudaDriverGetVersion: 獲取CUDA驅動版本 */cudaDriverGetVersion(&driver_version);fprintf(stdout, "CUDA驅動版本: %d.%d\n", driver_version/1000, (driver_version%1000)/10);/* cudaRuntimeGetVersion: 獲取CUDA運行時版本 */cudaRuntimeGetVersion(&runtime_version);fprintf(stdout, "CUDA運行時版本: %d.%d\n", runtime_version/1000, (runtime_version%1000)/10);fprintf(stdout, "設備計算能力: %d.%d\n", device_prop.major, device_prop.minor);fprintf(stdout, "設備上可用的全局內存總量: %f MB, %llu bytes\n",(float)device_prop.totalGlobalMem / (1024 * 1024), (unsigned long long)device_prop.totalGlobalMem);fprintf(stdout, "每一個線程塊上可用的共享內存總量: %f KB, %lu bytes\n",(float)device_prop.sharedMemPerBlock / 1024, device_prop.sharedMemPerBlock);fprintf(stdout, "每一個線程塊上可用的32位寄存器數量: %d\n", device_prop.regsPerBlock);fprintf(stdout, "一個線程束包含的線程數量: %d\n", device_prop.warpSize);fprintf(stdout, "在內存拷貝中允許的最大pitch數: %d bytes\n", device_prop.memPitch);fprintf(stdout, "每一個線程塊中支持的最大線程數量: %d\n", device_prop.maxThreadsPerBlock);fprintf(stdout, "每一個線程塊的每個維度的最大大小(x,y,z): (%d, %d, %d)\n",device_prop.maxThreadsDim[0], device_prop.maxThreadsDim[1], device_prop.maxThreadsDim[2]);fprintf(stdout, "每一個線程格的每個維度的最大大小(x,y,z): (%d, %d, %d)\n",device_prop.maxGridSize[0], device_prop.maxGridSize[1], device_prop.maxGridSize[2]);fprintf(stdout, "GPU最大時鐘頻率: %.0f MHz (%0.2f GHz)\n",device_prop.clockRate*1e-3f, device_prop.clockRate*1e-6f);fprintf(stdout, "設備上可用的常量內存總量: %lu bytes\n", device_prop.totalConstMem);fprintf(stdout, "紋理對齊要求: %lu bytes\n", device_prop.textureAlignment);fprintf(stdout, "是否支持設備重疊功能: %s\n", device_prop.deviceOverlap ? "Yes" : "No");fprintf(stdout, "設備上多處理器的數量: %d\n", device_prop.multiProcessorCount);fprintf(stdout, "執行核函數時是否有運行時間限制: %s\n", device_prop.kernelExecTimeoutEnabled ? "Yes" : "No");fprintf(stdout, "設備是否是一個集成GPU: %s\n", device_prop.integrated ? "Yes" : "No");fprintf(stdout, "設備是否支持映射主機內存: %s\n", device_prop.canMapHostMemory ? "Yes" : "No");fprintf(stdout, "CUDA設備計算模式: %d\n", device_prop.computeMode);fprintf(stdout, "一維紋理支持的最大大小: %d\n", device_prop.maxTexture1D);fprintf(stdout, "二維紋理支持的最大大小(x,y): (%d, %d)\n", device_prop.maxTexture2D[0], device_prop.maxSurface2D[1]);fprintf(stdout, "三維紋理支持的最大大小(x,y,z): (%d, %d, %d)\n",device_prop.maxTexture3D[0], device_prop.maxSurface3D[1], device_prop.maxSurface3D[2]);fprintf(stdout, "內存時鐘頻率峰值: %.0f Mhz\n", device_prop.memoryClockRate * 1e-3f);fprintf(stdout, "全局內存總線寬度: %d bits\n", device_prop.memoryBusWidth);fprintf(stdout, "L2緩存大小: %d bytes\n", device_prop.l2CacheSize);fprintf(stdout, "每個多處理器支持的最大線程數量: %d\n", device_prop.maxThreadsPerMultiProcessor);fprintf(stdout, "設備是否支持同時執行多個核函數: %s\n", device_prop.concurrentKernels ? "Yes" : "No");fprintf(stdout, "異步引擎數量: %d\n", device_prop.asyncEngineCount);fprintf(stdout, "是否支持設備與主機共享一個統一的地址空間: %s\n", device_prop.unifiedAddressing ? "Yes" : "No");}return 0;
}
執行結果如下:
GitHub:https://github.com/fengbingchun/CUDA_Test
總結
以上是生活随笔為你收集整理的CUDA Samples: 获取设备属性信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUDA Samples: matrix
- 下一篇: CUDA Samples: image