二 从 GPU 的角度理解并行计算

前言

  本文从使用 GPU 编程技术的角度来了解计算中并行实现的方法思路。

并行计算中需要考虑的三个重要问题

  1. 同步问题

    在操作系统原理的相关课程中我们学习过进程间的死锁问题,以及由于资源共享带来的临界资源问题等,这里不做累述。

  2. 并发度

    有一些问题属于 “易并行” 问题:如矩阵乘法。在这类型问题中,各个运算单元输出的结果是相互独立的,这类问题能够得到很轻松的解决 (通常甚至调用几个类库就能搞定问题)。

    然而,若各个运算单元之间有依赖关系,那问题就复杂了。在 CUDA 中,块内的通信通过共享内存来实现,而块间的通信,则只能通过全局内存。

    CUDA 并行编程架构可以用网格 (GRID) 来形容:一个网格好比一只军队。网格被分成好多个块,这些块好比军队的每个部门 (后勤部,指挥部,通信部等)。每个块又分成好多个线程束,这些线程束好比部门内部的小分队,下图可帮助理解:

    

  3. 局部性

    在操作系统原理中,对局部性做过重点介绍,简单来说就是将之前访问过的数据 (时间局部性) 和之前访问过的数据的附近数据 (空间局部性) 保存在缓存中。

    在 GPU 编程中,局部性也是非常重要的,这体现在要计算的数据应当在计算之前尽可能的一次性的送进显存,在迭代的过程中一定要尽可能减少数据在内存和显存之间的传输,实际项目中发现这点十分重要的。

    对于 GPU 编程来说,需要程序猿自己去管理内存,或者换句话来说,自己实现局部性。

并行计算的两种类型

  1. 基于任务的并行处理

    这种并行模式将计算任务拆分成若干个小的但不同的任务,如有的运算单元负责取数,有的运算单元负责计算,有的负责... ... 这样一个大的任务可以组成一道流水线。

    需要注意的是流水线的效率瓶颈在于其中效率最低的那个计算单元。

  2. 基于数据的并行处理

    这种并行模式将数据分解为多个部分,让多个运算单元分别去计算这些小块的数据,最后再将其汇总起来。

  一般来说,CPU 的多线程编程偏向于第一种并行模式,GPU 并行编程模式则偏向于第二种。

常见的并行优化对象

  1. 循环

    这也是最常见的一种模式,让每个线程处理循环中的一个或一组数据。

    这种类型的优化一定要小心各个运算单元,以及每个运算单元何其自身上一次迭代结果的依赖性。

  2. 派生/汇集模式

    该模式下大多数是串行代码,但代码中的某一段可以并行处理。

    典型的情况就是某个输入队列当串行处理到某个时刻,需要对其中不同部分进行不同处理,这样就可以划分成多个计算单元对改队列进行处理 (也即派生),最后再将其汇总 (也即汇集)。

    这种模式常用于并发事件事先不定的情况,具有 “动态并行性”。

  3. 分条/分块模式

    对于特别庞大的数据 (如气候模型),可以将数据分为过个块来进行并行计算。

  4. 分而治之

    绝大多数的递归算法,比如快速排序,都可以转换为迭代模型,而迭代模型又能映射到 GPU 编程模型上。

    特别要说明的是,虽然费米架构和开普勒架构的 GPU 都支持缓冲栈,能够直接实现递归模型到 GPU 并行模型的转换。但为了程序的效率,在开发时间允许的情况下,我们最好还是先将其转换为迭代模型。

      

二 从 GPU 的角度理解并行计算,布布扣,bubuko.com

时间: 2024-10-28 21:38:15

二 从 GPU 的角度理解并行计算的相关文章

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

前言 本文从使用 GPU 编程技术的角度来了解计算中并行实现的方法思路. 并行计算中需要考虑的三个重要问题 1. 同步问题 在操作系统原理的相关课程中我们学习过进程间的死锁问题,以及由于资源共享带来的临界资源问题等,这里不做累述. 2. 并发度 有一些问题属于 “易并行” 问题:如矩阵乘法.在这类型问题中,各个运算单元输出的结果是相互独立的,这类问题能够得到很轻松的解决 (通常甚至调用几个类库就能搞定问题). 然而,若各个运算单元之间有依赖关系,那问题就复杂了.在 CUDA 中,块内的通信通过共

从编程角度理解什么是蜜罐

一.蜜罐定义 百度百科:蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机.网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力. 维基百科:蜜罐通常伪装成看似有利用价值的网络.数据.计算机系统,并故意设置了bug,用来吸引黑客攻击.由于蜜罐事实上并未对网络提供任何有价值的服务,所以任何对蜜罐的尝试都是可疑的.

转:如何学习SQL(第二部分:从关系角度理解SQL)

转自:http://blog.163.com/[email protected]/blog/static/285720652010950825538/ 6. 从关系角度理解SQL 6.1. 关系和表 众所周知,我们目前所用的数据库,通常都是关系数据库.关系自然在其中处于关键位置.初学数据库原理的人可能会很困惑关系和表是什么联系,如果没有清楚的理解,很可能会认为关系这个概念没有实际意义,只会引起混淆.其实这两组概念只是由于理论界与技术界的着重点不同.前者需要用一个专业的.没有歧义的概念来进行理论探

从别人的角度理解这个世界——Leo鉴书80

本书是比较系统介绍博弈论的书,写得通俗易懂,翻译也文从字顺.最为难得的是书里主要用有趣的事例说话,而且考虑到理解的难度先用"10个策略故事"在第一章为读者热身,之后才逐步展开."从别人的角度理解这个世界"是本书的主旨之一,从写法上两位作者写作时无疑首先做到了. 人生就是由一场接着一场不同的博弈组成的,小到明天出门准备穿什么衣服,大到企业甚至国家竞争策略的制定都是博弈的过程.当然,其中有些是单重零和博弈(就玩一次,只有一方最终胜出),有些是多重非零和博弈(玩很多次,最

Android Volley完全解析(四),带你从源码的角度理解Volley

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚.因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地梳理一遍.同时,这也是Volley系列的最后一篇文章了. 其实,Volley的官方文档中本身就附有了一张Volley的工作流程图,如下图所示. 多数朋友突然看到一张这样

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

原文:[.NET Core项目实战-统一认证平台]第十二章 授权篇-深入理解JWT生成及验证流程 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,

条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

条目二十八<正确理解由reverse_iterator的base()成员函数所产生的iterator的用法> 迭代器的种类一共有四种,上面已经说过了.这里就不再次写出来. 这一个条目主要是reserce_iterator和iterator的转换.可以使用base()函数来把前者转换为后者. 比如在拥有reserve_iterator,但需要用到插入,删除成员函数,那么这两个是不接受reserve_iterator作为参数的,所以需要转换为iterator再进行下一步的插入和删除元素. 以上代码

从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations

这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node 当作女方,pod 当作南方,scheduler 当作媒人,从相亲的角度理解这3个概念,不仅豁然开朗,而且很容易记住. node affinity 就是女方告诉媒人自己喜欢什么类型的男生,介绍这些类型的男生给她. taints 就是女方告诉媒人自己有哪些缺点,不能容忍这些缺点的男生请走开. tole

Android 源码系列之&lt;二&gt;从安全的角度深入理解BroadcastReceiver(上)

提起BroadcastReceiver大家都很熟悉,它和Activity,Service以及ContentProvider并称为Android的四大组件(四大金刚),可见BroadcastReceiver的重要性,今天我们主要从安全的角度来讲解称为四大组件之一的BroadcastReceiver.可能有的童靴看到这里会有疑问,BroadcastReceiver有啥好讲的,不就是先定义自己的广播接收器然后在manifest.xml文件中注册,在需要发送广播的地方调用Context的sendBroa