编写CL程序之前,首先要了解平台以及设备的基本信息,才能少踩坑和实现更优的程序。例如当前平台支持的最大的CL版本是1.x还是2.x?当前设备支持最大计算单元是多少?这对后期编程十分重要。
构建openCL应用时,必须依赖某个平台,简单就是哪家的设备如AMD或Nvidia以及对应的SDK,设备就是CPU、GPU等计算设备。
clGetPlatformInfo用来获取opencl平台信息
参数名 | 作用 |
---|---|
CL_PLATFORM_VERSION | 返回所能支持最大openCL版本 |
CL_PLATFORM_PROFILE | 确认平台是支持完全版还是嵌入式版本的openCL |
CL_PLATFORM_EXTENSIONS | 返回平台所支持的扩展,每个openCL扩展都定义了一部分超出标准的内容,一旦该扩展被openCL工作组认可,则名字由cl_khr_开头 |
#include <CL/cl.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main() {
cl_platform_id *platform;
cl_uint num_platform;
cl_int err;
err = clGetPlatformIDs(0, NULL, &num_platform);
platform = (cl_platform_id *)malloc(sizeof(cl_platform_id) * num_platform);
err = clGetPlatformIDs(num_platform, platform, NULL);
for (int i = 0; i < num_platform; i++)
{
size_t size;
// get name
err = clGetPlatformInfo(platform[i], CL_PLATFORM_NAME, 0, NULL, &size);
char *name = (char *)malloc(size);
err = clGetPlatformInfo(platform[i], CL_PLATFORM_NAME, size, name, NULL);
printf("CL_PLATFORM_NAME:%s\n", name);
// vendor
err = clGetPlatformInfo(platform[i], CL_PLATFORM_VENDOR, 0, NULL, &size);
char *vendor = (char *)malloc(size);
err = clGetPlatformInfo(platform[i], CL_PLATFORM_VENDOR, size, vendor, NULL);
printf("CL_PLATFORM_VENDOR:%s\n", vendor);
// version
err = clGetPlatformInfo(platform[i], CL_PLATFORM_VERSION, 0, NULL, &size);
char *version = (char *)malloc(size);
err = clGetPlatformInfo(platform[i], CL_PLATFORM_VERSION, size, version, NULL);
printf("CL_PLATFORM_VERSION:%s\n", version);
// profile
err = clGetPlatformInfo(platform[i], CL_PLATFORM_PROFILE, 0, NULL, &size);
char *profile = (char *)malloc(size);
err = clGetPlatformInfo(platform[i], CL_PLATFORM_PROFILE, size, profile, NULL);
printf("CL_PLATFORM_PROFILE:%s\n", profile);
// extensions
err = clGetPlatformInfo(platform[i], CL_PLATFORM_EXTENSIONS, 0, NULL, &size);
char *extensions = (char *)malloc(size);
err = clGetPlatformInfo(platform[i], CL_PLATFORM_EXTENSIONS, size, extensions, NULL);
printf("CL_PLATFORM_EXTENSIONS:%s\n", extensions);
//
printf("\n\n");
// clean
free(name);
free(vendor);
free(version);
free(profile);
free(extensions);
free(platform);
return 0;
}
clGetDeviceIDs 能够获取感兴趣的设备ID,设备类型包括
CPU - CL_DEVICE_TYPE_GPU
GPU - CL_DEVICE_TYPE_GPU 等;
clGetDeviceInfo 是获取设备信息的核心函数,可获取信息主要包括(全部可查阅cl.h):
参数名 | 作用 |
---|---|
CL_DEVICE_NAME | 设备名称 |
CL_DEVICE_GLOBAL_MEM_SIZE | 设备全局内存大小 |
CL_DEVICE_AVAILABLE | 设备是否可用 |
CL_DEVICE_MAX_COMPUTE_UNITS | 设备最大计算单元 |
#include <CL/cl.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main() {
cl_platform_id platform;
cl_device_id dev;
int err;
char *value;
size_t valueSize;
size_t maxWorkItemPerGroup;
cl_uint maxComputeUnits=0;
cl_ulong maxGlobalMemSize=0;
cl_ulong maxConstantBufferSize=0;
cl_ulong maxLocalMemSize=0;
/* Identify a platform */
err = clGetPlatformIDs(1, &platform, NULL);
if(err < 0) {
perror("Couldn't identify a platform");
exit(1);
}
/* Access a device */
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &dev, NULL);
///print the device name
clGetDeviceInfo(dev, CL_DEVICE_NAME, 0, NULL, &valueSize);
value = (char*) malloc(valueSize);
clGetDeviceInfo(dev, CL_DEVICE_NAME, valueSize, value, NULL);
printf("Device Name: %s\n", value);
free(value);
/// print parallel compute units(CU)
clGetDeviceInfo(dev, CL_DEVICE_MAX_COMPUTE_UNITS,sizeof(maxComputeUnits), &maxComputeUnits, NULL);
printf("Parallel compute units: %u\n", maxComputeUnits);
///maxWorkItemPerGroup
clGetDeviceInfo(dev, CL_DEVICE_MAX_WORK_GROUP_SIZE,sizeof(maxWorkItemPerGroup), &maxWorkItemPerGroup, NULL);
printf("maxWorkItemPerGroup: %zd\n", maxWorkItemPerGroup);
/// print maxGlobalMemSize
clGetDeviceInfo(dev, CL_DEVICE_GLOBAL_MEM_SIZE,sizeof(maxGlobalMemSize), &maxGlobalMemSize, NULL);
printf("maxGlobalMemSize: %lu(MB)\n", maxGlobalMemSize/1024/1024);
/// print maxConstantBufferSize
clGetDeviceInfo(dev, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,sizeof(maxConstantBufferSize), &maxConstantBufferSize, NULL);
printf("maxConstantBufferSize: %lu(KB)\n", maxConstantBufferSize/1024);
/// print maxLocalMemSize
clGetDeviceInfo(dev, CL_DEVICE_LOCAL_MEM_SIZE,sizeof(maxLocalMemSize), &maxLocalMemSize, NULL);
printf("maxLocalMemSize: %lu(KB)\n", maxLocalMemSize/1024);
return 0;
}