您的位置:首页 > 运维架构

OpenCL并行计算1-基本概念

2018-02-23 10:07 351 查看

1.基本信息

OpenCL(全称为Open Computing Langugae,开放运算语言)是第一个面向异构系统(此系统中可由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式。OpenCL是一个统一的编程环境也是一个软件架构,其主要由一门用于编写kernels(在OpenCL设备上运行的函数)的语言和一组用于定义并控制平台的API(函数)组成。OpenCL提供了基于任务分割和数据分割的并行计算机制,便于软件开发人员为高性能计算服务器、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其它并行处理器。简单来说就是主机发布控制、协调等命令,设备就只单独负责执行。

2.框架组成

OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义为OpenCL应用创建上下文(上下文表示的是程序运行时所拥有的所有软硬件资源->内存+处理器)的函数。这里的平台指的是宿主机、OpenCL设备和OpenCL框架的组合。程序员需要一种方法查询系统中可用的OpenCL框架。他们需要查找哪些OpenCL设备可用,这些OpenCL设备有什么特性。另外,他们还需要控制这些框架和设备的哪个子集构成给定OpenCL应用中使用的平台。

OpenCL运行时API:平台API主要用来创建上下文,运行时API则强调使用这个上下文满足应用需求的函数集,用来管理上下文来创建命令队列以及运行时发生的其它操作。例如,将命令提交到命令队列的函数。运行时API的第一个任务是建立命令队列,可以将命令队列关联到一个设备,上下文中可以同时有多个活动的命令队列。有了命令队列就可以使用运行时API来定义内存对象和管理内存对象所需要的所有其它对象。运行时API的另外一个任务是创建构建动态库所用的程序对象,内核就由这些动态库组成。程序对象、编译程序对象的编译器以及内核定义都在运行时层处理。最后与命令队列交互的命令都由运行时层的函数发出。管理数据共享和对内核执行施加约束的同步点也由运行时API处理。运行时API完成宿主机绝大部分的工作,函数很多。

OpenCL编程语言(内核编程语言):用来编写内核代码的编程语言,基于C语言的子集。但OpenCL-C已经对C99做了修改,删除的特性如下:

不支持递归函数,不支持函数指针,不支持位域。

为了更好的适应GPU平台的特性,OpenCL-C做了一些特性的更改:

矢量类型,以及这些类型上的操作。地址空间限定符,支持OpenCL对多个地址空间的控制。一组丰富的内置函数。全局或局部内存中处理无符号整数,单精度标量变量的原子函数。

3.引入概念:

任务并行和数据并行:任务并行指的是指令相同,每个任务都是对不同的数据进行处理。数据并行指的是指令相同,每个任务只是处理一个大数据集的一部分而已。

SIMT(Single Instruction Mutil Thread):单指令多线程,也就是很多线程同时执行同一段代码,但每个线程会使用不同的数据。

Work-item(工作项):是执行的最小单元,每个Work-item都有一个id,这个id在kernel中是可以访问的,每个运行在work-item上的kernel通过这个id获取所需要处理的数据,一个kernel执行,会有很多个Work-item来运行kernel。

Work-group(工作组):work-group的存在是为了允许work-item之间的通信和协作的,work-group的组织形式是由N维网格的形式组成的,Work-group中由M*N个work-item,与work-item相似,Work-group也有一个能被kernel获取的唯一id。

ND-Range:是下一个组织级别,它以N维网格的形式规定了Work-group的组织形式。

内存模型:





4.OpenCL的优势及缺点

优点:

a)可移植性强,一次编写,各设备上运行

b)标准化的向量处理,对向量中每个元素的运算处理可以同时进行

c)并行编程

缺点:

a)无法做到代码保护

b)只能即时编译,无法利用汇编进行底层的运算。

5.编写OpenCL程序的基本步骤

1)获取平台–>clGetPlatformIDs

2)从平台中获取设备–>clGetDeviceIDs

3)创建上下文–>clCreateContext

4)创建命令队列–>clCreateCommandQueue

5)读取程序文件,创建程序–>clCreateProgramWithXX

6)编译程序–>clBuildProgram

7)创建内核–>clCreateKernel

8)为内核设置参数–>clSetKernelArg

9)将内核发送给命令队列,执行内核–>clEnqueueNDRangeKernel

10)获取计算结果–>clEnqueueReadBuffer

11)释放资源–>clReleaseXX**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: