OpenCL架构

OpenCL提供了一种统一的编程接口,使得程序员可以编写一次代码,然后在多种处理器上运行。

平台模型

  • OpenCL平台总是包括一个宿主机(host)。宿主机与OpenCL程序外部的环境交互,包括I/O或与程序用户的交互。宿主机与一个或多个OpenCL设备连接。OpencL设备通常称为计算设备,设备可以是CPU,GPU、DSP或硬件提供以及OpenCL开发商支持的任何其他处理器。
  • OpenCL进一步划分为计算单元,而计算单元还可以进一步划分为一个或多个处理单元。

执行模型

执行模型主要指出内核如何执行,它们与宿主机如何交互,以及它们与其他内核如何交互。主要目的是宿主机如何利用OpenCL设备的计算资源完成高效的计算处理过程。这也是一个“以硬件为中心”的模型。

  • OpenCL应用由两个不同部分组成:宿主机程序(host program)和一个或多个内核(kernel)组成的集合。
    PS:内核通常指的是一些简单的函数,将输入内存对象转换为输出内存对象。
  • OpenCL定义了两类内核:
    • OpenCL内核:用OpenCL C编程语言编写并用OpenCL编译器编译的函数。所有OpenCL实现都必须支持OpenCL内核。
    • 原生内核:OpenCL之外创建的函数,在OpenCL中可以通过一个函数指针来访问。

内存模型

目的是解决宿主机(Host)和OpenCL设备怎么处理数据
OpenCL定义了两种类型的内存对象:缓冲区对象和图像对象。

缓冲区对象: 就是内核可用的一个连续的内存区。
图像对象: 图像对象仅限于存储图像,图像内存对象是一个不透明的对象,图像对象的内容对于内核程序是隐藏的。

OpenCL内存模型定义了5种不同的内存区域,分别是:宿主机内存、全局内存、常量内存、局部内存和私有内存。

编程模型

使用编程模型将并行算法映射到OpenCL。
OpenCL定义了两种不同的编程模型:任务并行和数据并行

  • 数据并行编程模型:
    数据并行关注于在多个处理器核心之间同时执行相同的操作,但处理不同的数据元素。数据并行模型中一个任务分解成针对数据集各元素的多个相同子任务。然后将这些子任务分配给不同的处理核心。。例如:一个数组中的所有元素分别乘以2,在这种情况下,我们可以让许多个处理器并行计算,一个处理器负责一个数组元素的乘法运算。数据并行更适用于那些需要对大量数据执行相同操作的任务。

  • 任务并行编程模型:
    任务并行关注于在多个处理器核心之间执行不同的任务。每个核心运行一个独立的、不同的任务,但可能共享某些资源(比如内存)。这种并行模式有助于在多核处理器系统上提高吞吐量。任务并行更适用于那些一组组相互独立、没有什么相关性或直接联系的计算任务。

个人理解编程模型:其实就是将从CL代码中创建程序对象并编译,在运行时创建kernel(相关函数)对象以及内存对象,设置好相关的参数和输入之后,就可以将kernel送入到队列中执行,最终等待运算结束,获取计算结果即可。

其他编程模型

程序员完全可以结合OpenCL的编程模型来创建各种复合编程模型

posted @ 2023-08-15 22:00  九叶草  阅读(58)  评论(0编辑  收藏  举报