您的位置:首页 > 编程语言

多核计算与程序设计 - 01 基础知识 之一 多核编程与单核多线程和分布式编程的区别

2012-09-01 15:12 627 查看
这个分类的知识来自周伟明先生的《多核计算与程序设计》一书,在此把书中对我个人帮助较大的部分整理出来,以便更容易的在工作中加以应用。

一,多核编程与单核多线程的区别



1, 锁竞争导致的串行化的区别

在单核系统中如果某个线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁和解锁的时间。并不会发生CPU空闲的现象。

但多核系统中情况发生了本质的变换,如果线程A和B使用同一把锁,但运行在不同的CPU上,如果A得到了锁,那么A线程所在CPU则处于运行状态,线程B处于阻塞状态,B线程所在CPU则处于空闲状态。我们浪费了一个CPU的运算时间。

图示:



2, 线程分解与执行的区别

在单核CPU中,对于客户端软件而言,采用多线程方式通常都是创建线程并将其放在后台执行,避免阻塞客户界面操作,提高性能。而在多CPU中,线程的分解将不再局限与此。多核CPU分解多线程是为了让计算分配到各个CPU核上去执行。大幅度提高工作效率。

3, CPU负载均衡的区别

在单核CPU中,并不需要考虑CPU间负载均衡的问题,因为无论线程如何切换,CPU始终处于工作状态,它并不会影响程序运行的总时间。但对于多核CPU,则一定要考虑负载均衡的问题,避免出现负载小的CPU出现空闲等待的现象。

加速比(speedup),是同一个任务在单处理器系统和并行处理器系统中运行消耗的时间的比率,用来衡量并行系统或程序并行化的性能和效果。

一个简单加速比的例子:

一个4核CPU有4个任务,各任务分别耗时 20ms,5ms,3ms,2ms





优化负载后个任务时间为 10ms,8ms,6ms,6ms



多核CPU的效率变为75%,提高的幅度还是很大的。

4, 任务调度策略的区别

在单核中,任务调度的主要工作是为个任务间取得一定的分时效果,简单的说就是保证优先级高的线程可以抢占CPU时间,先运行。在这种情况下程序员更多的是需要考虑任务的优先级。

在多核程序中,不单是要考虑任务的优先级,也要考虑各个任务的耗时,使负载均衡,提高加速比和CPU效率。在多核程序中,操作系统并不清楚我们任务的耗时,所以无法采用对我们程序最优化的调度策略来使负载均衡,因此,任务调度策略的选择也是程序员要考虑的问题。

5, CPU Cache存取的区别

在单核系统中,同一时刻只有一个硬件线程在执行,因此单核CPU是不存在Cache存储问题的。但在多核CPU中,情况则发生了变化。问题主要是因为CPU读取Cache时是以行为单位,如果两个硬件线程同时执行时,会造成两个硬件线程写同一Cache的问题,造成竞争降低效率。

6,任务优先级抢占的区别

在单核CPU情况下,优先级抢占调度是一种常见的调度策略。在多核CPU中,由于有多个任务可以同时在不同的核中运行,优先级在局部发生了变化,有可能发生低优先级的任务先完成的现象。在多核系统中需要重新考虑任务的调度策略。

例如:任务 T1,T2,T3,T4, 优先级为 T4 > T3 > T2 = T1,图示将表示出单核与多核在任务调度时的区别。

图示:





从图中表示情况是虽然T4的优先级高于T3,但T4并没有像单核CPU中先于T3完成而是基本时间相差不大。

二,多核编程与多机分布式编程的区别

1,共享存储与分布式存储的区别

在多机分布式环境中,每台计算机都有自己独立的存储器,它的内存不共享,如果要进行全局的共享数据,必须依赖于计算机间的通信来完成。在多核环境中,内存是共享的,对全局数据的共享不存在数据搬迁的问题,但是存在锁保护的问题。
因此多核环境在存储方面主要是锁竞争,分布式系统主要的问题是在通信开销方面。

2,分布式计算的区别

分布式计算中多机分布环境和多核环境面临同样的问题:负载均衡。
多机分布环境的负载均衡包括计算负载均衡和存储负载均衡,通常会涉及到负载搬迁的问题,通信开销较大。

多核环境中因为负载搬迁只是相当于指针的移动代价较小,可以忽略。

3,编程环境的区别

多机分布环境中一般使用消息传递编程模型,使用消息传递数据,入MPI;

多核环境中使用共享存储编程环境,入OpenMP等,当然也可以使用消息传递数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: