CUDA基础知识(2)

本文中首先是关于并行设计的基本概念和GPU技术宽泛的介绍。并行程序设计通常和硬件联系紧密。引入并行程序的目的是获得更好的性能。代价是降低可移植性。两个并行设计的标准MPI和OpenMP通过不断的修改完善而被始终使用。CUDA能够很好讲OpenMP和MPI结合在一起。一般来说线程模型适用于OpenMP,而进程模型适用于MPI。在GPU环境下需要将他们混合在一起。CUDA使用一个Block构成网格,这可以看成一个进程组成的队列。进程之间没有通信。每个线程块内部包含很多线程,采用线程-批处理方式运行,称为线程束。

这里首先谈谈并发性。并发性的首要内涵是对于一个特定的问题无需考虑使用哪种计算机的类型来求解,而只需关注求解方法中那些操作是可以并行执行的。

CUDA是很理想的并行求解平台,CUDA使用基于片上资源的、显式的通信原语来支撑线程间通信。块间通信只有通过按顺序调用多个内核程序才能实现,而且内核间通信需要使用片外全局内存。

块间通信可以使用全局内存的原子操作来实现。CUDA将问题分解成线程块的网格。每块包含多个线程。块可以按任意顺序执行。一个块一旦被执行,必须开始执行到结束。当思考CUDA程序如何实现并发处理时,应该用一种非常层次化的结构来协调几千个线程的工作。

另外我们看到数据的缓存是必需的。缓存的工作基础是空间局部性和时间局部性。对于GPU程序设计,程序员必须考虑局部性,对于一个给定的工作,应该思考需要哪些工具和零件,然后一次性把他们从硬件仓库读取出来,在工作开始时就把他们放在正确的工具柜中。一旦数据被取来,就可能把与这些数据相关的不同工作都执行了。

即便把所有的计算都移到GPU上,也需要CPU来访问辅存、装入和存回数据,同时还需要与GPU交换数据以完成输入输出。最大加速比取决于程序中计算着算术部分站整个程序的比例加上剩下的串行部分的比例。

常用的并行模式

  1. 基于循环的模式
    对于CPU,过多的线程数量可能会导致性能下降,这主要是因为上下文切换时,OS以软件的形式来完成。对缓存和内存带宽竞争的增多,也要求降低线程的数量。因此对于一个多核CPU的情况,他的划分大都要远大于面向GPU的划分粒度。当采用循环并行来处理一个串行程序时,最关键的是寻找其中的依赖关系。大多数循环是可以展开的,因此可以把内循环和外循环合并为一个循环。因为小的循环带来的循环开销相对于每次迭代完成的有效工作比较大,这些循环的效率很低。
    2.派生/汇集模式
    该模式中包含多个同步点而且仅有一部分内容是可以并行处理的,即首先运行串行代码,当运行到某一个点时候遇到一个并行区,这个并行区内的工作可以按照某种方式分布到p个处理器上。这是派生出N个线程或者进程来并行的完成这些工作。N个线程或者进程是独立的、互不相关的。当其工作完成后,则汇集起来。在OpenMP中庸编译指令语句定义可并行区,并行区中的代码被分成N个线程,随后汇集成单个线程。

对于CPU而言程序员或者多数多线程库通常按照处理器的个数来派生 相同数目的逻辑处理器线程。由于CPU创建或者删除一个线程开销很大,而且线程过多时会降低处理器的利用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值