第一章 OpenCL介绍

1.1 什么是OpenCL

  • OpenCL是面向由CPU、GPU和其它处理器组合构成的
    • 计算机
    • 进行编程的行业标准框架

1.2 多核的未来:异构平台

1.3 多核世界中的软件

  • concurrency:并发性是计算机科学中老概念。
  • 软件系统含多个活动的操作流时,如果这些操作流同时向前推进,则称这个软件系统时并发的。
    \newline
    \newline
  • 当并发软件在拥有多个处理单元的计算机上运行时,
    • 线程实际上可以同时运行,从而可实现并行计算。
    • 硬件支持的并发性就是并行性。

\newline
\newline

  • 程序员找出问题中的并发性是关键所在。

\newline
\newline

  • 两个并行程序设计模型:task paralelism和data parallelism

\newline
\newline

  • GPGPU编程中,
    • 图形以外的算法会修改为适合于GPU处理。
    • CPU完成计算并管理I/O,不过所有“实质性的”的计算都“分摊”给GPU。
    • 基本上,异构平台会背忽略,而把重点放在系统的一个组件上:GPU。
  • OpenCL不建议此法。
  • 实际上,既然用户已经为系统中的“所有OpenCL设备”付了钱,有效的程序就应该使用所有这些设备。
  • 这是OpenCL鼓励程序员采用的做法,也是我们对异构平台设计编程环境的期望。

1.4 OpenCL的概念基础

  • OpenCL支持大量不同类型的应用。无论哪一种情况,面向异构平台的应用都必须完成以下步骤:
  • 1)发现构成异构系统的组件;
  • 2)探查这些组件的特征,使软件能适应不同硬件单元的特性;
  • 3)创建在平台上运行的指令块(内核);
  • 4)建立并管理计算中涉及的内存对象;
  • 5)在系统中正确的组件上按正确的顺序执行内核;
  • 6)收集最终结果。

\newline
\newline

  • 这些步骤通过OpenCL中的一系列API再加上一个面向内核的编程环境来完成。
  • 我们采用“分而治之”的策略解释以上步骤的所有工作。
  • 把问题分解为一下模型:
  • platform model:异构系统的高层描述。
  • execution model:指令流在异构平台上执行的抽象表示。
  • memory model:OpenCL中的内存区域集合以及一个OpenCL计算期间这些内存区域如何交互。
  • programming model:程序员设计算法来实现一个应用时使用的高层抽象。

1.4.1 平台模型

  • OpenCL平台模型定义使用了OpenCL的异构平台的一个高层表示。
    OpenCL介绍

  • OpenCL设备划分为compute unit,还可更划分为一个或多个处理单元。

  • 设备上的计算都在处理单元中完成。

1.4.2 执行模型

  • OpenCL应用由两部分:一个host program及一个或多个kernel组成的集合。
  • OpenCL定义两类内核:
  • OpenCL内核:用OpenCL C编程语言编写并用OpenCL编译器编译的函数。
    • 所有OpenCL实现都必须支持OpenCL内核。
  • 原生内核:OpenCL之外创建的函数,
    • 在OpenCL中通过一个函数指针来访问。
    • 这些函数可以是宿主机源代码中定义的函数,或者是从一个专用库导出的函数。
      \newline
      \newline
  • 内核在宿主机上定义。
    • 宿主机程序发出一个命令,提交内核在一个OpenCL设备上执行。
    • 由宿主机发出这个命令时,OpenCL运行时系统会创建一个整数索引空间。
    • 对应这个索引空间中的各个点将分别执行内核的一个实例。
    • 我们将执行内核的各个实例称为一个工作项(work-item),工作项由它在索引空间中的坐标来标识。
    • 这些坐标就是工作项的全局ID。
  • OpenCL只能确保一个工作组中的工作项并发执行。
  • 索引空间是个N维的值网格,也称为NDRange。
    • 目前,N可是1、2或3。
    • 在一个OpenCL程序中,NDRange由一个长度为N的整数数组定义,N指定索引空间各维度的大小。
    • 各个工作项的全局和局部ID都是个N维元组。
    • 最简单的情况下,全局ID中各个值的取值范围从0开始,到该维度元素个数为1。
      \newline
      \newline
  • 上下文
    • 宿主机的第一个任务是为OpenCL应用定义上下文。
    • 上下文定义了一个环境,内核就在这个环境中定义和执行。
    • 更准确地说,由以下资源定义上下文:
    • device:宿主机使用的OpenCL设备集合。
    • kernel:在OpenCL设备上运行的OpenCL函数。
    • program object:实现内核的程序源代码和可执行文件。
    • memory object:内存中对OpenCL设备可见的一组对象,包含可以由内核实例处理的值。
  • 上下文由宿主机使用OpenCL API函数创建和管理。宿主机程序在在CPU上运行。
  • 上下文中还包括一个或多个程序对象(program object),程序对象包括内核的代码。
    \newline
    \newline
  • 命令队列
    • 宿主机与OpenCL设备之间的交互通过命令完成
    • 命令由宿主机提交给command-queue
    • 会在命令队列中等待,直到在OpenCL设备上执行。
    • 命令队列有宿主机创建,并在定义上下文之后关联到一个OpenCL设备。
    • 宿主机将命令放入命令队列,然后调度这些命令在关联设备上执行。
    • OpenCL支持3种类型
      • kernel execution command:在OpenCL设备的处理单元上执行内核。
      • memory command:
        • 在宿主机和不同内存对象之间传数据
        • 在内存对象之间移动数据,
        • 或将内存对象映射到宿主机地址空间,
        • 或从宿主机地址空间解映射。
      • sysnchronization command:对命令执行的顺序施加约束。

1.4.3 内存模型

  • OpenCL定义两类型的内存对象:buffer object和image object
  • OpenCL内存模型定义5种内存区域:
    • host :只对宿主机可见。OpenCL只定义宿主机内存与OpenCL对象和构造如何交互。
    • global :允许读、写所有工作组中的所有工作项。工作项可以读、写全局内存中一个内存对象的任何元素。
      • 读、写全局内存可能会缓存,这取决于设备容量。
    • constant :全局内存的这个区域在执行一个内核期间保持不变。
      • 宿主机分配并初始化放在常量内存中的内存对象。这些对象对于工作项是只读的。
    • local :这个内存区域对工作组是局部的。这个内存区域可以用来分配该工作组中所有工作项共享的变量。
      • 它可以实现OpenCL设备上的专用内存区域。或者,局部内存区域也可以映射到全局内存的区域(section)。
    • private :这个内存趋于是一个工作项私有的区域。
      • 一个工作项私有内存中定义的变量对其他工作项不可见。

OpenCL介绍

1.4.4 编程模型

  • 任务并行和数据并行

1.6 OpenCL的内容

  • OpenCL框架划分以下:
  • OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,还定义为OpenCL应用创建上下文的函数。
  • OpenCL运行时API:这个API管理上下文来创建命令队列以及运行时发生的其他操作。
    • 将命令提交到命令队列的函数来自OpenCL运行时API。
  • OpenCL编程语言:用来编写内核代码的编程语言。

1.6.1 平台API

  • platform在OpenCL中有特定的含义。
    • 表示宿主机、OpenCL设备和OpenCL框架的组合。
    • 一个异构计算机上可同时存在多个OpenCL平台。

1.6.2 运行时API

  • 平台API中的函数为OpenCL应用定义上下文。
  • 运行时API则强调使用这个上下文满足应用需求的函数。

参考链接

  • https://www.cnblogs.com/tcsong24/p/7602950.html

OpenCL:一种异构计算架构

1 摘要

2 为什么需要OpenCL?

3 OpenCL架构

3.1 介绍

  • OpenCL为异构平台提供了一个编写程序,尤其是并行程序的开放的框架标准。
  • OpenCL所支持的异构平台可由多核CPU、GPU或其他类型的处理器组成。
  • OpenCL由两部分组成,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语 言,
  • 二是定义并控制平台的API。
  • OpenCL提供了基于任务和基于数据两种并行计 算机制,它极大地扩展了GPU 的应用范围,使之不再局限于图形领域。

\newline
\newline

  • OpenCL由Khronos Group维护。
  • 非盈利性技术组织,维护多个开放的工业标准,OpenGL和OpenAL。
    • 分别用于三维图形和计 算机音频方面。
      \newline
      \newline
  • OpenCL源程序可在多核CPU上也可在GPU上编译执行,提高代码的性能和可移植。
  • OpenCL标准的委员会来自:AMD,Intel,IBM和NVIDIA
  • 作为用户和程序员期待 已久的东西,
  • OpenCL两个重要变化:
    • 跨厂商的非专有软件解决方案
    • 跨平台的异构框架以同时发挥系统中所有计算单元的能力。
      \newline
      \newline

\newline
\newline

参考链接

  • https://www.cnblogs.com/wangshide/archive/2012/01/07/2315830.html

相关文章: