读书笔记-OpenCL编程指南 平台、上下文和设备

OpenCL应用的第一步是查询OpenCL平台集合,选择其中一个或多个平台在应用中使用。与平台关联有一个简档(profile),描述所支持的特定OpenCL版本的功能。简档可以是完全简档,涵盖定义为核心规范的所有功能,或者是嵌入式简档,定义为完全简档的一个子集,其中删除了为保证与IEEE 754标准一致而提出的一些需求。

OpenCL平台

clGetPlatformIDs

平台集可以用下面命令查询
在这里插入图片描述
如果参数platforms为NULL,clGetPlatformIDs会返回可用平台数。
返回的平台数可以用num_entries来限制,这个参数要大于0并小于或等于可用平台数。
可以将num_entries和platforms分别设置为0和NULL来查询可用的平台个数。
读书笔记-OpenCL编程指南 平台、上下文和设备_第1张图片
在这里插入图片描述

clGetPlatformInfo

读书笔记-OpenCL编程指南 平台、上下文和设备_第2张图片
可以将param_value_size和param_value的值分别设置为0和NULL来查询返回值的大小。
读书笔记-OpenCL编程指南 平台、上下文和设备_第3张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第4张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第5张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第6张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第7张图片

OpenCL设备

各个平台可能会分别关联一组计算设备,应用程序将利用这些计算设备执行代码。给定一个平台,可以用以下命令查询支持的设备列表
在这里插入图片描述
这个命令会得到与platform关联的可用OpenCL设备列表。如果参数devices为NULL,clGetDeviceIDs会返回设备数。返回的设备数可以用num_entries来限制(0 计算设备的类型由参数device_type指定,可以是下表的某个值。
读书笔记-OpenCL编程指南 平台、上下文和设备_第8张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第9张图片
在这里插入图片描述
给定一个设备,可以使用以下命令查询各种属性:
在这里插入图片描述
可以将param_value_size和param_value的值分别设置为0和NULL来查询返回值的大小。

读书笔记-OpenCL编程指南 平台、上下文和设备_第10张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第11张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第12张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第13张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第14张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第15张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第16张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第17张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第18张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第19张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第20张图片

OpenCL上下文

上下文是所有OpenCL应用的核心。上下文为关联的设备、内存对象(例如,缓冲区和图像)以及命令队列(在上下文和各设备之间提供一个接口)提供了一个容器。正是上下文驱动着应用程序与特定设备以及特定设备之间的通信,为此OpenCL定义了内存模型。例如,内存对象分配有一个上下文,不过可以由特定的设备来更新,OpenCL的内存保证相同上下文中的所有设备可以在明确定义的同步点看到这些更新。可以使用多个上下文,分别由不同平台创建,并把工作分布到这些上下文和关联的设备上。区别在于,OpenCL的内存模型不会跨设备,这说明内存对象不能由不同的上下文(可能由相同或不同的平台创建)共享。
读书笔记-OpenCL编程指南 平台、上下文和设备_第21张图片
通常平台和设备会在程序或库的开始位置查询,与之不同,你可能希望在程序运行过程中更新上下文,或者分配或删除内存对象等。一般地,应用程序需要以下步骤:
1) 查询有哪些平台
2)查询各个平台支持的设备集
使用clGetDeviceInfo()为特定功能选择设备
3)由选择的设备创建上下文,然后利用上下文可以做到:
a. 创建一个或多个命令队列
b. 创建程序,使它在一个或多个关联设备上运行
c. 从这些程序创建一个内核
d. 在宿主机或设备上分配内存缓冲区和图像
e. 将数据写至或复制到特定设备,或者由设备写数据
f. 将内核(设置适当的参数)提交到命令队列来执行
读书笔记-OpenCL编程指南 平台、上下文和设备_第22张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第23张图片
在这里插入图片描述
这里列出的属性只是与上下文关联的平台。其他上下文属性用特定的OpenCL扩展定义。参数devices和device_type分别允许显式地指定设备集或者限制为特定的设备类型。参数pfn_notify和user_data用来共同定义一个回调,可以调用这个回调报告上下文生命周期中所出现错误的有关信息,要把user_data作为最后一个参数传至回调。

读书笔记-OpenCL编程指南 平台、上下文和设备_第24张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第25张图片

读书笔记-OpenCL编程指南 平台、上下文和设备_第26张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第27张图片
在这里插入图片描述

类似于所有OpenCL对象,上下文是引用计数的,可以用以下两个命令递增和递减引用数。
在这里插入图片描述
这两个命令会分别将一个上下文的引用计数递增和递减

输入信号的卷积

最简单的形式是将一个信号(输入信号)与另一个信号(模板)结合生成一个最终输出(输出信号)。图显示将一个3x3模板应用到一个8x8输入信号的过程,最后会得到一个6x6的输出信号。(没有考虑边缘情况)
读书笔记-OpenCL编程指南 平台、上下文和设备_第28张图片
借助上图可以看出,这里的每个工作项对应于输出信号的一个值(每个工作项负责计算一个输出值,结合执行模型来理解)。通过get_global_id获取响应的索引。通过两层嵌套的for循环来遍历mask数组,并与input相应位置的数据相乘,并累加得到输出。注意这里的输入input和mask以及output的数组是线性的,也就是一维数组。所以每次计算一个输出后,输入input的起始值应该为(y + r)*inputWidth+x。
读书笔记-OpenCL编程指南 平台、上下文和设备_第29张图片

读书笔记-OpenCL编程指南 平台、上下文和设备_第30张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第31张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第32张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第33张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第34张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第35张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第36张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第37张图片
读书笔记-OpenCL编程指南 平台、上下文和设备_第38张图片

你可能感兴趣的:(#,OpenCL,opencl)