Introduction To OpenCL(2)

一、OpenCL框架组成

1)OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义了为OpenCL应用创建上下文的函数。
2)OpenCL运行时API:这个API管理上下文来创建命令队列以及运行时发生的其他操作。例如,将命令提交到命令队列的函数就来自OpenCL运行时API。
3)OpenCL编程语言:这是用来编写内核代码的编程语言。它基于ISO C99标准的一个扩展子集,因此通常称为OpenCL C编程语言。

二、OpenCL的可移植性

OpenCL作为一种严格定义的计算标准,具有良好的程序可移植性。为一个供应商的平台编写的OpenCL应用程序应该在其他供应商的平台上运行良好,如果它们没有使用任何供应商专有的或特定于平台的扩展或功能的话。OpenCL的程序可移植性由Khronos的认证程序保证,该程序要求OpenCL供应商在宣称其平台符合OpenCL之前,必须通过严格的一致性测试。
由于性能是OpenCL编程的核心,而不是易用性,因此编程人员需要找到算法本身的并行部分,用kernel的方式来实现它们。工作条目就是一个最小的执行单元,工作条目可以组成工作组(work group)。这样的划分也与存储器有关,在OpenCL中,存储分为三大类:Global memory,Local memory,以及Private memory。Global是可以让所有的工作组和工作条目都可见,Local是只有当前工作组中的工作条目可见,而Private是只有单独一个工作条目可见。这样的存储访问控制,可以有效利用高速缓存提高效率,而不是每一次数据访问都需要外部DDR。
与程序可移植性不同,OpenCL的性能通常是不可移植的。OpenCL作为一种高级计算标准,其硬件实现依赖于厂商。不同的硬件供应商有不同的设备架构,每种架构都有其优缺点。因此,为一个供应商的平台编写和优化的OpenCL应用程序不太可能具有与其他供应商平台相同的性能。
即使对于同一供应商,不同代的GPU硬件在微体系结构和特性上也可能有所不同,这可能导致OpenCL程序的显著性能差异。因此,为老一代硬件优化的应用程序通常需要进行微调,以充分利用新一代硬件的全部容量。OpenCL扩展不能保证被转移到新设备上,所以使用扩展的应用程序需要检查新设备是否支持它们。

接下来来简单看看GPU和FPGA的实现架构,GPU的体系结构是高度并行的,高级的GPU有非常多的运算单元,有很高的存储器总线,较高的吞吐量,但是存储访问的延迟也比较大。因此针对GPU的程序设计,存储器的管理和访问是很关键的。GPU一般有小容量高速缓存,并使用PCIe与主机进行通信(当然,现在也有一些新的技术不用PCIe)。见下图:
在这里插入图片描述FPGA是针对定制硬件进行设计,并行度非常高,现代FPGA通常有上百万个逻辑单元,每一个单元可以实现一个逻辑功能;有数千个片内存储器模块,用于快速访问数据;有数千个专用DSP模块,用于加速计算数学函数(比如浮点乘法)。当面向FPGA编译OpenCL时,执行不受固定数据通路和寄存器限制,实际上是根据运算把逻辑组织到函数单元中,然后将其连接起来形成专用的数据通路,实现特殊的内核功能。

三、总结

本篇文章主要介绍了OpenCL应用程序的框架和可移植性分析,着重提到了FPGA这部分内容,大家有兴趣的话,可以留言相互交流学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值