OpenCL与CNN篇二:OpenCL基础API介绍

本文详细介绍了OpenCL的基础API,包括获取平台、设备、创建上下文、构建程序、创建内核等步骤。此外,还涵盖了设置内核参数、执行内核、缓冲区操作以及图像读写等关键函数的使用。建议配合《OpenCL编程指南》和实践进行学习。
摘要由CSDN通过智能技术生成
  1. 本篇介绍几个OpenCL基础API,涉及平台、设备等初始化必备函数
  2. 其次介绍几个关于缓冲区操作以及工作空间划分的API
  3. 建议阅读参考书籍,我的推荐是《OpenCL编程指南》和《OpenCL异构计算》,尤其是后者从实践出发,更是适合上手。
  4. 建议收藏这个API的参考网址,里面也OpenCL API的详细介绍OpenCL 2.1 Reference Pages
  5. 本章节函数使用举例见系列篇三,这里不再重复;仅介绍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。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值