GPU 编程可以称为异构编程,最近由于机器学习的火热,很多模型越来越依赖于GPU来进行加速运算,所以异构计算的位置越来越重要;异构编程,主要是指CPU+GPU或者CPU+其他设备(FPGA等)协同计算。当前的计算模型中,CPU主要用来进行通用计算,其更多的是注重控制,我们可以通过GPU和FPGA等做专用的计算。

CPU负责逻辑性强的事物处理和串行计算,GPU则专注于执行高度线程化的并行处理任务(大规模计算任务)

编程框架:

  • C++ AMP:Accelerator Massive Parallelism :C++的异构并行模型.
  • CUDA:Compute Unified Device Architecture :显卡厂商Nvidia于2007年推出的业界第一款异构并行编程框架。
  • OpenCL (Open Computing Language):业界第一个跨平台的异构编程框架。它是Apple领衔并联合Nvidia,AMD,IBM,Intel等众多厂商于2008年共同推出的一个开放标准,由单独成立的非营利性组织Khronos Group管理。与C++ AMP类似,OpenCL作为一个开放的标准,并不局限于某个特定的GPU厂商。

三种异构编程框架,对比来看:CUDA和OPENCL 比 C++ AMP 更接近于硬件底层,所以前两者性能较好,C++ AMP 相对前两者 具有较高的易编程性;

三种框架的选择:

  • 看重易用性:C++ AMP, Windows 平台,C++ 本身也是一个开放的标准,目前只有微软自己做了实现;
  • 看重NvidiaGPU卡上的高性能:CUDA;有大厂的直接支持,CUDA的开发环境也非常成熟,拥有很多函数库的支持;
  • 看重不同平台间的可移植性:OpenCL可能是目前最好的选择;(相对于OPENCL 你可能会听说过 OPENCV,OPENGL,OPENAL 等标准)opencl 得到了很多软硬件厂商的大力支持。

异构计算中常见的组合:

通用处理器对协处理器之间,主要考虑一些几个方面:协处理器能全面支持需要用到的场景关键算法(算法性能);协处理器需要有大量并行通道,每个通道支持低延时的数据处理(数据并行和低延时处理能力);和主处理器能方便得进行数据交互(接口性能较好);协处理器可以针对计算需求升级迭代(配置灵活);协处理器更低的运行成本,更小的空间占用和更简单的热处理方案(低功耗);

  • CPU+GPU

    • GPU 中,大量的硬件资源被用于逻辑运算单元,小部分用作控制电路,GPU中一个控制单元要负责好几个计算单元,其为大规模数据并行处理提供了基础;使用GPU做异构计算需要考虑GPU Memory 和 System Memory数据相关性和尽量减少异构计算过程中的控制分支;
  • CPU+FPGA
    • FPGA 优点:

      • 稳定性:驱动层控制硬件,减少了系统抢占带来的风险;
      • 性能:利用硬件并行的优势,打破了顺序执行的模式;硬件控制层面控制IO输入和输出达到了专业需求能力;
      • 维护性高:FPGA可以现场升级,无需重新设计ASIC所需要的时间和费用投入;
      • 成本:比定制化的ASIC便宜,可自定义编程使用;
  • CPU+ASIC
    • ASIC 为Application Specific Integrated Circuit, 特殊定制集成电路。编程语言越接近底层硬件,运行速度越快。
    • 性能方面:ASIC > FPGA > GPU;
    • 缺点:由于ASIC 定制化,导致价格较为高昂,定制过程漫长,而且功能一旦定制就很难再去更改;

CPU 与 GPU 体系结构:

 CPU 是一种低延迟的设计:

  • 强大的ALU,拥有较高的时钟频率;
  • 容量较大的cache,包括L1,L2,L3三级高速缓存,现在基本上是片上cache,cache占据相当一部分片上空间;
  • CPU有复杂的控制逻辑,如:复杂的流水线(pipeline)、分支预测(branch prediction)、乱序执行(Out-of-order execution)等;
  • 这些导致了,cpu使用较少的资源用于ALU 计算单元;

 GPU是一种面向吞吐的设计:

  • GPU 有大量的ALU;
  • cache很小,缓存为thread提高服务,而不是保存后面需要访问的数据,这点和CPU不同;
  • 没有复杂的控制逻辑,没有分支预测等这些组件;
  • 于CPU对比起来,CPU擅长处理逻辑负载,串行的计算任务;而GPU擅长的是大规模的数据并行的计算任务;

参考链接:

http://hustcat.github.io/gpu-architecture/

https://www.huzhenyu.me/

https://www.cnblogs.com/biglucky/p/4223565.html

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

http://haifux.org/lectures/267/Introduction-to-GPUs.pdf (推荐)

资源多整理自网络,保持更新,如果对您有帮助,请关注 cnblogs.com/xuyaowen

GPU 编程相关 简要摘录的更多相关文章

  1. RDMA 相关 简要摘录

    RDMA (Remote Direct Memory Access) 全称为 远程直接内存访问 其出现的目的:为了解决网络传输中服务端数据处理的延迟而产生的.其将数据直接从一台计算机的内存传输到另一台 ...

  2. 第一篇:GPU 编程技术的发展历程及现状

    前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构 ...

  3. Point : GPU编程的艺术!一切的历史!

    Point: 渲染渲染,神奇的渲染!! ———————————————— 只要你走的足够远,你肯定能到达某个地方. 1"GPU编程" History ————————— //由于笔 ...

  4. 《CUDA并行程序设计:GPU编程指南》

    <CUDA并行程序设计:GPU编程指南> 基本信息 原书名:CUDA Programming:A Developer’s Guide to Parallel Computing with ...

  5. GPU编程和流式多处理器(四)

    GPU编程和流式多处理器(四) 3.2. 单精度(32位) 单精度浮点支持是GPU计算的主力军.GPU已经过优化,可以在此数据类型上原生提供高性能,不仅适用于核心标准IEEE操作(例如加法和乘法),还 ...

  6. GPU编程和流式多处理器(三)

    GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...

  7. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...

  8. Linux环境编程相关的文章

    Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...

  9. Arduino使用注意问题及编程相关

    1.Arduino的概念 arduino是一款便捷灵活方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE), 是一个基于开放原始码的软硬件平台,构建于开放 ...

随机推荐

  1. vscode 设置免密远程

    第一步: 生成秘钥 ssh-keygen -t rsa 生成 id_rsa id_rsa.pub cat id_rsa.pub >>  authorized_keys 将私钥文件id_rs ...

  2. 高级Java开发人员最常访问的几个网站

    这是高级Java开发人员最常访问的几个网站. 这些网站提供新闻,一般问题或面试问题的答案,精彩的讲座等.质量是优秀网站的关键因素,这此网站都有较高的质量内容.下面逐一介绍: 1. Stackoverf ...

  3. C# 网络编程之简易聊天示例

    还记得刚刚开始接触编程开发时,傻傻的将网站开发和网络编程混为一谈,常常因分不清楚而引为笑柄.后来勉强分清楚,又因为各种各样的协议端口之类的名词而倍感神秘,所以为了揭开网络编程的神秘面纱,本文尝试以一个 ...

  4. 线程提供的方法:static void sleep(long ms),会进入阻塞状态,休眠

    package seday08.thread; import java.util.Scanner; /*** @author xingsir * 线程提供的方法:static void sleep(l ...

  5. C#报Lc.exe已退出 代码为-1 错误解决方法

    解决方法一:用记事本打开*.licx,里面写的全是第三方插件的指定DLL,删除错误信息,保存,关闭,重新生成解决方案. 解决方法二:把项目文件夹下Properties文件夹下的licenses.lic ...

  6. [转]smtplib.SMTPDataError: (554, b'DT:SPM的异常

    本文转自:https://blog.csdn.net/mapeifan/article/details/82428493 python 发送邮件,出现如下异常 异常如下: smtplib.SMTPDa ...

  7. Xcode真机运行报错iPhone has denied the launch request

    1.打开钥匙串 ->Apple Worldwide Developer Relations Certification Authority ->双击 并点击信任->选择使用系统默认2 ...

  8. Anaconda创建环境失败,提示无法定位程序输入点

    https://blog.csdn.net/qq_37465638/article/details/100071259 这篇博客写得很清楚,是anaconda下Library下lib下的一个文件和DD ...

  9. APScheduler学习

    说明 APScheduler是一个 Python 定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及 crontab 类型的任务,并且可以持久化任务.并以 daemon 方式运行应用. ...

  10. SpringMVC 简单限流方案设计

    一.概念 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理. 常用的限流算法有两种:漏桶算法和令牌桶算法: ...