OPENCL学习(一):获取平台和设备信息

编写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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值