前言

并行就是让计算中相同或不同阶段的各个处理同时进行。

目前有很多种实现并行的手段,如多核处理器,分布式系统等,而本专题的文章将主要介绍使用 GPU 实现并行的方法。

参考本专题文章前请务必搭建好 CUDA 开发平台,搭建方法可以参考上一篇文章。

GPU 并行的优缺点

优点:

1. 显存具有更大的内存带宽

2. GPU 具有更大量的执行单元

3. 价格低廉

缺点:

1. 对于不能高度并行化的工作,能带来帮助不大。

2. 对于绝大多数显卡型号,CUDA 仅支持 float 类型而不支持 double 类型运算,因此运算精度不高。

3. 目前还没有出现通用的 GPU 并行编程标准。

4. 处理前需要先将数据传输进显存,增加了一些时间开销。

5. 需要特定显卡型号(英伟达)的支持

较之 CPU ,GPU 适合一次性进行大量相同的工作,而 CPU 则比较有弹性,能同时进行变化较多的工作。

CUDA 结构

CUDA 是一种底层库,比 C/C++ 等语言以及 Open CV 之类的库更加底层,是附加在操作系统和这类程序之间的一层:

CUDA 程序架构

CUDA 架构下,程序分成两个部分:host 端和 device 端,前者在 CPU 部分执行,后者是在 GPU 部分执行。

具体的 CUDA 程序执行过程如下:

1. host 端程序先将待处理数据传递进显存

2. GPU 执行 device 端程序

3. host 端程序将结果从显存取回

如下图所示:

CUDA thread 架构

  thread 架构分成三个等级:

  1. 执行的最小单元是 thread

  2. 多个 thread 可以组成一个 block,block 中的 thread 可并行执行且可存取同一块共享的显存。但要注意的是每个 block 中的 thread 是有数量限制的。

  3. 多个 block 可以组成一个 grid,但 grid 中的 block 无法共享显存( 只能共享些别的信息 ),因此可合作度并不高。

  如下图所示:

CUDA 程序执行模式

1. CUDA 程序利用并行化来替代内存 cache,即一个 thread 需要等待内存则 GPU 会切换到另一个 thread 执行。

2. CUDA 程序对于 "分支预处理" 的实现也是采用和 1 类似的方式。

小结

本文旨在对CUDA并行编程技术做一个感性而总体的介绍,该系列后续文章将具体讲解CUDA编程技术。

第二篇:CUDA 并行编程简介的更多相关文章

  1. CUDA 并行编程简介

    前言 并行就是让计算中相同或不同阶段的各个处理同时进行.目前有很多种实现并行的手段,如多核处理器,分布式系统等.本专题的文章将主要介绍使用 GPU 实现并行的方法.参考本专题文章前请务必搭建好 CUD ...

  2. CUDA并行编程思维过程

    CUDA并行编程思维过程 1)确定应用程序中需要且可以并行化的部分 2)将并行化代码中需要用到的数据分离出来,具体方法是用API函数在并行技术设备上分配内存空间 3)用API函数将数据传输到并行计算设 ...

  3. [3]第二章 C++编程简介

    (本资料均从 internet 上进行收录整理,若要转载,请与原作者联系) 2.1  机器语言.汇编语言和高级语言 程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranl ...

  4. [转]12篇学通C#网络编程——第二篇 HTTP应用编程(上)

    本文转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/09/2316745.html 我们学习网络编程最熟悉的莫过于Http,好,我们就从 ...

  5. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式

    在进行图像处理过程中,我们常常会用到梯度迭代求解大型线性方程组.今天在用cuda对神秘矩阵进行求解的时候.出现了缺少dll的情况: 报错例如以下图: watermark/2/text/aHR0cDov ...

  6. Azure Databricks 第二篇:pyspark.sql 简介

    pyspark中的DataFrame等价于Spark SQL中的一个关系表.在pyspark中,DataFrame由Column和Row构成. pyspark.sql.SparkSession:是Da ...

  7. 第二篇:从 GPU 的角度理解并行计算

    前言 本文从使用 GPU 编程技术的角度来了解计算中并行实现的方法思路. 并行计算中需要考虑的三个重要问题 1. 同步问题 在操作系统原理的相关课程中我们学习过进程间的死锁问题,以及由于资源共享带来的 ...

  8. CUDA C++编程手册(总论)

    CUDA C++编程手册(总论) CUDA C++ Programming Guide The programming guide to the CUDA model and interface. C ...

  9. 黑客编程教程(二)Win API编程简介

    第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...

随机推荐

  1. 【LeetCode】78. Subsets (2 solutions)

    Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...

  2. PHP Token(令牌)设计应用

    转自:http://my.oschina.net/u/912810/blog/358973 <?php class GEncrypt { protected static function ke ...

  3. IO多路复用之poll

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  4. WEP无线网络密码破解

    一,五分钟实现无线WEP入侵的特点: 众所周知WEP加密入侵需要用户通过监听等方法接收到足够数量的WEP验证数据包,然后通过分析软件使用暴力破解的方法穷举法还原出WEP加密密钥的明文信息.五分钟实现无 ...

  5. struts2实现简单文件上传

    struts2 在内部已经帮我们做了很多封装的工作,我们只需要简单的写一些配置即可. 1 表单页面 <form action="${pageContext.request.contex ...

  6. AngularJS实现鼠标右键事件

    常规javascript鼠标右键直接在标签上加contextmenu="alert('a')"即可,现在angular通过directive来定义一个右键指令. app.direc ...

  7. [Jobdu] 题目1384:二维数组中的查找

    题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含 ...

  8. atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践

    atitit.Atitit.  Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ...

  9. 如何使用VIM的列编辑模式 [转]

    如何使用VIM的列编辑模式? * windows 我使用的VIM FOR WINDOWS,一直都听说VIM有列编辑模式,一直没有使用过,试了几次都失败了.今天又因为工作需要,到网上查了一下,经过不断的 ...

  10. Lucene用法10个小结 (zhuan)

    http://www.cfanz.cn/index.PHP?c=article&a=read&id=303149 *********************************** ...