GPGPU OpenCL 獲取設備信息


在使用OpenCL編程中,需要對GPU設備的底層理解,這樣才能更好的進行代碼優化。

比如計算單元CU數量,每個CU的執行單元PE數量,每個CU中的共享內存大小等等。只有了解了這些才能更好的使用共享內存,設計核函數的運行參數等。

本文:http://www.cnblogs.com/xudong-bupt/p/3586050.html 

1.clGetDeviceInfo

  OpenCL使用clGetDeviceInfo函數獲取設備具體,函數原型如下:

  cl_int clGetDeviceInfo (

    cl_device_id device,  //設備id號

    cl_device_info param_name,   //枚舉變量,要獲取的設備信息名稱

     size_t param_value_size,  //參數類型大小

    void *param_value,  //參數值

    size_t *param_value_size_ret  //參數類型大小

  );

  這個函數需要調用兩次,第一次獲取參數類型大小,第二次獲取參數。

2.代碼實例

  2.1 tool.h 與tool.cpp

    見:http://www.cnblogs.com/xudong-bupt/p/3582780.html 

  2.2 QueryDeviceInfo.cpp

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "tool.h"
 4 #include <CL/cl.h>
 5 
 6 int main()
 7 {
 8     ///Get first available Platform
 9     cl_platform_id platform;
10     getPlatform(platform);
11 
12     ///get first available GPU
13     cl_device_id *devices=getCl_device_id(platform);
14 
15     char        *value;
16     size_t      valueSize;
17     size_t      maxWorkItemPerGroup;
18     cl_uint     maxComputeUnits=0;
19     cl_ulong    maxGlobalMemSize=0;
20     cl_ulong    maxConstantBufferSize=0;
21     cl_ulong    maxLocalMemSize=0;
22 
23     ///print the device name
24     clGetDeviceInfo(devices[0], CL_DEVICE_NAME, 0, NULL, &valueSize);
25     value = (char*) malloc(valueSize);
26     clGetDeviceInfo(devices[0], CL_DEVICE_NAME, valueSize, value, NULL);
27     printf("Device Name: %s\n", value);
28     free(value);
29 
30     /// print parallel compute units(CU)
31     clGetDeviceInfo(devices[0], CL_DEVICE_MAX_COMPUTE_UNITS,sizeof(maxComputeUnits), &maxComputeUnits, NULL);
32     printf("Parallel compute units: %u\n", maxComputeUnits);
33 
34     ///maxWorkItemPerGroup
35     clGetDeviceInfo(devices[0], CL_DEVICE_MAX_WORK_GROUP_SIZE,sizeof(maxWorkItemPerGroup), &maxWorkItemPerGroup, NULL);
36     printf("maxWorkItemPerGroup: %zd\n", maxWorkItemPerGroup);
37 
38     /// print maxGlobalMemSize
39     clGetDeviceInfo(devices[0], CL_DEVICE_GLOBAL_MEM_SIZE,sizeof(maxGlobalMemSize), &maxGlobalMemSize, NULL);
40     printf("maxGlobalMemSize: %lu(MB)\n", maxGlobalMemSize/1024/1024);
41 
42     /// print maxConstantBufferSize
43     clGetDeviceInfo(devices[0], CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,sizeof(maxConstantBufferSize), &maxConstantBufferSize, NULL);
44     printf("maxConstantBufferSize: %lu(KB)\n", maxConstantBufferSize/1024);
45 
46     /// print maxLocalMemSize
47     clGetDeviceInfo(devices[0], CL_DEVICE_LOCAL_MEM_SIZE,sizeof(maxLocalMemSize), &maxLocalMemSize, NULL);
48     printf("maxLocalMemSize: %lu(KB)\n", maxLocalMemSize/1024);
49 
50     free(devices);
51     return 0;
52 }

執行結果:

  

3.其他

  在安裝了OpenCL的平台,可以使用命令:clinfo

  The OpenCL Specification :  https://www.khronos.org/registry/cl/specs/opencl-1.2.pdf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM