GPU及GPU通用计算编程模型简介

2023-11-05

以下内容来自网络总结:

 

         NVIDIA公司在1999年发布GeForce256时首先提出GPU(图形处理器)的概念,随后大量复杂的应用需求促使整个产业蓬勃发展至今。

    GPU英文全称Graphic Processing Unit,中文翻译为”图形处理器”。GPU从诞生之日起就以超越摩尔定律的速度发展,运算能力不断提升。业界很大研究者注意到GPU进行计算的潜力,于2003年SIGGRAPH大会上提出了GPGPU(General-purposecomputing on graphics units)的概念。GPU逐渐从由若干专用的固定功能单元(Fixed Function Unit)组成的专用并行处理器向以通用计算资源为主,固定功能单元为辅的架构转变。

    尽管GPU计算已经开始崭露头角,但GPU并不能完全替代X86解决方案,很多操作系统、软件以及部分代码现在还不能运行在GPU上,所谓的GPU+CPU异构超级计算机也并不是完全基于GPU进行计算。一般而言适合GPU运算的应用有如下特征:运算密集、高度并行、控制简单、分多个阶段执行,符合这些条件或者是可以改写成类似特征的应用程序,就能够在GPU上获取较高的性能。

    GPU是显示卡的“心脏、大脑”,也就相当于CPU在电脑中的作用,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示芯片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加速”功能。显示芯片通常是显示卡上最大的芯片(也是引脚最多的)。现在市场上的显卡大多采用NVIDIA(英伟达)和AMD两家公司的图形处理芯片。

GPU通用计算编程模型:

    GPU通用计算通常采用CPU+GPU异构模式,由CPU负责执行复杂逻辑处理和事务处理等不适合数据并行的计算,由GPU负责计算密集型的大规模数据并行计算。这种利用GPU强大处理能力和高带宽弥补CPU性能不足的计算方式以发挥计算机潜在性能,在成本和性价比方面有显著地优势。在2007年NIVDIA推出CUDA(Compute Unified DeviceArchitecture,统一计算设备架构)之前,GPU通用计算受硬件可编程性和开发方式的制约,开发难度较大。2007年以后,CUDA不断发展的同时,其他的GPU通用计算标准也被相继提出,如由Apple提出Khronos Group最终发布的OpenCL,AMD推出的Stream SDK,Microsoft则在其最新的Windows7系统中集成了DirectCompute以支持利用GPU进行通用计算。

    CUDA是一种将GPU作为数据并行计算设备的软硬件体系,硬件上NVIDIA GeForce8系列以后的GPU(包括GeForce、ION、Quadro、Tesla系列)已经采用支持CUDA的架构,软件开发包上CUDA也已经发展到CUDA Toolkit3.2(截止到2010年11月),并且支持Widows、Linux、MacOS三种主流操作系统。CUDA采用比较容易掌握的类C语言进行开发,而且正在开发适用于CUDA架构的用于科学计算的Fortran版本。无论是CUDA C-语言或是OpenCL,指令最终都会被驱动程序转换成PTX(Parallel ThreadExecution,并行线程执行,CUDA架构中的指令集,类似于汇编语言)代码,交由显示核心计算。

CUDA编程模型将CPU作为主机(Host),GPU作为协处理器(co-processor)或者设备(Device)。在一个系统中可以存在一个主机和若干个设备。CPU、GPU各自拥有相互独立的存储地址空间:主机端内存和设备端显存。CUDA对内存的操作与一般的C程序基本相同,但是增加了一种新的pinned memory;操作显存则需要调用CUDA API存储器管理函数。一旦确定了程序中的并行部分,就可以考虑把这部分计算工作交给GPU。运行在GPU上的CUDA并行计算函数称为kernel(内核函数)。一个完整的CUDA程序是由一系列的设备端kernel函数并行步骤和主机端的串行处理步骤共同组成的。这些处理步骤会按照程序中相应语句的顺序依次执行,满足顺序一致性。

CUDA SDK提供的API分为CUDA runtime API(运行时API)和CUDA driver API(驱动程序API)。CUDA runtime API在CUDA driver API的基础上进行了封装,隐藏了一些实现细节,编程更加方便。CUDA runtime API函数前都有CUDA前缀。CUDA driver API是一种基于句柄的底层接口,可以加载二进制或汇编形式的kernel模块,指定参数并启动运算。CUDA driver API编程复杂,但有时能通过直接操作硬件的执行实现一些更加复杂的功能或者获得更高的性能。由于它使用的设备端代码是二进制或者汇编代码,因此可以在各种语言中调用。CUDA driver API所有函数的前缀为cu。另外CUDA SDK也提供了CUFFT(CUDA Fast Fourier Transform,基于CUDA的快速傅立叶变换)、CUBLAS(CUDA Basic Linear Algebra Subprograms,基于CUDA的基本矩阵与向量运算库)和CUDPP(CUDA Data Parallel Primitives,基于CUDA的常用并行操作函数)等函数库,提供了简单高效的常用函数供开发者直接使用。

从CUDA Toolkit3.0开始支持NVIDIA最新的Fermi架构,最大程度上利用Fermi架构在通用计算方面的优势。CUDA 3.0也开始支持C++的继承和模板机制提高编程灵活性,同时CUDA C/C++内核现在以标准ELF格式进行编译,开始支持硬件调试,还增加了一个新的Direct3D、OpenGL统一协作API,支持OpenGL纹理和Direct3D 11标准,支持所有的OpenCL特征。

NVIDIA宣布最新版并行计算开发工具CUDA 6,相比此前的CUDA5.5有着革命性的巨大进步。CUDA 6的关键特性包括:同一寻址,可直接访问CPU内存、GPU显存,无需在彼此之间手动拷贝数据,可在大量编程语言中更简单地添加GPU加速支持。

OpenCL(Open Computing Language,开放计算语言)是一个为异构平台编写程序的框架,此异构平台可由CPU、GPU或其他类型的处理器组成。OpenCL由用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分区和数据分区的并行计算机制。

OpenCL最初由Apple公司开发,Apple拥有其商标权,并在与AMD,IBM,Intel和NVIDIA技术团队的合作之下初步完善。随后,Apple将这一草案提交至Khronos Group。2008年6月16日,Khronos的通用计算工作小组成立。5个月后的2008年11月18日,该工作组完成了OpenCL 1.0规范的技术细节。该技术规范在由Khronos成员进行审查之后,于2008年12月8日公开发表。2010年6月14日,OpenCL1.1 发布。

OpenCL也是基于C的一个程式语言,分为Platform Layer、Runtime、Compiler三个部分:Platform Layer用来管理计算装置,提供初始化装置的界面,并用来建立compute contexts和work-queues。Runtime用来管理资源,并执行程序的kernel。Compiler则是ISO C99的子集合,并加上了OpenCL特殊的语法。在OpenCL的执行模型中,有所谓的Compute Kernel和Compute Program。Compute Kernel基本上类似于CUDA定义的kernel,是最基本的计算单元;而Compute Program则是Compute Kernel和内建函数的集合,类似一个动态函数库。很大程度上OpenCL与CUDA Driver API比较相像

自从2008年12月NVIDIA在SIGGRAPHAsia大会上在笔记本电脑上展示全球首款OpenCL GPU演示以来,AMD、NVIDIA、Apple、RapidMind、Gallium3D、ZiiLABS、IBM、Intel先后发布他们自己的OpenCL规范实现(当一台机器上存在不同厂家的支持OpenCL的设备时,这样也给开发应用程序带来不统一的一些麻烦)。除了AMD和NVIDIA,其他厂商如S3、VIA等也纷纷发布他们支持OpenCL的硬件产品。

OpenCL是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景,AMD-ATI、NVIDIA现在的产品都支持OPEN CL。

Directcompute是一种由Microsoft开发和推广的用于GPU通用计算的应用程序接口,集成在Microsoft DirectX内,允许Windows Vista或Windows 7平台上运行的程序利用GPU进行通用计算。虽然DirectCompute最初在DirectX 11 API中得以实现,但支持DX10的GPU可以利用此API的一个子集进行通用计算(DirectX 10内集成Directcompute 4.0,DirectX 10.1内集成Directcompute 4.1),支持DirectX11的GPU则可以使用完整的DirectCompute功能(DirectX 11内集成Directcompute 5.0)。Directcompute和OpenCL都是开放标准,得到NVIDIA CUDA架构和ATI Stream技术的支持。

Windows 7增加了视频即时拖放转换功能,可以将电脑中的视频直接转换到移动媒体播放器上,如果电脑中的GPU支持Directcompute,那么这一转换过程就将由GPU完成。其转换速度将达到CPU的5-6倍。Internet Explorer 9加入了对Directcompute技术的支持,可以调用GPU对网页中的大计算量元素做加速计算,另外Excel2010、Powerpoint2010均提供Directcompute技术支持。

AMD的流计算模型其实也包含了流处理器架构和相应的软件包。AMD在2007年12月发布运行在Windows XP系统下的Steam SDK v1.0, 此SDK采用了Brook+作为开发语言,Brook+是AMD对斯坦福大学开发的Brook语言(基于ANSI C)的改进版本。Stream SDK为开发者提供对系统和平台开放的标准以方便合作者开发第三方工具。软件包包含了如下组件:支持Brook+的编译器,支持流处理器的设备驱动CAL(Compute Abstraction Layer),程序库ACML(AMD CoreMath Library)以及内核函数分析器。

在Stream编程模型中,在流处理器上执行的程序称为kernel(内核函数),每个运行在SIMD引擎的流处理器上的kernel实例称为thread(线程),线程映射到物理上的运行区域称为执行域。流处理器调度线程阵列到线程处理器上执行,直到所有线程完成后才能运行下一个内核函数。

Brook+是流计算的上层语言,抽象了硬件细节,开发者编写能够运行在流处理器上的内核函数,只需指定输入输出和执行域,无需知道流处理器硬件的实现。Brook+语言中两个关键特性是:Stream和Kernel。Stream是能够并行执行的相同类型元素的集合;Kernel是能够在执行域上并行执行的函数。Brook+软件包包含brcc和brt。brcc是一个源语言对源语言的编译器,能够将Brook+程序翻译成设备相关的IL(IntermediateLanguage),这些代码被后续链接、执行。brt是一个可以执行内核函数的运行时库,这些库函数有些运行在CPU上,有些运行在流处理器上。运行在流处理器上的核函数库又称为CAL(Compute Abstraction Layer)。CAL是一个用C编写的设备驱动库,允许开发者在保证前端一致性的同时对流处理器核心从底层进行优化。CAL提供了设备管理、资源管理、内核加载和执行、多设备支持、与3D 图形API交互等功能。同时,Stream SDK也提供了常用数学函数库ACML(AMD Core Math Library)供开发者快速获得高性能的计算。ACML包括基本完整的线性代数子例程、FFT运算例程、随机数产生例程和超越函数例程。

面对NVIDIA在GPU通用计算上的不断创新,AMD也不甘示弱,不断改进自己的Stream SDK。截止到2010年11月,AMD发布了Stream SDK v2.2,能够在WindowsXP SP3、Windows 7和部分Linux发行版上运行,开始支持OpenCL 1.1规范和双精度浮点数操作。

 

参考文献:

1、  http://baike.baidu.com/view/1196.htm

2、  http://www.cnblogs.com/chunshan/archive/2011/07/18/2110076.html

3、  http://blog.csdn.net/caiye917015406/article/details/9166115

4、  http://www.rosoo.net/a/201306/16652.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU及GPU通用计算编程模型简介 的相关文章

  • 推力:填充隔离空间

    我有一个像这样的数组 0 0 010 0 0 05 0 0 3 0 0 0 8 0 0 我希望每个非零元素一次扩展一个元素 直到它到达其他非零元素 结果是这样的 1 1 111 1 5 55 5 3 3 3 3 8 8 8 8 有什么办法可
  • Java 中 GPGPU/CUDA/OpenCL 的最佳方法?

    图形处理单元上的通用计算 GPGPU http en wikipedia org wiki GPGPU 是一个非常有吸引力的概念 可以利用 GPU 的强大功能进行任何类型的计算 我喜欢使用 GPGPU 进行图像处理 粒子和快速几何运算 目前
  • 何时使用 cudaHostRegister() 和 cudaHostAlloc()? “固定或页面锁定”内存是什么意思? OpenCL 中哪些是等效的?

    我刚刚接触 Nvidia 的 API 有些表达对我来说不太清楚 我想知道是否有人可以帮助我了解何时以及如何以简单的方式使用这些 CUDA 命令 更准确地说 在研究如何通过内核并行执行 例如使用 CUDA 来加速某些应用程序时 在某些时候我面
  • 在混合供应商的硬件上运行 OpenCL

    我一直在他们的 Stream 2 0 beta 中使用 ATI OpenCL 实现 当前测试版中的 OpenCL 目前仅使用 CPU 下一版本应该支持 GPU 内核 我下载 Stream 是因为我的工作机器上有 ATI GPU 我编写的软件
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • 使用 GPU PyOpenCL 优化 python 代码的不同方法:内核 GPU/PyOpenCL 内的 extern 函数

    我使用以下命令来分析我的 Python 代码 python2 7 m cProfile o X2 non flat multiprocessing dummy prof X2 non flat py 然后 我可以全局可视化不同贪婪函数的重新
  • OpenGL-OpenCL 互操作传输时间 + 位图纹理

    两部分问题 我正在开展一个学校项目 使用生命游戏作为实验 gpgpu 的工具 我使用 OpenCL 和 OpenGL 进行实时可视化 目标是让这个东西尽可能大 更快 经过分析 我发现帧时间主要由 CL 获取和释放 GL 缓冲区决定 并且时间
  • 如何在 OpenCL 中验证波前/扭曲大小?

    我使用的是 AMD Radeon HD 7700 GPU 我想使用以下内核来验证波前尺寸是否为 64 kernel void kernel test warpsize global T dataSet uint size size t id
  • OpenCL:头文件的附加目录

    OpenCL 规范中写道5 6 3 构建选项 5 6 3 1 预处理器选项 I dir Add the directory dir to the list of directories to be searched for header f
  • 为什么 AMD GCN 使用非零 NULL?

    这次提交 https reviews llvm org rL289252 says In amdgcn https en wikipedia org wiki Graphics Core Next目标 全局 常量和通用地址空间中的空指针取值
  • OpenCL clGetPlatformIDs 异常

    我使用此包安装附带的示例中的 HelloWorld 示例 AMD 套件 http developer amd com tools and sdks heterogeneous computing amd accelerated parall
  • opencl支持布尔变量吗?

    openCL 支持布尔变量吗 我目前正在使用 JOCL java 编写我的 openCL 调用代码 但我没有看到任何有关布尔值的信息 tl dr 是的 但是你应该在内核函数签名中避免它 是的 但a的大小bool is not定义的 因此 它
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • OpenCL 内置函数“选择”

    我不清楚内置 OpenCL 函数的目的是什么select 有人可以澄清一下吗 来自 OpenCL 规范 功能选择 基因型a 基因型b 基因型c 返回 对于向量类型的每个分量 结果 i 如果设置了 c i 的 MSB b i a i 在这种情
  • 如何在 Docker 容器内运行 OpenCL + OpenGL?

    目的是在 Docker 容器内运行 OpenCL OpenGL 互操作 应用程序 但我还没有成功 Intro 我有配备 NVidia 显卡的笔记本电脑 因此我认为利用 NVidia Dockerfiles 1 2 将是一个很好的起点 以下
  • 空的 openCL 程序抛出弃用警告

    我下载了 AMD APP 3 0 SDK 一旦包含 include
  • 如何在 Windows 上的 nvidia GPU 的 Visual Studio 2010 中配置 OpenCL?

    我在华硕笔记本电脑上的 Wwindows 7 操作系统上使用 NVIDIA GeForce GTX 480 GPU 我已经为 CUDA 4 2 配置了 Visual Studio 2010 如何在 Visual Studio 2010 上为
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • 在 OpenCL 内核中使用 _ 常量限定符

    我在使用时遇到问题 持续的我的 OpenCL 内核中的限定符 我的平台是雪豹 我尝试在 GPU 上初始化 CL 只读内存对象 将常量数组从主机复制到其中 然后我设置内核参数就像 global内存参数 但这不起作用 但我没有看到任何错误或警告
  • 如何在 C 中将向量参数传递给 OpenCL 内核?

    我在将向量类型 uint8 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题 在主机中 我将数据存储在数组中 cl uint dataArr 8 1 2 3 4 5 6 7 8 我的真实数据不仅仅是 1 8 这只是为了便于解

随机推荐

  • Linux(云计算)期末复习资料

    1 linux概述 Linux是一种自由 开放源代码的操作系统 它最初由芬兰的Linus Torvalds在1991年开发 目前已经成为世界上最流行的操作系统之一 Linux操作系统的特点是免费 稳定 安全 可定制 可移植性强 支持多任务
  • mysql索引 文件坏了_MySQL索引失效的几种情况

    1 索引无法存储null值 a 单列索引无法储null值 复合索引无法储全为null的值 b 查询时 采用is null条件时 不能利用到索引 只能全表扫描 为什么索引列无法存储Null值 a 索引是有序的 NULL值进入索引时 无法确定其
  • ASTM 协议

    ASTM 协议为标准组织美国材料实验室协会 ASTM 制定的在医疗临床实验室仪器和计算机系统间传输信息的一个标准 此标准有多个版本 本文中提到的版本为 E1394 97 下文中提到的 ASTM 均为 ASTM 的 E1394 97 是在 1
  • Kettle系列(一)下载安装与基础配置

    Kettle系列 一 下载安装与基础配置 说明 一 下载 二 目录结构 三 基础配置 1 环境变量 2 kettle配置 四 连接mysql8 五 连接其他数据库 六 总结 说明 更新时间 2023 08 13 17 47 本文记录了win
  • spring cloud系列学习(十、 使用Spring Security实现OAuth2授权认证存储redis)

    1 新增spring boot 导包
  • AOP获取方法返回值

    我们用Spring的AOP切面做日志收集或者记录的时候 在springboot中用 Aspect注解 比如 Aspect public class AdviceTest Before execution com abc service ma
  • xtu p1040 汉诺塔

    描述 约19世纪末 在欧州的商店中出售一种智力玩具 在一块铜板上有三根杆 最左边的杆上自上而下 由小到大顺序串着由64个圆盘构成的塔 目的是将最左边杆上的盘全部移到中间的杆上 条件是一次只能移动一个盘 且不允许大盘放在小盘的上面 这是一个著
  • Windows 7 64位机上搭建Android开发环境

    1 从http www oracle com technetwork java javase downloads jdk7 downloads 1880260 html下载Java JDK 根据机子本身配置 选择jdk 7u25 windo
  • Java整合GPT-3.5和GPT-4,让PPT制作变得更加轻松智能化

    在当今的商业环境中 PPT演示文稿已成为一种重要的沟通工具 然而 创建高质量的PPT往往耗时且繁琐 基于这个痛点 本文将介绍如何使用Java整合GPT 3 5 4 根据PPT模板自动生成完整的PPT 我们将使用Apache POI库操作来P
  • 通过ref使元素动态高度

    observeResize this nextTick gt const moreEditBoxHeight new ResizeObserver entries gt for let entry of entries 执行其他操作 let
  • centos8 安装docker环境

    CentOS8官方源不可用 需要切换到阿里云的centos8的源 先安装yum utils组件后 再增加docker源后 才可以进行docker的安装使用 备份centos8原有源信息 cp r etc yum repos d etc yu
  • 谈谈滞后补偿器与PI控制及其原理分析

    本文一览 1 什么是滞后补偿器以及和PI控制的联系 2 PI控制对系统的影响 1 什么是超前补偿器以及和PI控制的联系 上一篇文章提到了超前补偿器 超前这个词的含义就是相位提前 相位提前所带来的的好处就是减少振荡 加快系统的稳定 但是使用超
  • Android 状态栏、标题栏、屏幕高度

    http xqjay19910131 yahoo cn iteye com blog 1435249 android 状态栏 标题栏 屏幕高度 博客分类 android app 1 获取状态栏高度 decorView是window中的最顶层
  • VS2019配置Qt5.14.2以及在线配置Qt5.15.2

    简单记录下配置过程 一 配置Qt5 14 2 1 官网下载QT Index of archive qt 5 14 5 14 2 2 下载后 双击exe进行安装 博主这里安装到了目录D Qt Qt5 14 2 结合自己的路径 完毕后 环境变量
  • php关注获取微信code,基于PHP方法,微信公众号小程序获取code,access_token,openid,用户信息...

    发起获得code值链接 public function doPageGetcode appid yourappid 修改你的appid if appid return this gt result 10008 参数错误 这里的 redire
  • 蓝桥杯(Java) -day03

    1 蓝桥杯 Java day01 2 蓝桥杯 Java day02 一 滑行 蓝桥杯 2023省赛模拟题 滑行 问题描述 小蓝准备在一个空旷的场地里面滑行 这个场地的高度不一 小蓝用一个 n 行 m 列的矩阵来表示场地 矩阵中的数值表示场地
  • Flutter 图片选取及裁剪

    在开发项目里修改用户头像的功能 涉及到图片选取及裁剪 基本实现步骤如下 1 pubspec yaml 添加 image picker 1 0 1 image cropper 4 0 1 dependencies image picker 1
  • VMware ESXI 6 开启VT-x硬件虚拟化技术

    一般虚拟化主ESXi都会开启BIOS中的CPU虚拟化技术 INTEL叫VT x AMD的叫AMD V ESXI 6 0 CPU虚拟化是在web端设置的 在客户端vSphere中没有这个设置 切记
  • Qt中的坐标体系和内存回收

    目录 坐标体系 窗口的坐标原点 窗口的相对坐标 示例 内存回收 1 自动垃圾回收机制 2 对象树机制 示例 坐标体系 窗口的坐标原点 在Qt中 坐标系统一般是以窗口左上角为原点 向右为正方向X轴 向下为正方向Y轴 窗口的相对坐标 在一个 Q
  • GPU及GPU通用计算编程模型简介

    以下内容来自网络总结 NVIDIA公司在1999年发布GeForce256时首先提出GPU 图形处理器 的概念 随后大量复杂的应用需求促使整个产业蓬勃发展至今 GPU英文全称Graphic Processing Unit 中文翻译为 图形处