并行编程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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21:苹果和虫子2

团队QQ&#xff1a;466373640个人博客&#xff1a;www.doubleq.winc/noi/信息学奥数博客&#xff1a;http://www.cnblogs.com/zwfymqz 1:苹果和虫子2 查看提交统计提问总时间限制:1000ms内存限制:65536kB描述你买了一箱n个苹果&#xff0c;很不幸的是买完时箱子里混进了一条虫子…

php运行代码运行退出为0,php – Selenium测试用例返回进程以退出代码0结束

你使用“phpunit yourTestCase.php”而不是“php yourTestCase.php”吗&#xff1f;我使用phpunit(3.5.14)和“selenium-server-standalone-2.0rc2.jar”运行你的testfile,没有问题(除了测试本身失败)&#xff1a;PHPUnit 3.5.14 by Sebastian Bergmann.ETime: 10 seconds, Mem…

Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片

使用xcode6来运行项目&#xff0c;发现使用原生的tabbar上的图片不显示了。这个问题是因为xcode6中的一些api方法被废弃了,同时tabbar上图片的渲染方式发生了改变。先看xcode6中的tabbar api方法的变更&#xff1a;- (void)setFinishedSelectedImage:(UIImage *)selectedImage …

[Node.js]get/post请求

摘要 在很多情况下&#xff0c;我们的web服务器都需要接受客户端浏览器传递的参数或者数据。最常见的是get和post请求。 获取get请求的内容 get请求传递的参数在url中&#xff0c;参数部分在?后面。因此可以手动解析后面的内容作为get请求的参数。node.js中url模块中的parse函…

MyEclipse10 Tomcat7 JDK1.7 配置

第一步.MyEclipse10 Tomcat7 JDK1.7下载 MyEclipse10http://downloads.myeclipseide.com/downloads/products/eworkbench/indigo/installers/myeclipse-10.0-offline-installer-windows.exe Tomcat http://tomcat.apache.org/ Java SE Development Kit 7 WINDOWS版 http://www…

类的静态成量变量必须初始化

因为类的静态成员变量是所有实例共用的.所以得在类外初始化. 调用的时候可以通过对象调用,也可以通过类直接调用 classA { public: inti; //有默认值}; classB { public: staticintn;staticA Aobj;}; intB::n 1; //静态成员变量的初始化A B::Aobj; //静态…

2阶节IIR算法C语言源码

纯C语言软件算法&#xff0c;没有做过多优化&#xff0c;只是实现了基本IIR算法 /****************************************************************************** * 二阶IIR滤波器单元,采用直接II型 * 由多个2阶节&#xff0c;可以组成更多高阶的滤波器 * 根据参数的不同&a…

HDU 3709 Balanced Number (数位DP)

题意 求出[x, y] 范围内的平衡数&#xff0c;平衡数定义为&#xff1a;以数中某个位为轴心&#xff0c;两边的数的偏移量为矩&#xff0c;数位权重&#xff0c;使得整个数平衡。 思路 外层枚举平衡点&#xff0c;然后数位DP即可。设计状态&#xff1a; dp[pos][o][left_right] …

跳過 Windows RT的UI

RT启动进入常规桌面 微软Surface RT发布的时间已经不短了&#xff0c;相信很多朋友都已经熟悉了这个全新的平板&#xff0c;并且已经上手。Surface RT开机默认进入的界面为Windows UI&#xff0c;这对于经常使用App的朋友来说并没有什么&#xff0c;但是对于那些经常使用Office…

matlab调用mstg,实验五 双线性变换法设计IIR数字滤波器

实验五 IIR 数字滤波器设计一、实验目的(1)熟悉用双线性变换法设计IIR 数字滤波器的原理与方法&#xff1b;(2)学会调用MATLAB 信号处理工具箱中滤波器设计函数设计各种IIR 数字滤波器&#xff0c;学会根据滤波需求确定滤波器指标参数。(3)掌握IIR 数字滤波器的MATLAB 实现方法…

Android知识点剖析系列:深入了解layout_weight属性

前言 Android中layout_weight这个属性对于经常捣鼓UI的我们来说&#xff0c;肯定不会陌生。但是我们在真正使用这个属性时&#xff0c;经常会出现一些莫名奇妙的布局效果&#xff1b;如果仅仅知其然而不知其所以然&#xff0c;一些意外的布局效果一定让我们颇为头疼。在本文中&…

C++ 中explicit的使用

C提供了关键字explicit&#xff0c;可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C中&#xff0c; 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)&#xff0c; 承担了两个角色。1…

BZOJ 1026 windy数 (数位DP)

题意 区间[A,B]上&#xff0c;总共有多少个不含前导零且相邻两个数字之差至少为2的正整数&#xff1f; 思路 状态设计非常简单&#xff0c;只需要pos、limit和一个前驱数pre就可以了&#xff0c;每次枚举当前位时判断是否与上一位相差2即可。一个需要注意的地方是第一位不用比较…

oracle诊断,Oracle 诊断事件列表

Oracle 诊断事件列表(2013-03-26 18:05:26)标签&#xff1a;oracle诊断事件itORA-10000: controlfile debug event, name control_fileORA-10001: controlfile crash event1ORA-10002: controlfile crash event2ORA-10003: controlfile crash event3ORA-10004: controlfile cra…

考研数学:【以错补错】 降低做题出错率

考研数学&#xff1a;以错补错 降低做题出错率  众所周知&#xff0c;数学需要做题&#xff0c;需要通过做题来巩固掌握&#xff0c;但很多同学却陷入了题海战术&#xff0c;把所有的精力都放在数学练习上&#xff0c;一门心思做题&#xff0c;可几个月下来却没有进展&#x…

treeview右键添加新节点

private void advTree1_MouseDown(object sender, MouseEventArgs e){if (e.Button MouseButtons.Right)//判断你点的是不是右键{Point ClickPoint new Point(e.X, e.Y);Node CurrentNode advTree1.GetNodeAt(ClickPoint);if (CurrentNode ! null)//判断你点的是不是一个节点…

RPM方式安装MySQL5.6

RPM方式安装MySQL5.6 rpm -ivh MySQL-server-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-client-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-devel-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-embedded-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -iv…

centos7静默搭建oracle11g,Linux静默安装Oracle方法(centos7+oracle11g)

1、 增加虚拟内存ddif/dev/zero of/swapadd bs1024 count2006424mkswap /swapaddswapon /swapadd2、 检查依赖包rpm -q binutils compat-libstdc-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc-2.5 glibc-common glibc-devel glibc-headers ksh libaio libaio-dev…

Ms SQL Server 约束和规则

一、SQL约束 约束定义关于列中允许值的规则&#xff0c;是强制完整性的标准机制。 使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。 1&#xff1a;类型 约束的类型一共分三种 域约束&#xff1a; 涉及一个或多个列&#xf…

Qt 独立运行时伴随CMD命令窗口

用Qt写了一个小软件&#xff0c;在把程序release后&#xff0c;打包分装后&#xff0c;发现程序运行的时候会伴随cmd命令窗口&#xff0c;可把我愁怀了 不过功夫不负有心人&#xff0c;在老师和我网友的帮助下&#xff0c;终于搞完了 CONFIG&#xff1a;指定工程配置和编译参数…