- 本篇介绍几个OpenCL基础API,涉及平台、设备等初始化必备函数
- 其次介绍几个关于缓冲区操作以及工作空间划分的API
- 建议阅读参考书籍,我的推荐是《OpenCL编程指南》和《OpenCL异构计算》,尤其是后者从实践出发,更是适合上手。
- 建议收藏这个API的参考网址,里面也OpenCL API的详细介绍OpenCL 2.1 Reference Pages
- 本章节函数使用举例见系列篇三,这里不再重复;仅介绍API相关参数,以及自己的见解。
一、OpenCL平台API
平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义了为OpenCL
应用创建上下文的函数。包括平台、设备、上下文等相关函数。
不过为了方便起见这里将构建程序和创建内核也放在了此章节,即1.4、1.5、1.6。
注意1.7及之后为一些篇外话,不作为和1.1~1.6的连续内容。
1.1、获取平台clGetPlatformIDs()
cl_int clGetPlatformIDs(
cl_uint num_entries, //限制返回的平台数
cl_platform_id *platforms, //平台列表保存位置指针
cl_uint *num_platforms //平台个数保存位置指针
);
将num_entries和platforms分别设置为0和NULL可以查询可用的平台个数,保存在num_platforms中。返回的平台数可以用num_entries来限制,获取平台列表时这个参数要大于0并小于等于可用平台数。
平台这个概念应该是不同厂商的实现,比如我一开始安装了AMD APP SDK,运行程序只有1个可用平台;后来有想法就又安装了Intel的SDK,这时运行OpenCL有两个可用平台。区别是一个平台包含GPU和CPU,一个平台只包含CPU;而且打印设备信息,他们包含的CPU名称相同。
1.2、获取设备clGetDeviceIDs()
cl_int clGetDeviceIDs(
cl_platform_id platform, // 指定平台
cl_device_type device_type, // 指定设备类型
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices
);
这个命令会得到与platform关联的eOpenCL设备列表。如果参数devices为NULL,则用num_devices得到可用设备数。类似平台函数用num_entries可以限制返回的设备数。
参数device_type用来指定计算设备类型,其极常见参数选择见下表。
cl_device_type | 描述 |
---|---|
CL_DEVICE_TYPE_CPU | 作为宿主机处理器的OpenCL设备 |
CL_DEVICE_TYPE_GPU | 作为GPU的OpenCL设备 |
CL_DEVICE_TYPE_ACCELERATOR | OpenCL加速器(例如,IBM Cell Broaband) |
CL_DEVICE_TYPE_DEFAULT | 默认设备 |
CL_DEVICE_TYPE_ALL | 与相应平台关联的所有OpenCL设备 |
1.3、创建上下文clCreateContext()
cl_context clCreateContext(
const cl_context_properties *properties, // 此处包含平台信息
cl_uint num_devices, // 设备个数
const cl_device_id *devices, // 设备列表
void (CL_CALLBACK *pfn_notify)(const char *errinfo,const void *private_info,size_t cb, void *user_data),
void *user_data,
cl_int *errcode_ret
);
第一参数着重说明一下,需要用确定的平台来构建,方法如下:
cl_context_properties props[3] =
{ CL_CONTEXT_PLATFORM , (cl_context_properties)platformIds, 0 };
第四个参数那么复杂就直接忽略吧,因为调用时那个位置填NULL。使用中user_data也输入NULL。最后一个参数errcode_ret用来记录错误代码,正常时errcode_ret==CL_SUCCESS。