对于一个16核cpu服务器器,4个cpu,每个cpu8核,每核2线程。linux并行计算表明最多使用的cpu数貌似是总的线程数。

[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)
转自:科学网bigdataage的个人博客Complex
Systems Science and Data Science, Systems Biology and
Bioinformatics
使用多核CPU,并行编程超简单!
&OpenMP提供了对的高层的抽象描述,通过在中加入专用的pragma来指明自己的意图,由此可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非系统(如)上使用,在这样的系统上,MPI使用较多。
& &当然,还有一个更简单的方法就是使用Go语言。
&例子(Visual
Studio,C语言)
&&我用的是Windows系统(Win8)的双核台式机
&, &用C语言写源代码,以Visual
Studio 2012为编译器。打开Visual
Studio 2012,需要在建立工程后,点击菜单栏-&Project-&Properties,弹出菜单里,点击
Configuration Properties-&C/C++-&Language-&OpenMP
Support,在下拉菜单里选择Yes。然后才能使用OpenMP。
下面以并行代码为例,只需要把相应的行注释掉,就是串行代码了!下同。
第一个例子(example_1.c):
增加一行代码#pragma omp
parallel,然后用花括号把你需要放在并行区内的语句括起来,并行区就创建好了。
默认情况下,并行区内线程数=系统中核的个数。并行区里每个线程都会去执行并行区中的代码。故对于双核电脑,并行区中的代码会被执行2次,当然若有输出语句,结果也会被输出2次
<img STYLE="WorD-WrAp: break- MAx-WiDTH: 620 pADDinG-BoTToM: 0 pADDinG-Top: 0 pADDinG-LeFT: 0 MArGin: 0 pADDinG-riGHT: 0px" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src ="http://image.sciencenet.cn/album//z8wvvsvp87v8.png" NAME="image_operate_09281"
ALT="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)"
TITLE="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)" />
运行example_1.c, 会发现 并行区里面的语句会被执行2次(我的电脑是2核的 &),
&多次运行,会发现各次运行的结果会不一样,打印到屏幕上结果的顺序是不一定的,这个符合多线程程序的特性。当然,
运行过程中也可以观察到CPU的使用率是100%. &
我运行了2次,结果不同,如下所示:
<img STYLE="WorD-WrAp: break- MAx-WiDTH: 620 pADDinG-BoTToM: 0 pADDinG-Top: 0 pADDinG-LeFT: 0 MArGin: 0 pADDinG-riGHT: 0px" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src ="http://image.sciencenet.cn/album//185642nqlqwilqwlhnuler.png"
ALT="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)"
TITLE="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)" />
<img STYLE="WorD-WrAp: break- MAx-WiDTH: 620 pADDinG-BoTToM: 0 pADDinG-Top: 0 pADDinG-LeFT: 0 MArGin: 0 pADDinG-riGHT: 0px" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src ="http://image.sciencenet.cn/album//185939qjm8qjjmqeqmbqjh.png" NAME="image_operate_10012"
ALT="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)"
TITLE="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)" />
第二个例子(example_2.c):
example_1.c中并行区里每个线程执行的代码是一样的,计算机若有N个核,相当于同时重复执行了N次,并没有提高效率、节省时间。我们希望的是把同一工作分配给不同线程来做,每个线程完成一部分,这样运行速率才会快。
#pragma omp for&
使用这个语句,就可以把一个for循环的工作量分配给不同线程。这个语句后面必须紧跟一个for循环,它只能对循环的工作量进行划分、分配。
<img STYLE="WorD-WrAp: break- MAx-WiDTH: 620 pADDinG-BoTToM: 0 pADDinG-Top: 0 pADDinG-LeFT: 0 MArGin: 0 pADDinG-riGHT: 0px" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src ="http://image.sciencenet.cn/album//2012510axonhj91snj9mz6.png"
ALT="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)"
TITLE="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)" />
可以把多行openmp pragma合并成一行,
#pragma omp parallel, #pragma omp for 合并成一行#pragma omp parallel for
, 合并后的程序如下:
<img STYLE="WorD-WrAp: break- MAx-WiDTH: 620 pADDinG-BoTToM: 0 pADDinG-Top: 0 pADDinG-LeFT: 0 MArGin: 0 pADDinG-riGHT: 0px" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src ="http://image.sciencenet.cn/album//203116kxzugshtwu2oedui.png"
ALT="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)"
TITLE="[转]使用多核CPU,并行编程超简单。(OpenMP的Windows&&&Linux&例子)" />
并行计算的运行用了16.415秒。
把第11行(#pragma omp parallel
for)注释以后,就成为了传统的串行计算,运行用了29.116秒。
双核运行的时间大约缩短为单核的二分之一,说明OpenMP还是很强大的。运行过程中也可以观察到CPU的使用率是100%.
&例子(GCC,C语言)
源代码和Windows中的差不多,用GCC编译时加上
-fopenmp 就可以了.
未完待续。号以后继续纠结这个问题。没办法,又要写英文的期刊论文,又要写硕士毕业论文。&&
Go语言相关网站:
本文引用地址:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。服务器市场惊现八内核多线程CPU
Rick Merritt
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
为了夺回主流服务器市场上原有的份额,太阳微系统公司(Sun Microsystems)首次推出了两款基于其多内核、多线程Niagara处理器的系统 (T1000和T2000)。Sun率先开发出支持多达8个内核和32个线程的Niagara CPU,并计划在其下一代产品中集成PCI Express功能,而其他计算机制造商很可能也会紧随其后。Sun公司表示,与目前基于英特尔Xeon处理器的服务器相比,新推出的机架型系统将提供超过两倍的性能,而功耗却仅为一半。该公司还称,新系统的性能功耗比是基于IBM Power5+的p5 550服务器的四倍。Sun推出的T2000 2U机架服务器带有1.2GHz的Niagara和32GB的存储器,功耗为325W,在Spec J App服务器基准评测的得分达到615左右。新设计标志着Sun正在积极进行战略转移,通过利用摩尔定律来降低计算线程的成本,而不是一味追求单个热处理器的频率。“随着单线程成本从500美元下降到100美元,甚至有朝一日降到20美元,软件开发商将全面出击,从而推动并行应用的发展。”Sun公司的技术研究员Mike Splain评述道。“在X86出现之前,Sun一直占据着低端服务器市场。”市场观察公司Insight6??负责人Nathan Brookwood分析,“现在他们有望收复失地。该芯片具有强大的性能以及更加出色的性能功耗比,而后者已经成为近期关注的重点。”“现在的问题在于,对于那些已经习惯了X86的价位和其具有的广泛软件支持的用户而言,Sun所拥有的优势是否足以说服他们转向处理器和操作系统都比较专有化的Sun阵营。”他补充道,“历来,专有的东西都会输给业界的标准方案。”Brookwood大力赞扬Sun在计算处理密集的互联网时代能够认识到线程级并行(TLP)的重要性。与之相反,Sun的竞争对手英特尔和惠普则在网络热潮之前开发了专注于指令级并行(ILP)的Itanium服务器微处理器。“这并不是一个缺点。”惠普服务器部门的研究人员Jerry Huck(曾帮助设计最初的单线程Itanium)说。他指出,Itanium具有较好的单线程性能,并使用了高速缓存。“我们现在发现,放弃大量的内核性能并不能提高成本效益。”他表示,“最好是尽可能的使用内核性能,然后使用多个相同的处理器。”“借助Niagara,我现在可以实现30个线程,但是这基本上会引起缓存抖动,而且这个技术已经落后。”他称。Sun推出的新型服务器利用了尽可能多的主流服务器组件。1U T1000和2U T2000采用了和Sun基于Opteron的X86服务器相同的底座、风扇和电源。功耗为70W的Niagara处理器由德州仪器采用90纳米工艺制造,只需要3个风扇,而不是Opteron系统需要的6个。Sun公司的首席架构师Rick Hetherington(左)和技术研究员Mike Splain(右)共同展示T2000系统。Niagara处理器的电路板上带有8个DDR-2 DIMM槽,用以连接Sun现有的位于单独I/O板上的J-Bus桥接芯片。这块I/O板上另外组装了现成的PCI Express部件,拥有2个8x Express槽以及4个千兆以太网端口。采用6内核CPU的T1000系统起价为2,995美元,主频1GHz,存储器为2GB,无硬盘。新系统的出现标志着Sun公司首次进军PCI Express领域,尽管使用这种2.5Gbps串行互连的PC服务器早已经出货数个月。Sun的新系统在一些用户数据中心已经运行了数周。今年,Sun将在使用ATCA机架(针对电信客户)和小外形尺寸(针对商业用户)的刀片服务器设计中大批量使用Niagara芯片。最终,Sun将在网站和应用级产品中广泛推广Niagara。集成ExpressNiagara首次面世时,很多引人入胜的特性仅是点到为止,Sun表示将在其下一代产品中融入这些精华。Niagara-2将采用65纳米工艺以腾出更大的裸片面积,从而增加加密和网络协处理器以及串行接口。Niagara-2的单线程性能将是第一代器件的两倍,其原因部分在于利用了更佳的硬件分配和该公司尚未披露的一些技术。它最多仍会有8个内核,不过每个内核将运行8个而非4个线程,而且不会造成严重的资源争夺。“我们在6?线程版本上将看到线性缩放。”Splain表示。该处理器也将是Sun第一次完全转向串行技术。它集成一个8x PCI Express接口,从而去掉了单独的J-Bus芯片,还集成了一个全新的处理器互连,为实现双Niagara芯片的系统提供了可能。把Express直接放在服务器处理器上的方法很新颖。“但这将是一种趋势,”Splain认为,“很多竞争对手已经开始这么做了,而且你会看到更多这样的产品。”Sun通过LSI Logic公司得以使用8x Express技术,之前LSI Logic也为J-Bus桥芯片提供了IP。它还拥有一个内部开发的Express模块。最终的Niagara-2电路板的层数可能只是目前PC板22层的一半。除了Express互连,Niagara-2还将集成多端口千兆以太网开关,所以电路板的尺寸将显著减小,而且成本也会大幅度下降。此外,Niagara-2还将包含对AES、3DES和椭圆曲线加密法等加密算法的硬件支持。通过将大部分I/O板元件置于处理器上,Sun为双芯片系统预留了空间。DIMM获得认可Niagara-2服务器还将使用全缓冲DIMM。“预计这些新兴的存储器最初会增加服务器设计的功耗和延迟时间,但是对所有服务器生产商都面临的存储器扩展问题而言,这项技术是最好的解决方案。”Splain指出。Sun在2002年7月通过收购新创公司Afara Websystems(由Sun的前Sparc设计师Les Kohn创建)获得了Niagara设计。Afara 的60位处理器设计师中大多仍留下来为Sun效力。而Sun公司的资深架构师Rick Hetherington则成为Niagara的首席架构师。Afara设计类似于Niagara-2计划,包括网络、加密以及用于连接机架中多个CPU卡的专用互连。Sun的第一代产品中去除了很多集成部分,目的在于减小裸片尺寸、降低技术风险,并缩短上市时间。Afara器件中的加密部分要求单内核模块的尺寸达到3到4平方毫米。“在90纳米节点,这会消耗相当大的裸片面积。”Splain指出。为了提高运算速度,第一代Niagara中仍带有针对模运算的硬件加速。Sun还取消了Afara 器件上的PCI-X接口,改为使用其J-Bus以向Express转移。此外,Sun还去掉了专用群集互连(可能会用在Niagara-2中)。“我们保留了最困难的部分:内核、线程、高速缓存的一致性、交叉开关(crossbar switch)以及负载/存储机制。”Splain称。作者: 麦利
您的昵称:
美国的游客
(您将以游客身份发表,请 | )
多内核是什么?
多内核,多内核是什么? 通过电子工程专辑网站专业编辑提供多内核的最新相关信息,掌握最新的多内核的最新行业动态资讯、技术文萃、电子资料,帮助电子工程师自我提升的电子技术平台.
多线程是什么?
多线程,多线程是什么? 通过电子工程专辑网站专业编辑提供多线程的最新相关信息,掌握最新的多线程的最新行业动态资讯、技术文萃、电子资料,帮助电子工程师自我提升的电子技术平台.
机架型是什么?
机架型,机架型是什么? 通过电子工程专辑网站专业编辑提供机架型的最新相关信息,掌握最新的机架型的最新行业动态资讯、技术文萃、电子资料,帮助电子工程师自我提升的电子技术平台.
新添订阅功能,提供全面快捷的资讯服务!
关注电子工程专辑微信
扫描以下二维码或添加微信号“eet-china”
访问电子工程专辑手机网站
随时把握电子产业动态,请扫描以下二维码
5G网络在提供1Gbps至10Gbps吞吐量方面具有很好的前途, 并且功耗要求比今天的网络和手机都要低,同时还能为关键应用提供严格的延时性能。本期封面故事将会与您分享5G的关键技术发展,以及在4G网络上有怎样的进步。
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。
推荐到论坛,赢取4积分激战到底:2014年市售12款热门CPU横评
1、测试平台、测试方法介绍Intel LGA2011 V3平台CPUIntel Core i7-5960X(8核/16线程)Intel Core i7-5820K(6核/12线程)主板技嘉X99-Gaming内存芝奇DDR4-3000(4x4g)Intel LGA1150平台CPUIntel Core i7-4790K(4核/8线程)Intel Core i5-4690K(4核/4线程)Intel Core i5-4590(4核/4线程)Intel Core i3-4150(2核/4线程)Intel pentium G3258(2核/2线程)主板华擎Z97 极限玩家6内存海盗船 DDR3-1600 (2x4g)ADM AM3平台CPUAMD FX 8300(8核/8线程)主板华硕Crosshair ⅴ Formula 内存海盗船 DDR3-1866 (2x4g)ADM FM2+平台CPUAMD A10-7850K(4核/4线程)AMD A8-6600K(4核/4线程)新速龙860K(4核/4线程)A4-6300(2核/2线程)主板华硕A88XM-Plus内存海盗船 DDR3-2400 (2x4g)共用配件硬盘主盘:三星830固态硬盘(256G)副盘:西部数据1TB 黑盘显卡NIVDIA GTX770电源Highpower 1000W软件平台操作系统Windows 8.1 专业版显卡驱动NV显卡驱动344.65 WHQL评测方案CPU理论性能测试:新3DMark(物理计算)3DMark 11Fritz国际象棋wPrimeWinRAR 64BitPhotoShop CCCineBenchTMPGEncGPU游戏性能测试:新3DMark英雄联盟尘埃3街霸CPU游戏性能测试孤岛危机3地铁2033:最后的曙光热血无赖看门狗功耗测试独显平台功耗(网页、游戏、Prime95)2.1、CPU理论多线程性能测试  测试项目包括科学运算测试软件wPrime和AI(人工智能)运算测试软件Fritz Chess,两款软件均对多核 CPU进行大量优化,对CPU性能有较大的指导意义。由于只是理论运算,我们把它们归类为CPU理论性能测试。●Fritz Chess国际象棋:Fritz Chess 4.3(国际象棋)软件简介测试CPU 的AI运算性能、多线程处理能力。软件设置默认设置,使用CPU的最大线程数测试方法直接按Start开始测试,记录得分软件截图《国际象棋》测试成绩&●wPrime 2.05质数计算:wPrime 2.05软件简介wPrime是一款通过计算质数来测试计算机运算能力等的软件,由于wPrime可以支持多 线程并行运算,因此更能反映出多核、多线程CPU之间的性能差距。软件设置设置Set Thread Count,使用CPU的最大线程数测试方法运行1024M,记录用时软件截图wPrime 2.05测试成绩  测试小结:Fritz Chess和wPrime是测试CPU多线程性能的代表性软件,属于纯粹的理论运算。高端平台基本上是Intel占优,i7系列处理器遥遥领先,旗舰i7-5960X位居首位。AMD方面,FX 8300与i5-4690K成绩相当,A10-7850K的CPU性能在多线程测试中比i3占优。入门市场中新速龙领先奔腾G3258接近50%的幅度。同样是双核双线程的A4-6300则包揽榜尾位置。&2.3、3DMark系列物理运算测试  这部分的测试主要考察CPU在游戏中的物理运算和人工智能运算能力,我们选取了权威的3D测试软件3DMark,分别测试3DMark 11和新版3DMark中的CPU得分。●3DMark 11:3DMark 11 1.02(物理运算) 软件简介3DMark 11是一款基于DirectX 11的3D性能基准测试软件,内置了三大测试项目:图形性能测试、物理性能测试和综合测试。软件设 置Performance测试方法只进行CPU物理运算部分测试,记录得分 软件截图3DMark 11测试成绩(CPU得分)&●新3DMark:新3DMark (物理运算) 软件简介《3DMark》2012年FurtureMark公司新推出了跨平台测试工具,取消了以往的&后缀&名,其中的Fire Strike场景可以用来测试CPU/图形性能软件设置默认设置测试方法只进行CPU物理运算部分测试,记录得分 软件截图新3DMark测试成绩  测试小结:3DMark的测试成绩与前面多线程理论测试成绩接近。AMD分级非常明显,CPU性能最好的是FX 8300,同是Kaveri架构的新速龙860K和A10-7850K的CPU性能相当,最后就是A4-6300。Intel方面,高频大杀器i7-4790K继续位于三甲之列,i5-4590和i5-4690K两者成绩基本一样,缺少多线程的i5和i7在两项3Dmark测试上落后不少。默认频率下的G3248还是不敌新速龙860K。
键盘也能翻页,试试“← →”键
总排行榜我在第4位
参考价:¥2174
网友评分: 4.2
DIY硬件图赏
DIY论坛帖子排行
最新资讯离线随时看
聊天吐槽赢奖品
浏览本产品的网友还关注:Linux CPU core的电源管理(2)_cpu topology
在“”中,我们多次提到SMP、CPU core等概念,虽然硬着头皮写下去了,但是蜗蜗对这些概念总有些似懂非懂的感觉。它们和CPU的进化过程息息相关,最终会体现在CPU topology(拓扑结构)上。因此本文将以CPU topology为主线,介绍CPU有关(主要以ARM CPU为例)的知识。
另外,CPU topology除了描述CPU的组成之外,其主要功能,是向kernel调度器提供必要的信息,以便让它合理地分配任务,最终达到性能和功耗之间的平衡。这也是我将“cpu topology”归类为“”的原因。
2. CPU topology
2.1 一个例子
开始之前,先看一个例子,下面是蜗蜗所使用的编译服务器的CPU architecture信息:
[xxx@cs ~]# lscpu
Architecture:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x86_64
CPU op-mode(s):&#160;&#160;&#160;&#160;&#160;&#160;&#160; 32-bit, 64-bit
Byte Order:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Little Endian
CPU(s):&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24
On-line CPU(s) list:&#160;&#160; 0-23
Thread(s) per core:&#160;&#160;&#160; 2
Core(s) per socket:&#160;&#160;&#160; 6
Socket(s):&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2
NUMA node(s):&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2
Vendor ID:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; GenuineIntel
CPU family:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 6
Model:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 62
Stepping:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4
CPU MHz:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
BogoMIPS:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4199.92
Virtualization:&#160;&#160;&#160;&#160;&#160;&#160;&#160; VT-x
L1d cache:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 32K
L1i cache:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 32K
L2 cache:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 256K
L3 cache:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 15360K
NUMA node0 CPU(s):&#160;&#160;&#160;&#160; 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s):&#160;&#160;&#160;&#160; 1,3,5,7,9,11,13,15,17,19,21,23
注意其中蓝色字体部分,该服务器有24个CPU,组成方式是:2个sockets,每个socket有6个core,每个core有2个thread。另外,这些CPU可以划分为2个NUMA node。晕吧,知道我在说什么吗?不知道就对了,让我做进一步的解释。
2.2 单核和多核
在英文里面,单核(single-core)和多核(multi-core)多称作uniprocessor和multiprocessor,这里先对这些概念做一个说明:
这里所说的core(或processor),是一个泛指,是从使用者(或消费者)的角度看计算机系统。因此,core,或者processor,或者处理器(CPU),都是逻辑概念,指的是一个可以独立运算、处理的核心。
而这个核心,可以以任何形式存在,例如:单独的一个chip(如通常意义上的单核处理器);一个chip上集成多个核心(如SMP,symmetric multiprocessing);一个核心上实现多个hardware context,以支持多线程(如SMT,Simultaneous multithreading);等等。这是从硬件实现的角度看的。
最后,从操作系统进程调度的角度,又会统一看待这些不同硬件实现的核心,例如2.1中所提及的CPU(24个CPUs),因为它们都有一个共同的特点:执行进程(或线程)。
在传统的单核时代,提升处理器性能的唯一手段就是提高频率。但受限于物理工艺,频率不能无限提高(例如散热问题等)。对多核处理器来说,可利用的空间增多,散热问题就比较容易解决。这就是multiprocessor诞生的背景。
另外,现实中的多任务需求,也是multiprocessor得以发展的基础,例如智能手机中,可以使用一个processor处理通信协议,另一个processor处理UI交互、多媒体等,这可以让用户在享受“智能”的同时,确保不miss基础的通信需求。
2.3 SMP、SMT、NUMA等概念
比较常见的multiprocessor实现,是将多个功能完全相同的processor集成在一起(可以在一个chip上,也可以在多个chip),它们共享总线、memory等系统资源,这称作SMP(Symmetric Multi-Processing),如下面图片中的CORE000、CORE001…。从Linux kernel的角度,通常称这些功能独立的process为Core。
另外,基于制程、扩充性等考虑,芯片厂商会把多个Core封装在一个chip上,这也称作Socket。Socket的概念在X86架构上使用尤其多,可以理解为插槽。假设一个插槽有两个Core,那么我在主板上插2个插槽,就是4核系统,插4个插槽,就是8核系统。不过Socket在ARM体系结构上使用却比较少,后面我们会介绍另外一个类似概念(Cluster)。
大多数操作系统(如Windows、Linux),有进程和线程的概念。进程是程序的运行实例,可以包括很多线程。线程是调度的最小单位。因此有些处理器(Core),可以通过复制硬件寄存器状态等手段,同时执行多个线程,这叫做SMT(Simultanous Multi-Thread)。
下面图片以及2.1中的例子,反映了多核系统的简单topology。
前面讲过,Core之间会共享总线、memory等资源。如果Core的数量较少,则没什么问题,但随着Core的增多,对总线以及memory带宽的需求就会显著增大,最终总线和memory会成为系统性能的瓶颈。解决方法是:
某些Core之间,独享总线和memory,称作Node。正常情况下,Core只访问Node内的memory,因此可以减轻对总线和memory的带宽需求。但是,有些场景下,Core会不可避免的访问其它Node的memory,这会造成很大的访问延迟。
因此,这种技术称作NUMA(Non-uniform Memory Access),以内存访问的不一致性为代价,减轻对总线和memory的带宽需求。这种结构对进程调度算法的要求较高,尽量减少跨Node的内存访问次数,以提升系统性能。
2.4 ARM HMP(Heterogeneous Multi-Processing)
前面提到的拓扑结构,大多存在于X86架构的PC、服务器上,唯一目标就是提升CPU的处理性能(不在乎功耗)。但在移动市场(大多是ARM的天下),事情就复杂多了。
随着智能设备的普及,用户对移动设备的性能需求越来越高,相应的就更多有的power消耗,这对设备的电源管理以及散热处理提出了更高的要求。与此同时,电池技术却没有随着CPU拓扑结构的进化而进化,这就导致上述的拓扑结构不太适合对功耗特别敏感的移动设备,这就是ARM的HMP技术提出的背景。
Heterogeneous的中文意思是“异形的、多种多样的”,从字面意思理解,就是其内部的多个Core有着不同的实现(相对于SMP)。它的产生基于下面两个事实:
1)在处理同等事务的情况下,处理器的性能越高,其能量损耗就越大。这是由物理工艺决定的。
2)以智能手机为例,必须由高性能CPU来完成的事务,在所有事物里的比重是非常小的,如大型游戏、高清视频播放等。甚至很多用户从来都没有用过。
因此,ARM提出类似下面架构的HMP架构,在一个chip中,封装两类ARM Core,一类为高性能Core(如Cortex-A15,也称作big core),一类为低性能Core(如Cortex-A7,也称作little core),因此HMP也称作big·little架构。其中:
big core的处理性能高,但功耗较大;
little core的功耗低;
因此软件(如OS的调度器)可以根据需求,将任务分配到big core或者little上,以满足性能和功耗的平衡。
在ARM的术语中,所有big core或者所有little core组合,称作cluster(可以类比为2.3中所描述的Socket,但意义完全不同),因此在多数的ARM处理器中(不排除后续ARM服务器又不同实现),CPU topology如下:
Cluster-->Core-->Threads
在软件模型上,基本和2.3中描述的“Socket—>Core-->Threads”拓扑兼容。
3. Linux kernel CPU topology driver
弄明白CPU topology的物理基础之后,再来看Linux kernel的CPU topology driver就简单多了,其软件层次如下:
---------------------------------------------&#160;&#160;&#160;&#160; --------------------------------------------&#160; |&#160;&#160;&#160;&#160;&#160;&#160; CPU topology driver&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160; Task Scheduler etc.&#160;&#160;&#160;&#160;&#160;&#160; |
---------------------------------------------&#160;&#160;&#160;&#160; -------------------------------------------
----------------------------------------------------------------------------------------------
|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Kernel general CPU topology&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arch-dependent CPU topology&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |
----------------------------------------------------------------------------------------------
Kernel general CPU topology位于"include/linux/topology.h”中,定义了获取系统CPU topology信息的标准接口。底层的arch-dependent CPU topology会根据平台的特性,实现kernel定义的那些接口。
CPU topology信息有两个重要的使用场景:一是向用户提供当前的CPU信息(2.1中的lscpu),这是由CPU topology driver实现的;二是向调度器提供CPU core的信息,以便合理的调度任务。
下面将重点介绍Kernel general CPU topology、arch-dependent CPU topology和CPU topology driver,其中arch-dependent CPU topology会以ARM64平台为例。至于如何知道任务调度,则比较复杂,会放到其它文章中介绍。
3.1 Kernel general CPU topology
Kernel general CPU topology主要以“#ifndef ... #define”类型的宏定义的形式提供API,其目的是:底层的arch-dependent CPU topology可以重新定义这些宏,只要底层有定义,则优先使用底层的,否则就使用Kernel general CPU topology中的默认API,主要包括:
1: /* include/linux/topology.h */
3: #ifndef topology_physical_package_id
4: #define topology_physical_package_id(cpu)
((void)(cpu), -1)
6: #ifndef topology_core_id
7: #define topology_core_id(cpu)
((void)(cpu), 0)
9: #ifndef topology_thread_cpumask
10: #define topology_thread_cpumask(cpu)
cpumask_of(cpu)
11: #endif
12: #ifndef topology_core_cpumask
13: #define topology_core_cpumask(cpu)
cpumask_of(cpu)
14: #endif
16: #ifdef CONFIG_SCHED_SMT
17: static inline const struct cpumask *cpu_smt_mask(int cpu)
return topology_thread_cpumask(cpu);
21: #endif
23: static inline const struct cpumask *cpu_cpu_mask(int cpu)
return cpumask_of_node(cpu_to_node(cpu));
topology_physical_package_id用于获取某个CPU的package ID,即第2章所描述的socket或者cluster,具体意义依赖于具体平台的实现;
topology_core_id用于或者某个CPU的core ID。即第二章所描述的core,具体意义依赖于具体的平台实现;
topology_thread_cpumask,获取和该CPU属于同一个core的所有CPU,通俗的讲,就是姐妹Thread;
topology_core_cpumask,获取和该CPU属于同一个packet(socket)的所有CPU;
cpu_cpu_mask,获取该CPU属于同一个Node的所有CPU;
cpu_smt_mask,用于SMT调度(CONFIG_SCHED_SMT)的一个封装,意义同topology_thread_cpumask。
另外,"include/linux/topology.h”提供一个NUMA有关的API,由于当前ARM使用NUMA技术的可能性不大,我们暂不过多涉及。
3.2 arch-dependent CPU topology
对ARM64而言,arch-dependent CPU topology位于“arch/arm64/include/asm/topology.h”和“arch/arm64/kernel/topology.c”中,主要负责ARM64平台相关的topology转换,包括:
1)定义一个数据结构,以及基于该数据结构的变量,用于存储系统的CPU topology
1: /* arch/arm64/include/asm/topology.h */
3: struct cpu_topology {
int thread_
int cluster_
cpumask_t thread_
cpumask_t core_
11: extern struct cpu_topology cpu_topology[NR_CPUS];
cluster_id、core_id、thead_id分别对应2.3、2.4章节所描述的拓扑结构的三个层次,其中由于ARM架构的特殊性,以cluster代替了socket;
thread_sibling和core_sibling为cpumask_t类型的变量,保存了和该CPU位于相同级别(同一个core和同一个cluster)的所有姐妹CPU;
系统中每个CPU(个数由NR_CPUS指定,是从OS的角度看的),都有一个struct cpu_topology变量,用于描述该CPU在整个topology中的地位。这些变量以数组的形式(cpu_topology)维护。
2)重定义CPU topology有关的宏定义
1: /* arch/arm64/include/asm/topology.h */
3: #define topology_physical_package_id(cpu)
(cpu_topology[cpu].cluster_id)
4: #define topology_core_id(cpu)
(cpu_topology[cpu].core_id)
5: #define topology_core_cpumask(cpu)
(&cpu_topology[cpu].core_sibling)
6: #define topology_thread_cpumask(cpu)
(&cpu_topology[cpu].thread_sibling)
实现比较简单,从该CPU对应的struct cpu_topology变量中取出指定的字段即可。
3)提供初始化并构建CPU topology的方法,以便在系统启动时调用
1: /* arch/arm64/include/asm/topology.h */
3: void init_cpu_topology(void);
4: void store_cpu_topology(unsigned int cpuid);
init_cpu_topology的调用路径是:kernel_init-->smp_prepare_cpus-->init_cpu_topology,主要完成如下任务:
初始化所有可能的CPU的struct cpu_topology变量;
尝试从DTS中解析CPU topolog配置,配置的格式如下:
&#160;&#160;&#160;&#160;&#160;&#160;&#160; cpu-map {&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cluster0 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; core0 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; thread0 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cpu = ;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; thread1 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cpu = ;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; core1 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …
&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160; big0: cpu@0 {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; device_type = "cpu";
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; compatible = "arm,cortex-a15";
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; reg = ;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; };
&#160;&#160;&#160;&#160;&#160;&#160;&#160; …
具体可参考“Documentation/devicetree/bindings/arm/topology.txt”中的描述。
store_cpu_topology的调用路径是:kernel_init-->smp_prepare_cpus-->store_cpu_topology,在没有从DTS中成功获取CPU topology的情况下,从ARM64的MPIDR寄存器中读取topology信息,具体可参考相应的代码,不再详细描述。
3.3 CPU topology driver
CPU topology driver位于“drivers\base\topology.c”中,基于“include/linux/topology.h”所提供的API,以sysfs的形式,向用户空间提供获取CPU topology信息的接口,lscpu应用,就是基于该接口实现的。
具体的实现比较简单,sysfs的格式可参考“Documentation\cputopology.txt”,这里不再详细说明。
原创文章,转发请注明出处。蜗窝科技,。

我要回帖

更多关于 服务器 cpu主频和核数 的文章

 

随机推荐