OpenCL通用异构开放环境
OpenCL全称Open Computing Language,第一个面向异构系统通用目的并行编程的开放式、免费标准,一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
OpenCL 1.0主要由一个并行计算API和一种针对此类计算的编程语言组成,此外还特别定义了:
1、C99编程语言并行扩展子集;
2、适用于各种类型异构处理器的坐标数据和基于任务并行计算API;
3、基于IEEE 754标准的数字条件;
4、与OpenGL、OpenGL ES和其他图形类API高效互通。
OpenCL是由苹果首次提出的,随后Khronos Group成立相关工作组,以苹果草案为基础,联合业界各大企业共同完成了标准制定工作。工作组的26个成员来自各行各业,且都是各自领域的领导者,具体包括3DLABS、 Activision Blizzard、AMD、苹果、ARM、Barco、博通、Codeplay、EA、爱立信、飞思卡尔、HI、IBM、Intel、 Imagination、Kestrel Institute、摩托罗拉、Movidia、诺基亚、NVIDIA、QNX、RapidMind、三星、Seaweed、TAKUMI、德州仪器、瑞典于默奥大学。
标准倡导者苹果将是最先应用OpenCL技术的厂商之一,代号Snow Leopard的新版操作系统Mac OS X 10.6就会集成该标准。相比之下,微软没有参与OpenCL的制定工作,Windows自然也不会提供支持,不过DirectX 11有类似的Computer Shader技术,很可能会重演DirectX与OpenGL之战。
同时,AMD Stream SDK、Codeplay Sieve C++等进行改革,适配OpenCL 1.0标准,NVIDIA的CUDA技术也借机大展拳脚。
OpenCL 3.0 的 C++ 内核
在 OpenCL 3.0 中,OpenCL 工作组已经从最初在 OpenCL 2.1 中定义的原始 OpenCL C++ 内核语言过渡,推荐社区 OpenCL开源前端编译器开发C++,提供改进的功能和与 OpenCL C 兼容性的开发人员,使用 C++17 编写内核程序。
C++ for OpenCL 结合了 OpenCL 和 C++17 的功能
C ++针对OpenCL是支持和使用LLVM编译器基础设施。在 Clang 中的实现,通过OpenCL 支持进行跟踪。使开发人员能够使用 OpenCL 内核中的大多数 C++17 功能,通过离线编译越来越多的 OpenCL,实现摄取的 SPIR-V 中间表示形式生成代码。
基本概念
OpenCL程序分为两部分。
l 在主机(以CPU为核心)上运行
l 在设备(以GPU为核心)上运行
设备有一个或多个计算单元,计算单元又包含一个或多个处理单元。在设备上运行的程序被称为核函数。但是对于核函数的编写,CUDA一般直接写在程序内,OpenCL是写在一个独立的文件中,并且文件后缀是.cl,由主机代码读入后执行,这一点OpenCL跟OpenGL中的渲染程序很像。
OpenCL平台由两部分组成,宿主机和OpenCL设备:
宿主机Host: CPU,扮演组织者的角色。包括kernel、kernel上下文、NDRange和队列等;队列控制着kernel如何执行,以及何时执行等。
设备Device:计算设备,可以是CPU、GPU、DSP或硬件提供以及OpenCL开发商支持的任何处理器。
SIMT(Single Instruction Multi Thread): 单指令多线程,GPU并行运算的主要方式,很多线程同时执行相同的运算指令,每个线程的数据有所不同,但执行的操作一致。
核函数(Kernel):在设备程序上执行运算的入口函数,在主机上调用。
工作项(Work-item): 类似于CUDA中的线程(Threads),多个工作项(线程)执行同样的核函数,每个Work-item都有一个ID号,通过ID号来区分处理数据。
工作组(Work-group):类似于CUDA中的线程块(Block),多个工作项组成一个工作组,Work-group内Work-item可以通信和协作。
ND-Range: 类似于CUDA中的网格,定义了Work-group的组织形式。
上下文(Context):整个OpenCL的运行环境,包括Kernel、Device、程序和内存。
设备:OpenCL程序调用的计算设备。
内核:在计算设备上执行的并行程序。
程序:内核程序的源代码(.cl文件)和可执行文件。
内存:计算设备执行OpenCL程序所需的变量。