Welcome

首页 / 软件开发 / C++ / GPGPU OpenCL如何获取设备信息

GPGPU OpenCL如何获取设备信息2015-05-11在使用OpenCL编程中,需要对GPU设备的底层理解,这样才能更好的进行代码优化。

比如计算单元CU数量,每个CU的执行单元PE数量,每个CU中的共享内存大小等等。只有了解了这些才能更好的使用共享内存,设计核函数的运行参数等。

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

#include <stdio.h>#include <stdlib.h>#include "tool.h"#include <CL/cl.h>int main(){///Get first available Platformcl_platform_id platform;getPlatform(platform);///get first available GPUcl_device_id *devices=getCl_device_id(platform);char*value;size_tvalueSize;size_tmaxWorkItemPerGroup;cl_uint maxComputeUnits=0;cl_ulongmaxGlobalMemSize=0;cl_ulongmaxConstantBufferSize=0;cl_ulongmaxLocalMemSize=0;///print the device nameclGetDeviceInfo(devices[0], CL_DEVICE_NAME, 0, NULL, &valueSize);value = (char*) malloc(valueSize);clGetDeviceInfo(devices[0], CL_DEVICE_NAME, valueSize, value, NULL);printf("Device Name: %s
", value);free(value);/// print parallel compute units(CU)clGetDeviceInfo(devices[0], CL_DEVICE_MAX_COMPUTE_UNITS,sizeof(maxComputeUnits), &maxComputeUnits, NULL);printf("Parallel compute units: %u
", maxComputeUnits);///maxWorkItemPerGroupclGetDeviceInfo(devices[0], CL_DEVICE_MAX_WORK_GROUP_SIZE,sizeof(maxWorkItemPerGroup), &maxWorkItemPerGroup, NULL);printf("maxWorkItemPerGroup: %zd
", maxWorkItemPerGroup);/// print maxGlobalMemSizeclGetDeviceInfo(devices[0], CL_DEVICE_GLOBAL_MEM_SIZE,sizeof(maxGlobalMemSize), &maxGlobalMemSize, NULL);printf("maxGlobalMemSize: %lu(MB)
", maxGlobalMemSize/1024/1024);/// print maxConstantBufferSizeclGetDeviceInfo(devices[0], CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,sizeof(maxConstantBufferSize), &maxConstantBufferSize, NULL);printf("maxConstantBufferSize: %lu(KB)
", maxConstantBufferSize/1024);/// print maxLocalMemSizeclGetDeviceInfo(devices[0], CL_DEVICE_LOCAL_MEM_SIZE,sizeof(maxLocalMemSize), &maxLocalMemSize, NULL);printf("maxLocalMemSize: %lu(KB)
", maxLocalMemSize/1024);free(devices);return 0;}
执行结果:

3.其他

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

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

作者:cnblogs 旭东的博客