并行编程2——多核体系架构

1.1  多核处理器定义

多内核处理器架构是指:芯片设计工程师在单个处理器中集成两个或多个 “执行内核(即计算引擎)”。多内核处理器可直接插入到单一处理器基座中。但是,操作系统会把它的每个执行内核作为独立的逻辑处理器,为其分配相应的执行资源。要利用多核处理器的运算能力,需要改写操作系统和编译器,广泛使用的vista, vin7 等都能支持多核体系架构。

1.2  多核发展趋势

首先思考一个问题: 为什么微处理器要从单核转向多核?

答案是: 功耗问题限制了单核不断提高性能的发展途径.
有几个简单的公式可以说明这个问题:

1)    处理器性能 = 主频 * IPC , 主频是指每秒时钟周期数,比如1Ghz,是每秒10亿个时钟周期。IPC 是每个时钟周期可以执行的指令数。

2)    处理器功耗 正比 电流*电压^2*主频, 而主频正比电压,所以

处理器功耗 正比 主频^3 ,通过主频提升性能,要面临功耗以3次方的指数增长问题。所以主频发展到一定程度后,自然转到重点依靠提高ipc来提升性能,提升IPC可以通过提高指令的并行度实现,提高并行度,一是提高微处理器微架构的并行度,二是采用多核架构,(参考 : http://blogs.intel.com/china/2007/06/03/post_5/)前者已经发展了很多年,提升空间和投入产出比明显不如后者,所有多核处理器是未来的方向。

 下面两张图看出家庭版PC和手机核心数目也很快突破10个。目前最新的mac pro 已经配备12个核心

图1 : 目前最新的mac pro 已经配备12个核心

图2 三星也推出了8核手机处理器

虽然商用多核(multicore)和众核(many-core)系统越来越普遍,成本也越来越低,游戏设备、手机等移动设备也具备越来越多的核心,并发和并行越来越成为必要的技术手段,但多核程序的发展依然没有跟上硬件的发展,很多游戏引擎和网络引擎都还是单线程的。原因就是第一章提到的多核编程的难度。

1.3 一个多核处理器架构例子

这是基于共享缓存的多核体系架构的一个例子,一共有10个核心,不需要深入了解,这张图唯一的目的就是给大家一个概念,现代的处理器架构已经比几十年前的冯诺依曼体系复杂多了(各种box),里边稍微值得关注的是Cbox ,Bbox ,这两个组件是缓存控制器,负责非常核心的功能:缓存一致性。缓存一致性会在后续文章描述。

这张图是intel多核体系架构(双路)的缓存示意图,每个core拥有自己的L1和L2缓存,属于一个物理CPU的core共享L3缓存。不同cpu之间通过QPI交互L3数据。每个CPU有自己的内存控制器。对多核编程而言,缓存是非常重要的底层概念。

1.4 Linux 线程核绑定

这么多核具体到编程是如何使用的?

在linux平台提供了核亲和性机制,进程和线程都可以通过设置亲和性绑定到不同的核心上。

进程版本:

#include <sched.h>

void setProcessToCPU(int _cpuID)

{

    cpu_set_t mask;

    cpu_set_t get;

 

    CPU_ZERO(&mask);

    CPU_SET(_cpuID, &mask);

 

    if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {

        cout << "set process affinity failed\n" << endl;

    }

    CPU_ZERO(&get);

    if (sched_getaffinity(0, sizeof(get), &get) < 0) {

        cout << "get process affinity failed\n" << endl;

    }

}

 

线程版本:

#include <pthread.h>

#include <sched.h>

void setThreadToCPU(int _cpuID)

{

    cpu_set_t mask;

    cpu_set_t get;

 

    CPU_ZERO(&mask);

    CPU_SET(_cpuID, &mask);

 

    if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

        cout << "set thread affinity failed\n" << endl;

    }

    CPU_ZERO(&get);

    if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {

        cout << "get thread affinity failed\n" << endl;

    }

}

 

转载于:https://www.cnblogs.com/jiayy/p/3243842.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
并行计算是90年代计算技术的一个重要组成部分,它在未来20年的影响可能与微处理器在过去20年的影响一样大。 事实上,随着高度集成的微处理器和内存芯片的发展,使得多处理器系统越来越具有吸引力,这两种技术紧密相连。 从速度最快的超级计算机,到部门计算服务器,再到个人桌面,多处理器已经代表了计算市场几乎每个部分的高性能终端。 在过去,计算机供应商采用一系列技术来提高整个产品线的性能。 今天,同样最先进的微处理器被广泛使用。 要获得显著的性能范围,最简单的方法是增加处理器的数量,而规模经济使这一点极具吸引力。 很快,几个处理器就可以装在一个芯片上。 4 草稿:并行计算机架构8/29/97 虽然并行计算有着悠久而丰富的学术历史,但是与商品技术的紧密结合从根本上改变了这门学科。 对基本架构和外来技术的强调已经让位于定量分析和仔细的工程权衡。 我们写这本书的目的是使新兴的多处理器系统的设计者,从适度并行的个人计算机到大规模并行的超级计算机,了解基本的架构问题和处理设计权衡的可用技术。 同时,我们希望为这些机器的软件系统设计人员提供对体系结构发展的可能方向的理解,以及确定硬件设计将遵循的特定路径的力量。 并行计算机体系结构中最近最令人兴奋的开发是传统上完全不同的方法(即共享内存、消息传递、SIMD和数据流)在一个公共机器结构上的聚合。 这部分是由于共同的技术和经济力量,部分是由于更好地理解并行软件。 这种聚合使我们能够专注于最重要的体系结构问题,并开发一个通用框架,在其中理解和评估体系结构的权衡。 此外,并行软件已经成熟到流行的并行编程模型可以在广泛的机器上使用,并且存在有意义的基准测试。 这一领域的成熟使得对硬件/软件交互进行定量和定性研究成为可能。 事实上,它需要这样一种方法。 本书遵循了一系列对所有并行架构都至关重要的问题——通信延迟、通信带宽以及跨整个现代设计的协作工作的协调。 它描述了用于解决每个问题的硬件和软件中可用的一组技术,并探讨了各种技术如何交互。 案例研究提供了一般原则的具体说明,并说明了机制之间的具体相互作用。 我们的最终动机来自于目前我们在斯坦福、伯克利和普林斯顿的课程缺乏足够的课本。 现有的很多教材对材料的涉及面都比较粗略,只是对各种建筑和研究成果进行了结,并没有对其进行深入的分析。 另一些人专注于特定的项目,但没有认识到可用于替代方法的原则。 该领域的研究报告提供了大量的经验数据,但还没有提炼成一个连贯的画面。 我们希望通过集中注意技术融合背景下的突出问题,而不是使我们走到这一点的丰富和多样的历史,对该领域提供更深刻和更连贯的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值