CUDA编程基础系列1

电压不变的情况下,一个CPU的电力消耗大约是它时钟频率的三次方。

更糟的是,若CPU产生的热量增加,即使时钟频率不变,根据硅材料的性质,CPU的功耗也会进一步增加。

Power wall(功耗墙):不断增加的无效的电能消耗,意味着要么不能充分为处理器提供电力,要么不能够有效的冷却处理器,已经达到了电子设备或芯片封装的散热极限,即功耗墙。

CUDA is an extension to the C language thatallows GPU code to be written in regular C. The code

is either targeted for the host processor(the CPU) or targeted at the device processor (the GPU). The host processorspawns multithread tasks (or kernels as they are known in CUDA) onto the GPUdevice. The GPU has its own internal scheduler that will then allocate thekernels to whatever GPU hardware is present. Provided there is enoughparallelism in the task, as the number of SMs in the GPU grows, so should thespeed of the program.

CUDA允许使用标准C进行GPU编程。其代码既适用于 CPU也适用于GPU。CPU负责派生出运行在GPU上的多线程任务(kernels),GPU设有内部调度器把这些内核程序分配到相应的GPU硬件上。假设这些任务有足够的并行度,随着GPU中流处理器簇数量的增加,程序的运算速度就会提升。

 

Tesla系列板卡并不是图形卡,既没有DVI接口,也没有VGA接口,他们是专用于科学计算的计算卡。

每个GPU包括一组SM(Streaming Multiprocessor),每个SM又包含一组SP(StreamingProcessor)或者CUDA核。

CUDA编译模型使用了和Java语言一样的编译规则——基于虚拟指令集的运行时编译。

CUDA编程在流计算的范畴吗?(待总结)
OpenCL(Open Computing Language); Direct Compute

 

CPU的替代选择:

MPI: Message Passing Interface, 是基于进程的,需要系统管理员正确地安装配置,并适合于可控的计算环境。MPI实现的并行处理表现为:在集群的各个节点上,派生出成百上千个进程,通常这些进程通过基于网络的高速通信链路(以太网或InfiniBand)显式地交换消息,以协同完成一个大的任务。在可控的集群环境下,MPI是个好的解决方案。

OpenMP: 是专门面向单个节点或单个计算机系统而设计的并行计算平台。程序员需利用编译器指令精确写出并行运算指令,然后编译器根据可用的处理器核数,自动将问题分为N部分。OpenMP希望根据底层的CPU架构实现对问题的可扩展并行处理,但CPU内部的访存带宽有限,满足不了所有核连续将数据写入内存或从内存中取出数据的要求。

Pthreads: 主要应用于LINUX上的多线程应用程序库。Pthreads和OpenMP均使用线程而不是进程,因为它是设计用来在单个节点内实行并行处理的。与OpenMP不同,线程管理和线程同步由程序员负责。

ZeroMQ: 可以链接的简单的库。0MQ使用一个跨平台的API来支持基于线程、基于进程和基于网路的通信模型。0MQ针对分布式计算而设计,连接是动态的,节点失效不会影响它的工作。

Hadoop: Google MapReduce框架的开源版本,针对的是linux平台。Hadoop概念指取来一个大数据集然后将其映射成很多小的数据块。并不是将数据发送到各个节点,而是数据集通过并行文件系统已经被划分给成百上千个节点。因此归约(reduce)步骤是把程序发送到已经包含数据的节点上。输出结果写入本地节点并保存。后续MapReduce程序取得之前的结果并以某种方式对其进行转换。由于数据实际映射到了多个节点上,因此它可应用于高容错和高吞吐率系统。

 

OpenMP强调的是在单个节点内部实现并行处理,不涉及节点间并行处理的任何概念。解决的问题只受到单个节点的处理能力、内存容量和辅存空间的限制。

MPI用于解决节点之间的并行处理,常用于定义良好的网络内的计算机集群,常用于由几千个节点组成的超级计算机系统。网络的Achilles’ heel(关键/要害)是它的互连结构,即把机器连接在一起的网络结构。通常,节点间通信是任何基于集群的解决方案中决定最大速率的关键因素。

通常情况下,CPU程序拥有的活动线程的数量,不超过其包含的物理处理核数量的两倍。

 

操作系统进行频繁的“上下文切换”(对于一组寄存器进行内容的换入、换出)。

 

进程的代码和数据的上下文均由操作系统保存。相比之下,对于线程,只有代码的上下文(一个程序或指令计数器加上一组寄存器)由操作系统保存,而是数据空间是共享的。

默认情况下,进程在一个独立的内存空间内运行,这样可确保一个进程不会影响其他进程中数据。一个错误的指针访问将引发“越界访问”异常。但数据传递只能通过进程间消息的发送和接收来完成。

 

基于任务的并行处理:操作系统是典型的任务并行的并行处理。因为各个进程是不同的、无关的。用户可在上网阅读的同时播放音乐;(更适合粗粒度并行处理方法)

流水线并行处理(pipeline parallelism):一个程序的输出作为另一个程序的输入;

coarse-grained parallelism: 粗粒度并行处理,引入许多计算能力很强的处理器,让每个处理器完成一个庞大的任务。

 

GPU实现coarse-grainedparallelism由GPU卡和GPU内核程序来执行;GPU有两种方法支持流水线并行处理模式。1. 若干内核程序被依次排列成一个执行流,然后不同的执行流并发执行;2. 多个GPU协同工作,要么通过主机来传递数据,要么直接通过PCI-E总线,以消息的形式在GPU之间直接传递数据(也叫点对点peer to peer P2P机制)。

 

Amdahl’s Law: 最大加速比等于程序执行时间最长的部分占整个程序比例的倒数;

 

基于数据的并行处理:假设CPU有4个核,现有一组数据要处理。方案1:线程0处理arr[0],线程1处理arr[1],线程2处理arr[2],线程3处理arr[3],以此类推;方案2:把数组分成4个数据块,每个线程处理数组中对应的一个数据块。对于方案1,CPU核交替地使用数据,这意味着缓存必须协调和组合来自不同CPU核心的写操作,因此方案2较好。

GPU的每个SM可处理多个数据块,每个数据块的处理被分成多个线程执行。

CPU遵循缓存一致性(cachecoherence),一个内存的写操作需要通知所有核的各个级别的缓存。因此无论何时,所有处理器核看到的内存视图是完全一样的。随着处理器核数增加,通知的开销迅速增大。

GPU是非“缓存一致”系统,不会自动更新其他核的缓存,需要由程序员写清楚每个处理器核输出的各自不同的目标区域。故GPU可扩展到一个芯片内具有大数量的核心(流处理器簇)。

 

常用的并行模式:

1.      基于循环的模式; 2. Fork/join(派生/汇集)模式  3. 分条/分块  4. 分而治之

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值