《OpenCL实战》一1.2 为什么是OpenCL-阿里云开发者社区

开发者社区> 异步社区> 正文

《OpenCL实战》一1.2 为什么是OpenCL

简介: 你可能听说过这样的表述,OpenCL指的是一门独立的语言,但其实,这种表述其实并不准确。OpenCL标准只是在C和C++的基础之上,扩展定义了一些数据类型,数据结构以及函数罢了。尽管开发人员已经针对Java和Python设计了一系列的OpenCL接口库,但标准中只要求OpenCL框架提供C和C++编写的API。
+关注继续查看

本节书摘来异步社区《OpenCL实战》一书中的第1章,第1.2节,作者: 【美】Matthew Scarpino 译者: 陈睿 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 为什么是OpenCL

你可能听说过这样的表述,OpenCL指的是一门独立的语言,但其实,这种表述其实并不准确。OpenCL标准只是在C和C++的基础之上,扩展定义了一些数据类型,数据结构以及函数罢了。尽管开发人员已经针对Java和Python设计了一系列的OpenCL接口库,但标准中只要求OpenCL框架提供C和C++编写的API。

OpenCL和多核计算史上的重大事件如下:

2001-IBM发布POWER4,第一块多核处理器;

2005-第一批针对桌面电脑的多核处理器发布:AMD的Athlon64 X2和Intel的Pentium D;

2008年6月-OpenCL工作组形成,加入Khronos Group大家庭;

2008年12月-OpenCL工作组发布了OpenCL v1.0的规格标准;

2009年4月-Nvidia发布了针对Nvidia显卡的OpenCL SDK;

2009年8月–ATI(现在的AMD)发布了针对ATI显卡的OpenCL SDK。Apple在Mac OS 10.6(雪豹版)中加入了对OpenCL的支持;

2010年6月-OpenCL工作组发布了OpenCL v1.1的规格标准。

这里有个很棘手的问题:有什么是你能靠OpenCL完成,而一般的C和C++编程却束手无策?而这正是我要用整本书来完整解释、回答的问题,但是首先,我们还需要考察OpenCL的三个主要优势:可移植性,标准化的向量处理,以及并行编程。

1.2.1 可移植性

Java是世界上最为著名的编程语言之一,而它的成功很大程度上应当归功于它的那句格言:“一次编写,各处运行(Write once,run everywhere)[2]”。有了Java,你并不需要针对不同的操作系统重写自己的代码。只要操作系统兼容支持JVM(Java Virtual Machine,Java虚拟机),你的代码就能运行。

OpenCL秉承的是同样的理念,但那句格言还得改改才更适用,“一次编写,各设备上运行(Write once, run on anything)”。每个芯片厂商不仅提供兼容OpenCL的硬件,还提供开发工具编译OpenCL代码,支持其在硬件上的运行。换言之,你只需要一次编写OpenCL例程,便可以保证其在兼容芯片(多核处理器或是显卡)上的编译、运行。这便是相对于传统的高性能计算的巨大优势,你并不需要针对特定产商的硬件,而去学习它们的专用编程语言。

而OpenCL所带来的好处并不仅仅只是能够在任何兼容硬件上运行。OpenCL应用程序可以针对不同的设备完成一次编译,这些设备甚至都不需要有相同的体系结构,或是来自同一个厂商。只要他们的设备能够兼容OpenCL,编写的函数便能运行。而这是以往的C/C++编程所无法达到的,它们所编写的程序只能是在特定的编译目标上运行。

这里有一个实例。设想你有一块来自AMD的多核处理器芯片,一块来自Nvidia的显卡以及一块来自IBM的通过PCI连接的加速器。一般而言,你根本不可能针对这三个不同的系统进行一次性的程序编写,而它们所要求的编译器和链接器也是各不相同。但是OpenCL程序所编写的可执行程序却可以在三种不同的硬件上运行。换言之,现在可以靠同样的程序在不同平台的硬件上完成相同的任务。如果你还有更多的兼容设备需要考虑,只需要重新编译程序即可,而不是重写所有的代码。

1.2.2 标准化的向量处理

标准化的向量处理也是OpenCL的一大优势,但在我解释原因之前,还是需要对所讨论的问题稍加定义。这里的术语向量将贯穿本书始终,而它的表述也可分为如下三种(尽管三种表述本质上都差不多):

  • 物理或几何向量—一个带有幅值和方向的物理量。在物理学中,它经常被用来刻划作用力,速度,热传导等物理量。而在图像处理中,向量则被用来表示方向。
  • 数学向量—一个有序的由元素组成的一维集合。这区别于由元素组成的二维集合,矩阵。
  • 计算向量—一个包含多个相同数据类型元素的数据结构。在向量运算中,对其中的每个元素(也叫向量分量(component))的运算处理也都同时进行。

最后一种表述对OpenCL而言非常的重要,而高性能处理器也正是要完成这一操作。如果你有听说过超标量处理器或是矢量处理器的话,这也就是我们所讨论的设备类型。基本上所有的现代处理器都具备处理向量运算的能力,但ANSI C/C++并没有定义任何基本的向量数据类型。这听起来很奇怪,但确实是个显而易见的问题:向量指令基本上都是针对向量来的。Intel处理器使用的是SSE指令扩展,Nvidia芯片需要PTX指令集,而IBM的芯片则是依靠AaltiVec指令集来执行向量运算。这些指令集都没有任何共通之处[3]。

但是有了OpenCL,你便可以实现“一次编写,各设备上运行”的想法。具体到不同平台的应用程序,Nvidia的OpenCL编译器会输出PTX指令的程序,而IBM的OpenCL编译器会输出AltiVec指令的程序。显然,如果你是要面向多个硬件平台编写高性能的应用程序,OpenCL绝对会节省大量的时间。在第4章中,我们将讨论OpenCL的矢量数据类型,而在第5章中,我们将看到具体有那些函数来负责向量操作。

1.2.3 并行编程

如果你有过大规模的应用程序的编程经验,你肯定接触过并发(concurrency)[4]的概念——顺序代码通过任务调度在进程(或线程)间实现资源分享,并行执行。OpenCL包含了并发的特点,但更重要的是它带来了并行编程(parallel programming)的可能。并行编程就是将不同的运算任务分配给多个不同的处理单元,同时并行执行。

在OpenCL之中,这些任务被称为内核。而内核是针对一个或多个兼容OpenCL的设备而特别编写的函数,并通过主机应用程序发送到相应的一个或多个设备上。主机应用程序就是一个在我们称为主机的用户开发系统上运行的C/C++应用程序。主机既可以选择将内核程序发送到计算机显卡上的GPU中运行,也可以选择当前的CPU作为执行目标。

主机应用程序通过名为上下文(context)的容器来管理所连接的设备。图1.1所示的是主机与内核及设备之间的相互关系。

主机必须要从一个名为程序(program)的内核容器中选择函数,才能创建出内核程序;然后,它再向内核函数中调入相应的参数数据,并发送到名为指令序列的数据结构中。指令序列是主机实现对设备控制的一种机制,而当内核入列时,设备便会执行相应的函数。

OpenCL应用程序可以配置不同的设备来完成不同的任务,每个任务都是对不同的数据进行运算处理。换言之,OpenCL提供的是任务并行的机制。这也是相比于其他并行编程工具集的重要优势,其他的开发工具只允许数据并行的处理机制。在数据并行的系统中,每个设备都收到相同的指令,但处理的是整个数据集的不同部分。

图1.1所示的是OpenCL在设备间完成任务并行处理的整个过程;这张图并没有给出设备内部的运行机制。大多数的OpenCL兼容设备所含的处理单元(processing element)往往不止一个,换言之,设备内部还存在并行处理的可能性。第3章我们更多地关注这种并行处理,以及如何通过数据划分来最大化地利用设备内部的并行处理。


1_1

可移植性,向量运算以及并行编程使得OpenCL较之一般的C/C++更为强大、高效,但随之带来的也是计算系统更大的复杂性。在实际的OpenCL编程中,创建一系列不同的数据结构并协调它们之间的关系是必不可少的,尽管如此,要保持整个过程中任何事情都是明明了了,条理清楚,却并非易事,下一节我们将通过一个类比,让你对此有更深的认识。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《TensorFlow技术解析与实战》——1.4 什么是TensorFlow
本节书摘来自异步社区《TensorFlow技术解析与实战》一书中的第1章,第1.4节,作者李嘉璇,更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 人工智能概述 1.4 什么是TensorFlow 想想,在机器学习流行之前,我们是如何做与语音和图像相关的识别的?大多数是基于规则的系统。
2079 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10062 0
《OpenACC并行编程实战》—— 3.3 计算构件kernels
OpenACC有两个计算构件(Compute Construct):parallel和kernels,用来将循环并行化。两个构件的目标是一样的,但行为有较大的区别。初学者应优先使用简单的kernels构件,熟练以后可以使用parallel构件,众多的子语还能够精细控制并行化方案。
1253 0
LDAP落地实战(二):SVN集成OpenLDAP认证
上一篇文章我们介绍了LDAP的部署以及管理维护,那么如何接入LDAP实现账号统一认证呢?这篇文章将带你完成svn的接入验证 subversion集成OpenLDAP认证 系统环境:debian8.
1447 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13875 0
《Linux/UNIX OpenLDAP实战指南》——2.6 OpenLDAP目录树规划
本节书摘来自异步社区《Linux/UNIX OpenLDAP实战指南》一书中的第2章,第2.6节,作者:郭大勇著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2013 0
DataWorks OpenAPI企业开发实战-运维监控大屏
本文将会介绍如何通过使用DataWorks OpenAPI、DataWorks开放元数据、DataWorks开放事件消息三大利器搭建企业自己的DataWorks运维大屏。其中DataWorks OpenAPI已经面向所有企业开放商业化,而DataWorks开放元数据、DataWorks开放事件消息还在邀测中。
1140 0
《Linux/UNIX OpenLDAP实战指南》——2.7 OpenLDAP用户以及与用户组相关的配置
添加用户和用户组的方式有两种。一种是将系统用户通过migrationtools工具生成LDIF文件并结合ldapadd命令导入OpenLDAP目录树中,生成OpenLDAP用户。另一种通过自定义LDIF文件并通过OpenLDAP命令进行添加或者修改操作。
2641 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载