本篇结构:

  • 背景
  • OpenCL是什么
  • 框架组成
  • 基本概念
  • 编写OpenCL程序的基本步骤
  • 参考博文

一、背景

在过去利用GPU对图像渲染进行加速的技术非常成熟,因为GPU是典型的单指令多数据(SIMD)的体系结构,擅长大规模的并行计算;而CPU是多指令单数据流(MISD)的体系结构,更擅长逻辑控制。

在当今数据量计算越发庞大的情况下,为了提升计算效率,人们希望将GPU大规模的并行计算的能力扩展到更多领域,而不只局限与图像渲染。这样,CPU只负责逻辑控制,GPU更多负责计算,这种一个CPU(控制单元)+几个GPU(有时可能再加几个CPU)(计算单元)的架构就是所谓的异构编程。

OpenCL就是这种情况下出现的,它是一种异构计算的标准,可以用来针对GPU编程。其实在OpenCL出来之前,NVIDIA就推出了GPGPU计算CUDA架构。只不过CUDA只能使用自家的N卡,对其他显卡不支持,而OpenCL则是一个通用的标准,对A卡,N卡等都支持,还支持CPU计算

关于GPU和CPU的区别,可以参考我之前的博文GPU编程–CPU和GPU的设计区别。

二、OpenCL是什么

OpenCL(全称为Open Computing Langugae,开放运算语言)是第一个面向异构系统(此系统中可由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式标准。它是跨平台的。

OpenCL由两部分组成,一是用于编写kernels(在OpenCL设备上运行的函数)的语言二是用于定义并控制平台的API(函数)。OpenCL提供了基于任务和基于数据两种并行计算机制,它极大地扩展了GPU的应用范围,使之不再局限于图形领域。

OpenCL是一种标准,intel、Nvidia、ARM、AMD、QUALCOMM、Apple都有其对应的OpenCL实现。像NVDIA将OpenCL实现集成到它的CUDA SDK中,而AMD则将其实现后放在AMD APP (Accelerated Paral Processing)SDK中…

三、框架组成

这些概念可能会比较难理解,没关系,后续看了一些相关的例子应该就容易理解了。

  • OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义为OpenCL应用创建上下文(上下文表示的是程序运行时所拥有的所有软硬件资源+内存+处理器)的函数。这里的平台指的是宿主机、OpenCL设备和OpenCL框架的组合。
  • OpenCL运行时API:平台API主要用来创建上下文,运行时API则强调使用这个上下文满足应用需求的函数集,用来管理上下文来创建命令队列以及运行时发生的其它操作。例如,将命令提交到命令队列的函数。
  • OpenCL编程语言:用来编写内核代码的编程语言,基于ISO C99标准的一个扩展子集,通常称为OpenCL C编程语言。

四、基本概念

OpenCL程序同CUDA程序一样,也是分为两部分,一部分是在主机(以CPU为核心)上运行,一部分是在设备(以GPU为核心)上运行。设备有一个或多个计算单元,计算单元又包含一个或多个处理单元。在设备上运行的程序被称为核函数。但是对于核函数的编写,CUDA一般直接写在程序内,OpenCL是写在一个独立的文件中,并且文件后缀是.cl,由主机代码读入后执行,这一点OpenCL跟OpenGL中的渲染程序很像。

下面参考上图,简单汇总一些OpenCL中的基本概念,在后续的OpenCL四个模型中也会再提到:

  • OpenCL平台由两部分组成,宿主机和OpenCL设备:

    • 宿主机Host:宿主机一般为CPU,扮演组织者的角色。其作用包括定义kernel、为kernel指定上下文、定义NDRange和队列等;队列控制着kernel如何执行以及何时执行等细节。
    • 设备Device:通常称为计算设备,可以是CPU、GPU、DSP或硬件提供以及OpenCL开发商支持的任何其他处理器。
  • SIMT(Single Instruction Multi Thread): 单指令多线程,GPU并行运算的主要方式,很多个多线程同时执行相同的运算指令,当然可能每个线程的数据有所不同,但执行的操作一致。

  • 核函数(Kernel): 是在设备程序上执行运算的入口函数,在主机上调用。

  • 工作项(Work-item): 跟CUDA中的线程(Threads)是同一个概念,N多个工作项(线程)执行同样的核函数,每个Work-item都有一个唯一固定的ID号,一般通过这个ID号来区分需要处理的数据。

  • 工作组(Work-group):跟CUDA中的线程块(Block)是同一个概念,N多个工作项组成一个工作组,Work-group内的这些Work-item之间可以通信和协作。

  • ND-Range: 跟CUDA中的网格是同一个概念,定义了Work-group的组织形式。

  • 上下文(Context): 定义了整个OpenCL的运行环境,包括Kernel、Device、程序对象和内存对象:

    • 设备:OpenCL程序调用的计算设备。
    • 内核:在计算设备上执行的并行程序。
    • 程序对象:内核程序的源代码(.cl文件)和可执行文件。
    • 内存对象:计算设备执行OpenCL程序所需的变量。

上面只简单列了部分概念,不完全,解释也很简略,目的只是提供一个对OpenCL的简单认识,后续再慢慢加深加全对OpenCL涉及到的概念理解。

五、编写OpenCL程序的基本步骤

1)获取平台–>clGetPlatformIDs
2)从平台中获取设备–>clGetDeviceIDs
3)创建上下文–>clCreateContext
4)创建命令队列–>clCreateCommandQueue
5)创建缓存->clCreateBuffer
6)读取程序文件,创建程序–>clCreateProgramWithSource
7)编译程序–>clBuildProgram
8)创建内核–>clCreateKernel
9)为内核设置参数–>clSetKernelArg
10)将内核发送给命令队列,执行内核–>clEnqueueNDRangeKernel
11)获取计算结果–>clEnqueueReadBuffer
12)释放资源–>clReleaseXX**

六、参考博文

OpenCL:一种异构计算架构

GPU编程--OpenCL基本概念相关推荐

  1. GPU并行计算OpenCL(1)——helloworld

    GPU并行计算OpenCL(1)--helloworld 随着现在GPU越来越强大,我们看论文的时候经常听到GPU加速的某某某算法,但是到底如何进行加速呢?CUDA可能大家更加熟悉(奈何电脑是MAC) ...

  2. 《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.3节, 作 者 Multicore and GPU Programming: An Integrated ...

  3. 从头开始进行CUDA编程:Numba并行编程的基本概念

    作者 | CarlosCosta 编辑 | 极市平台 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[模型部署]技术交流群 后台回复[ ...

  4. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  5. Metal:对 iOS 中 GPU 编程的高度优化的框架

    原文出处: Max Christ and Warren Moore   译文出处:migrant   欢迎分享原创到伯乐头条 Metal 框架支持 GPU 加速高级 3D 图像渲染,以及数据并行计算工 ...

  6. android gpu 编程,Android设备上的GPU编程

    1)Programming Smartphone's GPU and programming other GPU (Nvidia GeForce 9 for example) are equal? 不 ...

  7. GPU编程--CPU和GPU的设计区别

    本篇结构 前言 概论 CPU简介 GPU简介 并行计算 CPU/GPU对比 适于GPU计算的场景 GPU开发环境 参考博文 一.前言 因为工作需要,需要从github上找一个CUDA的DBSCAN聚类 ...

  8. 从GPU编程到SIMT核心

    本文转自:从GPU编程到SIMT核心 - 知乎 (zhihu.com) 1.前言&本文重点 在 GPGPU 显得愈发重要的今天,仅凭 nVidia, AMD 提供的编程接口来了解 GPU 未免 ...

  9. 深度学习之GPU编程知识总结

    概念解析 首先,我们先整理一下:平时在使用一些GPU加速算法是都是在Python环境下执行,但是一般的Python代码是没办法使用GPU加速的,因为GPU是更接近计算机底层的硬件,Python一类的高 ...

最新文章

  1. python数据结构与算法:队列与双端队列
  2. IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
  3. SpringBatch批处理框架入门(一)
  4. 小程序左右标签滑块排行榜
  5. 第九篇:Spring Boot整合Spring Data JPA_入门试炼01
  6. Html前端基础(select下拉选标签、table表格标签)
  7. opencv笔记——cvCreateImage函数说明
  8. 双极性根升余弦信号qpsk_基于CCSDS协议的中频信号源设计与实现
  9. 斯坦福大学吴恩达机器学习教程中文笔记——目录
  10. 计算机组成原理输入输出系统——DMA方式
  11. WebGL varying变量和颜色插值
  12. Ruby_01_环境安装
  13. Doxygen + Graphviz 安装(windows 10系统)
  14. Latex 各种处理论文操作-插图、插表格
  15. 致敬5G时代“她力量”,那些让人怦然“兴”动的女神们
  16. 小眼睛适合大框还是小框眼镜_【图】小眼睛适合什么眼镜框 这个禁忌千万不要犯_小眼睛_伊秀服饰网|yxlady.com...
  17. e.hash oldCap == 0 详细解读
  18. 1217_使用SCons生成目标文件
  19. bilibili直播间利用python爬虫自动发送弹幕
  20. 计算机 90学时培训总结,90学时培训心得总结

热门文章

  1. 写在博客原创文章第100篇之时
  2. 不再望梅止渴,新作京东网抢先开售
  3. spring data使用操作mongodb数据库 springboot
  4. 老鱼Python数据分析——篇十一:使用matplotlib画涨停趋势图
  5. windows或者Ubuntu环境下用python实现瞳孔定位
  6. 产品经理必备技能:四象限、九宫格、用户体验要素模型
  7. 设计模式之:解剖观察者模式【z】
  8. C#丨DataGridView使表格充满整个控件
  9. 如何修改hosts文件内容
  10. 世界杯,来一起“唠嗑”呀!