进程和线程的CPU亲和性

进程和线程的CPU亲和性
进程和线程的CPU亲和性

进程和线程的亲缘性(affinity)是指可以将进程或者是线程强制限制在可用的CPU子集上运行的特性,它一定程度上把进程/线程在多处理器系统上的调度策略暴露给系统程序员。 CPU的数量和表示在有n个CPU的Linux上,CPU是用0...n-1来进行一一标识的。CPU的数量可以通过proc文件系统下的CPU相关文件得到,如cpuinfo和stat:

$ cat /proc/stat | grep "^cpu[0-9]\+" | wc -l

8

$ cat /proc/cpuinfo | grep "^processor" | wc -l

8

在系统编程中,可以直接调用库调用sysconf获得:

sysconf(_SC_NPROCESSORS_ONLN);

进程的亲缘性Linux操作系统在2.5.8引入了调度亲缘性相关的系统调用:

int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

int sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

其中sched_setaffinity是设定进程号为pid的进程调度亲缘性为mask,也就是说它只能在mask中指定的CPU 之间进行调度执行;sched_getaffinity当然就是得到进程号为pid的进程调度亲缘性了。如果pid为0,则操纵当前进程。

第二个参数指定mask所指空间的大小,通常为sizeof(cpu_set_t)。

第三个参数mask的类型为cpu_set_t,即CPU集合,GNU的c库(需要在include头文件之前定义

__USE_GNU)还提供了操作它们的宏:

void CPU_CLR(int cpu, cpu_set_t *set);

int CPU_ISSET(int cpu, cpu_set_t *set);

void CPU_SET(int cpu, cpu_set_t *set);

void CPU_ZERO(cpu_set_t *set);

如果我们所关心的只是CPU#0和CPU#1,想确保我们的进程只会运作在CPU#0之上,而不会运作在CPU#1之上。下面程序代码可以完成此事:

cpu_set_t set;

int ret, i;

CPU_ZERO(&set);

CPU_SET(0, &set);

CPU_CLR(1, &set);

ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);

if( ret == -1)

{

perror("sched_se");

}

for( i=0; i < 3; i++)

{

int cpu;

cpu = CPU_ISSET(i, &set);

printf("cpu = %i is %s/n", i, cpu? "set" : "unset");

}

Linux只提供了面向线程的调度亲缘性一种接口,这也是上面只提调度亲缘性而不直言进程亲缘性的原因。当前Linux系统下广泛采用的线程库NPTL(Native Posix Thread Library)是基于线程组来实现的,同一个线程组中的线程对应于一组共享存储空间的轻量级进程,它们各自作为单独调度单位被内核的调度器在系统范围内调度,这种模型也就是我们通常所说的1-1线程模型。正因如此,目前线程的调度范围

(可以用函数pthread_attr_getscope和pthread_attr_setscope获取和设置)只能是系统级而不能是进程级。

c库的GNU扩展所提供的有关线程亲缘性的API如下:

int pthread_attr_setaffinity_np (pthread_attr_t *__attr, size_t __cpusetsize, __const cpu_set_t *__cpuset);

int pthread_attr_getaffinity_np (__const pthread_attr_t *__attr, size_t __cpusetsize, cpu_set_t *__cpuset);

int pthread_setaffinity_np (pthread_t __th, size_t __cpusetsize, __const cpu_set_t *__cpuset);

int

pthread_getaffinity_np (pthread_t __th, size_t __cpusetsize, cpu_set_t *__cpuset);

亲缘性的继承调度亲缘性是被fork出来的子进程所继承的,即使子进程通过exec系列函数更换了执行镜像。因为Linux操作系统下进程和线程的创建都是通过系统调用clone来实现的,所以实际上调度亲缘性也是被用pthread_create创建的线程所继承的。这意味着,如果主线程在创建其它线程之前设定亲缘性,那么它所设定的亲缘性将被继承,因为这时所有线程的亲缘性相同(假设之后没有任何线程私自设置亲缘性),我们就可以认为前面设置的是进程亲缘性,而不管它所调用的函数是sched_setaffinity还是

pthread_setaffnity_np。下面创建两个并发线程分别绑定在CPU0和CPU1上。

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int x1;

int x2;

double waste_time(long n)

{

double res = 0;

long i = 0;

while (i

i++;

res += sqrt(i);

}

return res;

}

void* proc1(void*arg)

{

cpu_set_t mask ;

CPU_ZERO(&mask);

CPU_SET(0,&mask);

int ret = 0;

ret = pthread_setaffinity_np(pthread_self(),sizeof(mask),(const cpu_set_t*)&mask ); if(ret < 0)

{

printf("pthread_setaffinity_np err \n");

return ;

}

while(1)

{

if(x1 > 900000000)

{

break;

}

x1++;

}

waste_time(1);

ret =pthread_getaffinity_np(pthread_self(),sizeof(mask),(const cpu_set_t*)&mask ); if(ret < 0)

{

printf("pthread_getaffinity_np err \n");

return ;

}

int j;

for( j = 0;j < CPU_SETSIZE;j++)

{

if(CPU_ISSET(j,&mask))

printf(" thread[%d] bind cpu[%d]\n",pthread_self(),j);

}

}

void* proc2(void* arg)

{

cpu_set_t mask ;

CPU_ZERO(&mask);

CPU_SET(2,&mask);

int ret = 0;

ret =pthread_setaffinity_np(pthread_self(),sizeof(mask),(const cpu_set_t*)&mask ); if(ret < 0)

{

printf("pthread_setaffinity_np err \n");

return ;

}

while(1)

{

if(x2 > 900000000)

{

break;

}

x2++;

}

waste_time(1);

ret = pthread_getaffinity_np(pthread_self(),sizeof(mask),(const cpu_set_t*)&mask );

if(ret < 0)

{

printf("pthread_getaffinity_np err \n");

return ;

}

int j;

for( j = 0;j < CPU_SETSIZE;j++)

{

if(CPU_ISSET(j,&mask))

printf(" thread[%d] bind cpu[%d]\n",pthread_self(),j);

}

}

void main()

{

int ret;

pthread_t t1,t2;

struct timeval time1,time2;

ret = gettimeofday(&time1,NULL);

ret = pthread_create(&t1,NULL,proc1,NULL);

ret = pthread_create(&t2,NULL,proc2,NULL);

pthread_join(t1,NULL);

pthread_join(t2,NULL);

ret = gettimeofday(&time2,NULL);

printf("time spend:[%d]s [%d]ms \n",https://www.360docs.net/doc/2011610348.html,_sec - https://www.360docs.net/doc/2011610348.html,_sec,(https://www.360docs.net/doc/2011610348.html,_usec - https://www.360docs.net/doc/2011610348.html,_usec)/1000); }

多核与多线程技术的区别到底在哪里

多核与多线程技术的区别到底在哪里? 【导读】:毫无疑问的,“多核”、“多线程”此二词已快成为当今处理器架构设计中的两大显学,如同历史战国时代以“儒”、“墨”两大派的显学,只不过当年两大治世思想学派是争得你死我亡,而多核、多线程则是相互兼容并蓄,今日几乎任何处理器都朝同时具有多核多线程的路线发展迈进。毫无疑问的,“多核”、“多线程”此二词已快成为当今处理器架构设计中的两大显学,如同历史战国时代以“儒”、“墨”两大派的显学,只不过当年两大治世思想学派是争得你死我亡,而多核、多线程则是相互兼容并蓄,今日几乎任何处理器都朝同时具有多核多线程的路线发展迈进。 虽然两词到处可见,但可有人知此二者的实际差异?在执行设计时又是以何者为重?到底是该多核优先还是多线程提前?关于此似乎大家都想进一步了解,本文以下试图对此进行个中差异的解说,并尽可能在不涉及实际复杂细节的情形下,让各位对两者的机制观念与差别性有所理解。 行程早于线程 若依据信息技术的发展历程,在软件程序执行时的再细分、再切割的小型化单位上,先是有行程(Process),之后才有线程(Thread),线程的单位比行程更小,一个行程内可以有多个线程,在一个行程下的各线程,都是共享同一个行程所建立的内存寻址资源及内存管理机制,包括执行权阶、内存空间、堆栈位置等,除此之外各个线程自身仅拥有少许因为执行之需的变量自属性,其余都依据与遵行行程所设立的规定。 相对的,程序与程序之间所用的就是不同的内存设定,包括分页、分段等起始地址的不同,执行权阶的不同,堆栈深度的不同等,一颗处理器若执行了A行程后要改去执行B行程,对此必须进行内存管理组态的搬迁、变更,而这个搬迁若是在处理器内还好,若是在高速缓存甚至是系统主存储器时,此种切换、转移程序对执行效能的损伤就非常大,因为完成搬迁、切换程序的相同时间,处理器早就可以执行数十到上千个指令。 两种路线的加速思维 所以,想避免此种切换的效率损耗,可以从两种角度去思考,第一种思考就是扩大到整体运算系统的层面来解决,在一部计算机内设计、配置更多颗的处理器,然后由同一个操作系统同时掌控及管理多颗处理器,并将要执行的程序的各个程序,一个程序喂(也称:发派)给一颗处理器去执行,如此多颗同时执行,每颗处理器执行一个程序,如此就可以加快整体的执行效率。 当然!这种加速方式必须有一个先决条件,即是操作系统在编译时就必须能管控、发挥及运用多行程技术,倘若以单行程的系统组态来编译,那么操作系统就无法管控服务器内一颗以上的处理器,如此就不用去谈论由操作系统负责让应用程序的程序进行同时的多颗同时性的执行派送。 即便操作系统支持多程序,而应用程序若依旧只支持单程序,那情形一样是白搭,操作

多核处理器

多核处理器 多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核)。多核技术的开发源于工程师们认识到,仅仅提高单核芯片的速度会产生过多热量且无法带来相应的性能改善,先前的处理器产品就是如此。他们认识到,在先前产品中以那种速率,处理器产生的热量很快会超过太阳表面。即便是没有热量问题,其性价比也令人难以接受,速度稍快的处理器价格要高很多。 最新新闻 中国发布全球首款全系统多核高精度导航定位芯片 全球首款全系统多核高精度导航定位系统级芯片,13日在第六届中国卫星[2.10% 资金研报]学术年会期间对外发布。专家表示,这意味着国产芯片不仅具备国际竞争力,还从“跟踪者”跃升为“引领者”。...详情 内容来自 中文名多核处理器 定义集成两个或多个完整的计算引擎 第一颗通用型微处理器4004 技术优势采用了线程级并行编程 目录 1技术发展 2发展历程 3技术优势 4技术瓶颈 5技术原理 6技术关键 ?核结构研究 ?程序执行模型 ?Cache设计 ?核间通信技术 ?总线设计 ?操作系统设计 ?低功耗设计 ?存储器墙 ?可靠性及安全性设计 7技术意义 8技术种类 9技术应用 10应用 11英特尔 1技术发展 256线程的CPU 256线程的CPU 英特尔工程师们开发了多核芯片,使之满足“横向扩展”(而非“纵向扩充”)方法,从而提高性能。该架构实现了“分治法”战略。通过划分任务,线程应用能够充分利用多个执行内核,并可在特定的时间内执行更多任务。多核处理器是单枚芯片(也称为“硅核”),能够直

接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将每个执行内核作为分立的逻辑处理器。通过在两个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。多核架构能够使软件更出色地运行,并创建一个促进未来的软件编写更趋完善的架构。尽管认真的软件厂商还在探索全新的软件并发处理模式,但是,随着向多核处理器的移植,现有软件无需被修改就可支持多核平台。操作系统专为充分利用多个处理器而设计,且无需修改就可运行。为了充分利用多核技术,应用开发人员需要在程序设计中融入更多思路,但设计流程与对称多处理(SMP)系统的设计流程相同,并且现有的单线程应用也将继续运行。得益于线程技术的应用在多核处理器上运行时将显示出卓越的性能可扩充性。此类软件包括多媒体应用(内容创建、,以及本地和数据流回放)、工程和其他技术计算应用以及诸如应用服务器和数据库等中间非标轴承https://www.360docs.net/doc/2011610348.html,层与后层服务器应用。多核技术能够使服务器并行处理任务,而在以前,这可能需要使用多个处理器,多核系统更易于扩充,并且能够在更纤巧的外形中融入更强大的处理性能,这种外形所用的功耗更低、计算功耗产生的热量更少。多核技术是处理器发展的必然。推动微处理器性能不断提高的因素主要有两个:半导体工艺技术的飞速进步和体系结构的不断发展。半导体工艺技术的每一次进步都为微处理器体系结构的研究提出了新的问题,开辟了新的领域;体系结构的进展又在半导体工艺技术发展的基础上进一步提高了微处理器的性能。这两个因素是相互影响,相互促进的。一般说来,工艺和电路技术的发展使得处理器性能提高约20倍,体系结构的发展使得处理器性能提高约4倍,编译技术的发展使得处理器性能提高约1.4倍。但是今天,这种规律性的东西却很难维持。多核的出现是技术发展和应用需求的必然产物。 2发展历程 1971年,英特尔推出的全球第一颗通用型微处理器4004,由2300个晶体管构成。当时,公司的联合创始人之一戈登摩尔(Gordon Moore),就提出后来被业界奉为信条的“摩尔定律”——每过18个月,芯片上可以集成的晶体管数目将增加一倍。 在一块芯片上集成的晶体管数目越多,意味着运算速度即主频就更快。今天英特尔的奔腾(Pentium)四至尊版840处理器,晶体管数量已经增加至2.5亿个,相比当年的4004增加了10万倍。其主频也从最初的740kHz(每秒钟可进行74万次运算),增长到现在的3.9GHz(每秒钟运算39亿次)以上。 当然,CPU主频的提高,或许在一定程度上也要归功于1975年进入这个领域的AMD公司的挑战。正是这样的“双雄会”,使得众多计算机用户有机会享受不断上演的“速度与激情”。一些仍不满足的发烧友甚至选择了自己超频,因为在玩很多游戏时,更快的速度可以带来额外的饕餮享受。 但到了2005年,当主频接近4GHz时,英特尔和AMD发现,速度也会遇到自己的极限:那就是单纯的主频提升,已经无法明显提升系统整体性能。 以英特尔发布的采用NetBurst架构的奔腾四CPU为例,它包括Willamette、Northwood和Prescott等三种采用不同核心的产品。利用冗长的运算流水线,即增加每个时钟周期同时执行的运算个数,就达到较高的主频。这三种处理器的最高频率,分别达到了2.0G、3.4G和3.8G。 按照当时的预测,奔腾四在该架构下,最终可以把主频提高到10GHz。但由于流水线过长,使得单位频率效能低下,加上由于缓存的增加和漏电流控制不利造成功耗大幅度增加,3.6GHz奔腾四芯片在性能上反而还不如早些时推出的3.4GHz产品。所以,Prescott产品系列只达到3.8G,就戛然而止。 英特尔上海公司一位工程师在接受记者采访时表示,Netburst微架构的好处在于方便提升频率,可以让产品的主频非常高。但性能提升并不明显,频率提高50%,性能提升可能微不

多核处理器的优点和缺点

三、多核处理器的优点和缺点 从应用需求上去看,越来越多的用户在使用过程中都会涉及到多任务应用环境,日常应用中用到的非常典型的有两种应用模式。 一种应用模式是一个程序采用了线程级并行编程,那么这个程序在运行时可以把并行的线程同时交付给两个核心分别处理,因而程序运行速度得到极大提高。这类程序有的是为多路工作站或服务器设计的专业程序,例如专业图像处理程序、非线视频编缉程序、动画制作程序或科学计算程序等。对于这类程序,两个物理核心和两颗处理器基本上是等价的,所以,这些程序往往可以不作任何改动就直接运行在双核电脑上。 还有一些更常见的日常应用程序,例如、等,同样也是采用线程级并行编程,可以在运行时同时调用多个线程协同工作,所以在双核处理器上的运行速度也会得到较大提升。例如,打开浏览器上网。看似简单的一个操作,实际上浏览器进程会调用代码解析、播放、多媒体播放、、脚本解析等一系列线程,这些线程可以并行地被双核处理器处理,因而运行速度大大加快(实际上浏览器的运行还涉及到许多进程级的交互通信,这里不再详述)。由此可见,对于已经采用并行编程的软件,不管是专业软件,还是日常应用软件,在多核处理器上的运行速度都会大大提高。 日常应用中的另一种模式是同时运行多个程序。许多程序没有采用并行编程,例如一些文件压缩软件、部分游戏软件等等。对于这些单线程的程序,单独运行在多核处理器上与单独运行在同样参数的单核处理器上没有明显的差别。但是,由于日常使用的最最基本的程序——操作系统——是支持并行处理的,所以,当在多核处理器上同时运行多个单线程程序的时候,操作系统会把多个程序的指令分别发送给多个核心,从而使得同时完成多个程序的速度大大加快。 另外,虽然单一的单线程程序无法体现出多核处理器的优势,但是多核处理器依然为程序设计者提供了一个很好的平台,使得他们可以通过对原有的单线程序进行并行设计优化,以实现更好的程序运行效果。 上面介绍了多核心处理器在软件上面的应用,但游戏其实也是软件的一种,作为一种特殊的软件,对发展作出了较大的贡献。一些多线程游戏已经能够发挥出多核处理器的优势,对于单线程游戏,相信游戏厂商也将会改变编程策略,例如,一些游戏厂商正在对原来的一些单线程游戏进行优化,采用并行编程使得游戏运行得更快。有的游戏可以使用一个线程实现人物动画,而使用另一个线程来载入地图信息。或者使用一个线程来实现图像渲染中的矩阵运算,而使用另一个来实现更高的人工智能运算。如今,大量的支持多核心的游戏涌现出来,从而使得多核处理器的优势能得到进一步的发挥。 但布赖恩特直言不讳地指出,要想让多核完全发挥效力,需要硬件业和软件业更多革命性的更新。其中,可编程性是多核处理器面临的最大问题。一旦核心多过八个,就需要执行程序能够并行处理。尽管在并行计算上,人类已经探索了超过年,但编写、调试、优化并行处理程序的能力还非常弱。 易观国际分析师李也认为,“出于技术的挑战,双核甚至多核处理器被强加给了产业,而产业却并没有事先做好准备”。或许正是出于对这种失衡的担心,中国国家智能计算机中心主任孙凝辉告诉《财经》记者,“十年以后,多核这条道路可能就到头了”。在他看来,一味增加并行的处理单元是行不通的。并行计算机的发展历史表明,并行粒度超过以后,程序就很难写,能做到个以上的应用程

操作系统对多核处理器的支持方法

随着多核处理器的发展,对软件开发有非常大的影响,而且核心的瓶颈在软件上。软件开发在多核环境下的核心是多线程开发。这个多线程不仅代表了软件实现上多线程,要求在硬件上也采用多线程技术。可以说多核提供了可以大幅提升性能的机制,多核软件就是可以真正利用这一特点的策略。只有与多核硬件相适应的软件,才能真正地发挥多核的性能。多核对软件的要求包括对多核操作系统的要求和对应用软件的要求。 多核操作系统的关注点在于进程的分配和调度。进程的分配将进程分配到合理的物理核上,因为不同的核在共享性和历史运行情况都是不同的。有的物理核能够共享二级cache,而有的却是独立的。如果将有数据共享的进程分配给有共享二级cache的核上,将大大提升性能;反之,就有可能影响性能。进程调度会涉及到比较广泛的问题,比如负载均衡、实时性等。 面向多核体系结构的操作系统调度目前多核软件的一个热点,其中研究的热点主要有下面几方面:程序的并行研究;多进程的时间相关性研究;任务的分配与调度;缓存的错误共享;一致性访问研究;进程间通信;多处理器核内部资源竞争等等。这些探讨相互独立又相互依赖。考虑一个系统的性能时必须将其中的几点同时加以考虑,有时候对一些点的优化会造成另一些点的性能下降,需要用程序进行性能优化评测,所以合适的多核系统软件方案正在形成过程中。 任务的分配是多核时代提出的新概念。在单核时代,没有核的任务分配的问题,一共只有一个核的资源可被使用。而在多核体系下,有多个核可以被使用。如果系统中有几个进程需要分配,是将他们均匀地分配到各个处理器核,还是一起分配到一个处理器核,或是按照一定的算法进行分配。并且这个分配还受底层系统结构的影响,系统是SMP构架还是CMP构架,在CMP构架中会共享二级缓存的核的数量,这是影响分配算法的因子。任务分配结束后,需要考虑任务调度。对于不同的核,每个处理器核可以有自己独立的调度算法来执行不同的任务(实时任务或者交互性任务),也可以使用一致的调度算法。此外,还可以考虑一个进程上一个时间运行在一个核上,下一个时间片是选择继续运行在这个核上,还是进行线程迁移;怎样直接调度实时任务和普通任务;系统的核资源是否要进行负载均衡等等。任务调度是目前研究的热点之一。 在单核处理器中,常见的调度策略有先到先服务(FCFS),最短作业调度(SJF),优先级调度(Priority-scheduling algorithm),轮转法调度(round-robin RR),多级队列调度(multilevel queue-schedule algorithm)等。例如在Linux操作系统中对实时任务采取FCFS和RR两种调度,普通任务调度采取优先级调度。 对于多核处理器系统的调度,目前还没有明确的标准与规范。由于系统有多个处理器核可用,必须进行负载分配,有可能为每个处理器核提供单独的队列。在这种情况下,一个具有空队列的处理器就会空闲,而另一个处理器会很忙。所以如何处理好负载均衡问题是这种调度策略的关键问题所在。为了解决这种情况,可以考虑共同就绪队列,所有处理器公用一个就绪队列。但是这无疑对进程上下文切换、锁的转换增加了执行时间,降低了性能。另外一种想法就是选择一个处理器来为其他处理器调度,因而创建了主从结构。有的系统将主从结构作进一步扩

多核处理器1

多核处理器 摘要: 多核处理器也称为片上多处理器(chip multi-processor,CMP),或单芯片多处理器。自1996年美国斯坦福大学首次提出片上多处理器(CMP)思想和首个多核结构原型,到2001年mM推出第一个商用多核处理器POWER4,再到2005年Intel和AMD多核处理器的大规模应用,最后到现在多核成为市场主流,多核处理器经历了十几年的发展。在这个过程中,多核处理器的应用范围已覆盖了多媒体计算、嵌入式设备、个人计算机、商用服务器和高性能计算机等众多领域,多核技术及其相关研究也迅速发展,比如多核结构设计方法、片上互连技术、可重构技术、下一代众核技术等。然而,多核处理器的技术并未成熟,多核的潜力尚未完全挖掘,仍然存在许多待研究的问题。 二.什么是多核处理器 2.1什么是多核处理器 多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核)。多核技术的开发源于工程师们认识到,仅仅提高单核芯片的速度会产生过多热量且无法带来相应的性能改善,先前的处理器产品就是如此。他们认识到,在先前产品中以那种速率,处理器产生的热量很快会超过太阳表面。即便是没有热量问题,其性价比也令人难以接受,速度稍快的处理器价格要高很多。英特尔工程师们开发了多核芯片,使之满足横向扩展(而非纵向扩充)方法,从而提高性能。该架构实现了分治法战略。通过划分任务,线程应用能够充分利用多个执行内核,并可在特定的时间内执行更多任务。多核处理器是单枚芯片(也称为硅核),能够直接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将每个执行内核作为分立的逻辑处理器。通过在两个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。多核架构能够使软件更出色地运行,并创建一个促进未来的软件编写更趋完善的架构。尽管认真的软件厂商还在探索全新的软件并发处理模式,但是,随着向多核处理器的移植,现有软件无需被修改就可支持多核平台。操作系统专为充分利用多个处理器而设计,且无需修改就可运行。为了充分利用多核技术,应用开发人员需要在程序设计中融入更多思路,但设计流程与对称多处理(SMP)系统的设计流程相同,并且现有的单线程应用也将继续运行。得益于线程技术的应用在多核处理器上运行时将显示出卓越的性能可扩充性。此类软件包括多媒体应用(内容创建、编辑,以及本地和数据流回放)、工程和其他技术计算应用以及诸如应用服务器和数据库等中间层与后层服务器应用。多核技术能够使服务器并行处理任务,而在以前,这可能需要使用多个处理器,多核系统更易于扩充,并且能够在更纤巧的外形中融入更强大的处理性能,这种外形所用的功耗更低、计算功耗产生的热量更少。多核技术是处理器发展的必然。推动微处理器性能不断提高的因素主要有两个:半导体工艺技术的飞速进步和体系结构的不断发展。半导体工艺技术的每一次进步都为微处理器体系结构的研究提出了新的问题,开辟了新的领域;体系结构的进展又在半导体工艺技术发展的基础上进一步提高了微处理器的性能。这两个因素是相互影响,相互促进的。一般说来,工艺和电路技术的发展使得处理器性能提高约20倍,体系结构的发展使得处理器性能提高约4倍,编译技术的发展使得处理器性能提高约1.4倍。但是今天,这种规律性的东西却很难维

一分钟看懂CPU多发射超标量、多线程、多核之概念和区别

【闲来无事、做做科普、反正也算是marketing job;教你一分钟看懂CPU多发射超标量/多线程/多核之概念和区别】最近在多个场合大肆宣扬多核多线程,收到对多线程表示不解的问题n多,苦思多日,终得一形象生动的模型,你肯定懂的。 因为是比喻和科普、过于严谨的技术控请勿吐槽。 处理器性能提高之公开秘笈:超标量、多线程、多核。 用于说明的生活模型:高速公路及收费站。 简单CPU的原型:单车道马路 + 单收费闸口,车辆只能一辆辆排队通过,并行度为1。 为了提高通行能力同时积极创收,相关部门运用世界顶尖CPU设计理念,对高速公路系统进行了如下拓宽改造: (1)增加车道(图示为3条车道); (2)增加收费通道(图示为2个通道);

(3)每个收费通道放置多个收费员(图示每条通道有a和b两个收费窗口)。 其中(1)+(3)组合手段就是所谓的超标量结构,该图示为双发射超标量。超标量指有多个车道,双发射是指有a和b两位收费员可以同时发卡,把两辆车送到不同车道上去。 手段(2)就是多线程的模型了,原有车道不变、只增加收费通道,这样多个车流来的时候可以同时发卡放行。 从这个比喻来看多线程显然是个非常直观和有用的办法,但为什么在CPU世界中似乎有点模糊难懂的感觉呢?那是因为CPU的指令流喜欢一个挨一个、一列纵队龟速前进,这样的话单通道多收费员还起点作用、多通道就形同虚设了。收费员1.a和1.b会累死,而2.a和2.b则能够睡觉。因此把车流进行整队就很重要——这就是并行编程,即要设法把一列纵队排列成多列纵队。 至于多核的概念,那就简单粗暴很多了,直接在这条马路边上进行征地拆迁、新修一条一模一样的高速公路便是,牛吧。现在大家手机里面的多核,就是并排几条“单收费通道+多车道”的马路,车流稀少、路况不错,不过相关部门表示因为道路利用率底下、经济效益欠佳、回收投资压力巨大。 无论多核还是多线程,都有一个同样的问题需要解决,就是要把车流整成多列纵队,这样多条马路和多个收费通道的并行度才能发挥作用。

浅谈多核CPU、多线程与并行计算

0.前言 最近发觉自己博客转帖的太多,于是决定自己写一个原创的。笔者用过MPI 和C#线程池,参加过比赛,有所感受,将近一年来,对多线程编程兴趣一直不减,一直有所关注,决定写篇文章,算是对知识的总结吧。有说的不对的地方,欢迎各位大哥们指正:) 1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进。笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力。而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器。 2.多线程与并行计算的区别 (1)多线程的作用不只是用作并行计算,他还有很多很有益的作用。 还在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于 while(1) { if(flag==1) break;

sleep(1); } 这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。 阻塞在什么时候发生呢?一般是等待IO操作(磁盘,数据库,网络等等)。此时如果单线程,CPU会干转不干实事(与本程序无关的事情都算不干实事,因为执行其他程序对我来说没意义),效率低下(针对这个程序而言),例如一个IO操作要耗时10毫秒,CPU就会被阻塞接近10毫秒,这是何等的浪费啊!要知道CPU是数着纳秒过日子的。 所以这种耗时的IO操作就用一个线程Thread去代为执行,创建这个线程的函数(代码)部分不会被IO操作阻塞,继续干这个程序中其他的事情,而不是干等待(或者去执行其他程序)。 同样在这个单核时代,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。例如基于UI 的程序(俗话说就是图形界面),如果你点一个按钮触发的事件需要执行10秒钟,那么这个程序就会假死,因为程序在忙着执行,没空搭理用户的其他操作;而如果你把这个按钮触发的函数赋给一个线程,然后启动线程去执行,那么程序就不会假死,继续响应用户的其他操作。但是,随之而来的就是线程的互斥和同步、死锁等问题,详细见有关文献。 现在是多核时代了,这种线程的互斥和同步问题是更加严峻的,单核时代大都算并发,多核时代真的就大为不同,为什么呢?具体细节请参考有关文献。我

多核多线程

多核多线程复习资料 1. 什么是CMP 单芯片多处理器(Chip Multiprocessors,简称CMP),将大规模并行处理器中的SMP (对称多处理器)集成到同一芯片内,各个理器并行执行不同的进程。 2 .并行计算的菲林分类 单指令流单数据流(Si ngle In struction stream Si ngle Data stream, SISD) 单指令流多数据流(Single Instruction stream Multiple Data stream, SIMD ) 多指令流单数据流( Multiple Instruction stream Single Data stream, MISD ) 多指令流多数据流( Multiple In struction stream Multiple Data stream, MIMD ) 3?进程和线程的区别 进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位,是一个动态的概念。线程是程序的有序控制流,是被执行的指令序列。 线程属于进程,线程运行在进程空间内。 4?线程的特点 线程因创建而产生,因调度而处于运行状态,因等待资源或事件而处于阻塞状态。 5?分解模式 1?任务分解---园丁修理草坪2?数据分解---矩阵相乘&园丁修理草坪 3?数据流分解---园丁修理草坪 将一个复杂的过程划分成多个任务,这些任务按照某种顺序执行,这种分解方式成为数据流 分解。 ---要求:理解,分析,举例 总结:任务分解下分工工作,相互配合;数据分解模式下分工明确,互不干扰;数据流分解模式下前一个工作是后一个工作开始的前提。 6 ?理解处理任务之间的数据依赖关系的战略有什么? 变量本地化:最简单的解决方案就是创建,初始化,并使用局部变量 改造变量(把共享变量改造成不共享的变量) 规约:创建线程1和线程2的局部变量suml和sum2,然后suml初始化,并计算循环的奇数迭代,sum2初始化和计算循环的偶数迭代。每个线程都独立计算其迭代。在循环结束时,主线程可以组合规约变量的总和( sum1+ sum2 )。 7 ?常用的同步机制

多核多线程 期末考试 选择题

选择题 1.计算机的硬件发展顺序是(A) A:电子管,晶体管,集成电路,大规模集成电路 2.下面关于Intel8086芯片与8088芯片的描述,不正确的(D)D:8088每周期能传送或接收8位。 3.针对内存的速度瓶颈,英特尔为80386设计了(B)来解决这个速度瓶颈 B:高速缓存(cache) 4.对一个具体问题做性能优化时,可以同时在这多个层次上考虑可能优化手段,一般说来(AB)A:在越高层次上进行优化,可能或效益越高。B:在越低层次上优化时相对越容易实现。 5.vtune性能分析器中的取样功能有哪几种方式(AC) A:基于时间取样C:基于事件取样 6.Inter调优助手能够给我们自动推荐改进认识,主要有哪些方向(BCD) B:处理器瓶颈以及改进C:取样向导增强D:超线程 7.使用-03编译选项所得的程序,执行效率比较-02所得程序(D) D:不一定 8.对于函数调用的边际效应,以下表述不正确(B) B:存在边际效应函数调用,其调用次数不同会对整个程序的行为产生不同的影响。 9.对于一个优化编译器,不正确的是(D) D:优化的编译器能够改进算法的计算复杂度。 10.以下不正确(D) D:由一个进程中的线程切换到另一进程中的线程时,也不会引起进程切换 11.以下表述正确(AC) A:在引入线程操作系统进程之间可以并发执行 C:进程是拥有系统资源一个对立单位,它可以拥有自己的资源。 12.以下不正确的是(A) A:用户级线程在用户层通过线程库实现,对它的创建,撤销和切换都要利用系统的调用。 13.对于操作系统中线程,不正确(D) D:在处理IO阻塞线程的时候,要依次地等到每个请求完成才继续处理下一个请求。 14.I/O阻塞线程(不会)引发时间片切换开销,计算非阻塞线程(会)引起时间片切换的开销。 15.以下错误(D) D:对于有优先级的线程,也可以使用线程池。 16.调用exit会使(整个)进程终止,调用pthread-exit会使(调用)进程终止。 17.如果多个线程同时执行函数的多个活动请求而不会相互干扰,那么这个函数是(线程安全),如果会干扰,这个函数是(非线程安全) 18.用户级线程开销很(低),内核线程开销很(高) 19.不正确(A) A:应用程序可以再内存中找到内核对象的数据结构并直接改变他们的内容。 20.正确的是(AB) A:每个进程被初始化时,系统为它分配一个句柄表,用于保存该进程使用的内核对象信息。B:相同的句柄值在不同的进程中可能标识不同的内核对象。 21.不正确(C) C:进程中不一定有线程。

浅议多核处理器技术

浅议多核处理器技术 00748712 荣振 摘要:多核处理器以其高性能、低功耗优势正逐步取代传统的单处理器成为市场的主流。随着应用需求的扩大和技术的不断进步,多核必将展示出其强大的性能优势。但目前多核处理器技术还面临着诸多挑战,本文主要介绍了多核处理器发展的关键技术并对多核处理器技术的发展趋势进行简要分析。 关键词:多核;同构异构;片上通信;I/O结构;低功耗 1多核处理器介绍 多核处理器也称为片上多处理器(chip multi-processor,CMP),或单芯片多处理器。自1996 年美国斯坦福大学首次提出片上多处理器(CMP)思想和首个多核结构原型,到2001 年IBM推出第一个商用多核处理器POWER4,再到2005 年Intel和AMD多核处理器的大规模应用,最后到现在多核成为市场主流,多核处理器经历了十几年的发展。在这个过程中,多核处理器的应用范围已覆盖了多媒体计算、嵌入式设备、个人计算机、商用服务器和高性能计算机等众多领域,多核技术及其相关研究也迅速发展。 多核处理器将多个完全功能的核心集成在同一个芯片内,整个芯片作为一个统一的结构对外提供服务,输出性能。多核处理器首先通过集成多个单线程处理核心或者集成多个同时多线程处理核心,使得整个处理器可同时执行的线程数或任务数是单处理器的数倍,这极大地提升了处理器的并行性能。其次,多个核集成在片内,极大地缩短了核间的互连线,核间通信延迟变低,提高了通信效率,数据传输带宽也得到提高。再者,多核结构有效共享资源,片上资源的利用率得到了提高,功耗也随着器件的减少得到了降低。最后,多核结构简单,易于优化设计,扩展性强。这些优势最终推动了多核的发展并逐渐取代单处理器成为主流。 2 多核发展的关键技术 多核处理器结构不仅有性能潜力大、集成度高、并行度高、结构简单和设计验证方便等诸多优势,而且它还能继承传统单处理器研究中的某些成果,例如同时多线程、宽发射指令、降压低功耗技术等。但多核处理器毕竟是一种新的结构,在多核结构设计和应用开发中出现了以前未曾遇到的新问题,这些问题给多核处理器的未来提出了挑战。

多核技术与并发多线程技术的区别介绍

多核技术与并发多线程技术的区别介绍 2009-04-16 20:29:32 作者:admin来源:浏览次数:195 网友评论 0 条 很多人在多核技术与并发多线程技术上会把概念弄混淆,我这里给大家简单介绍一下这两个技术的不同。多核技术可以看成是一种cpu的集成技术,在一个CPU处理模块上,可以集成2个或者是多个CPU,但是,他们还是单独的物理cpu。并发多线程技术则需要OS 的支持,是在OS级别上,可以实现一个物理cpu的多线程并发处理,提高oltp环境模式下的cpu利用率。 先说多核技术,如在IBM的power5中,就有如下几种不同的cpu集成模式:如D ual-Core Module(双核),表示一个cpu模块中其实有2个物理的cpu(也叫core),他们共享L2与L3 cache。这种cpu模块一般用在520/550上,所以,象采用这种模式的550最多可以有4颗CPU(2个cpu模块)。而Quad Core Module [QCM],这个不知道怎么翻译了,这种技术下,在一个cpu模块中,有4个物理cpu,相当与2个Dual-Core Module集成在一个cpu模块中,从55Q以后的机型,如55Q、55A都支持这样的cpu模块,所以,如果采用这样的模块,55A就可以达到8颗物理cpu。最后说Multi-Chip Module,这个就叫多核技术了,如一个cpu模块中,可以有8个物理cpu,相当于4个Dual-Core Module,一般用在590与595上。如图,则是一个采用了Multi-Chip Module技术的cpu模块: 从以上的图片与描述可以看到,这种多核技术不过是物理cpu的高集成度技术,让更小的地方,可以放更多的cpu,如550空间大小不变,同样2个cpu模块,如果采用双

多核多线程CPU横评

2010年度评测:13款多核/多线程CPU横评 出处:pconline 2010-12-27 17:26:59 作者:Hero Fan 责任编辑:fanjunhui 评测简介: 2010年,桌面CPU进入到多核心/多线程时代,传统的双核/双线程CPU已沦为入门产品。回顾2010年的CPU市场,Intel和AMD均发布了六核心CPU,开启了桌面六核心时代。Core i3/i5/i7是Intel今年的主力产品,以“智能”为卖点,短短一年时间便取代上代Core 2成为市场的主流。AMD方面则仍以Phenom II和Athlon II为主力,以“多核”为卖点,性价比仍是AMD今年最有力的武器。在2010年即将结束之际,我们PConline CPU频道为大家带来了13款市售典型的多核心、多线程CPU 横向对比评测。 文章内容导航: 1.前言:13款多核/多线程CPU横评11.文件解压缩测试:WinRAR 2.今年热点:Intel全新酷睿家族12.图片处理测试:PhotoShop 3.今年热点:Intel发布桌面六核CPU 13.3D渲染测试:CineBench R11.5 4.今年热点:AMD六核与狮子平台14.视频转换测试:TMPGEnc 5.今年热点:Intel发布i7/i5解锁版15.3D性能测试:3DMark Vantage 6.今年CPU横评:Intel CPU介绍16.游戏性能测试:星际争霸2 7.今年CPU横评:AMD CPU介绍17.游戏性能测试:侠盗车手4 8.评测产品、平台介绍及评测说明18.游戏性能测试:生化危机5 9.多线程理论评测:国际象棋19.平台功耗测试 10.多线程理论评测:wPrime 20.总结及评选结果公布 前言:Central Processing Unit,简称CPU,中文名为“中央处理器”,作为电脑最重要的组成部分,它一直遵循摩尔定律高速发展,很快它又将走过一个年头。回顾2010年,CPU 仍是朝着多核心/多线程的方向发展,桌面CPU全面进入多核心/多线程CPU时代,高端CPU 甚至已经达到了六个核心,曾经主流、高端的双核心/双线程CPU,今年已沦为入门产品,相信不久便会退出历史的舞台。 回顾过去,展望未来,多核/多线程CPU未来肯定会彻底取代经典的双核CPU,因此,我们今年CPU大型横向评测的主题选定为多核心/多线程CPU的横评。

多线程与多核编程

第13章 多线程与多核编程 多任务的并发执行会用到多线程(multithreading ),而CPU 的多核(mult-core )化又将原来只在巨型机中才使用的并行计算(parallel computing )带入普通PC 应用的多核程序设计(multi-core programming )中。 13.1 进程与线程 进程(process )是执行中的程序,线程(thread )是一种轻量级的进程。 13.1.1 进程与多任务 现代的操作系统都是多任务(multitask )的,即可同时运行多个程序。进程(process )是位于内存中正被CPU 运行的可执行程序。参见图15-1。 图15-1 程序与进程 目前的主流计算机采用的都是冯·诺依曼(John von Neumann )体系结构——存储程序计算模型,程序(program )就是在内存中顺序存储并以线性模式在CPU 中串行执行的指令序列。对于传统的单核CPU 计算机,多任务操作系统的实现是通过CPU 分时(time-sharing )和程序并发(concurrency )完成的。即在一个时间段内,操作系统将CPU 分配给不同的程序,虽然每一时刻只有一个程序在CPU 中运行,但是由于CPU 的速度非常快,在很短的时间段中可在多个进程间进行多次切换,所以用户的感觉就像多个程序在同时执行,我们称之为多任务的并发。 13.1.2 进程与线程 程序一般包括代码段、数据段和堆栈,对具有GUI (Graphical User Interfaces ,图形用户界面)的程序还包含资源段。进程(process )是应用程序的执行实例,即正在被执行的程序。每个进程都有自己的虚拟地址空间,并拥有操作系统分配给它的一组资源,包括堆栈、寄存器状态等。 线程(thread )是CPU 的调度单位,是进程中的一个可执行单元,是一条独立的指令执行路径。线程只有一组CPU 指令、一组寄存器和一个堆栈,它本身没有其他任何资源,而是与拥有它的进程共享几乎一切,包括进程的数据、资源和环境变量等。线程的创建、维护和管理给操作系统的负担比进程要轻得多,所以才叫轻量级的进程(lightweight process )。 一个进程可以拥有多个线程,而一个线程只能属于一个进程。每个进程至少包含一个线程——主线程,它负责程序的初始化工作,并执行程序的起始指令。随后,主线程可为执行各种不同的任务而分别创建多个子线程。 一个程序的多个运行,可以通过启动该程序的多个实例(即多个进程)来完成,也可以进程(内存中) 可执行文件(磁/U/光盘上) 运行

Linux利用多核多线程进行程序优化

利用多核多线程进行程序优化 简介:大家也许还记得2005 年 3 月C++ 大师Herb Sutter 在Dr.Dobb’s Journal 上发表了一篇名为《免费的午餐已经结束》的文章。文章指出:现在的程序员对效率、伸缩性、吞吐量等一系列性能指标相当忽视,很多性能问题都仰仗越来越快的CPU 来解决。但CPU 的速度在不久的将来,即将偏离摩尔定律的轨迹,并达到一定的极限。所以,越来越多的应用程序将不得不直面性能问题,而解决这些问题的办法就是采用并发编程技术。 样例程序 程序功能:求从1一直到APPLE_MAX_VALUE (100000000)相加累计的和,并赋值给apple 的a和b;求orange 数据结构中的a[i]+b[i ] 的和,循 环ORANGE_MAX_VALUE(1000000)次。 说明: 1. 由于样例程序是从实际应用中抽象出来的模型,所以本文不会进行test.a=test.b= test.b+sum、中间变量(查找表)等类似的优化。 2. 以下所有程序片断均为部分代码,完整代码请参看本文最下面的附件。 清单1. 样例程序

回页首K-Best 测量方法 在检测程序运行时间这个复杂问题上,将采用Randal E.Bryant和David R. O’Hallaron提出的K 次最优测量方法。假设重复的执行一个程序,并纪录K 次最快的时间,如果发现测量的误差ε 很小,那么用测量的最快值表示过程的真正执行时间,称这种方法为“ K 次最优(K-Best)方法”,要求设置三个参数: K: 要求在某个接近最快值范围内的测量值数量。 ε 测量值必须多大程度的接近,即测量值按照升序标号V1, V2, V3, … , Vi, … ,同时必须满足(1+ ε)Vi >= Vk M: 在结束测试之前,测量值的最大数量。 按照升序的方式维护一个K 个最快时间的数组,对于每一个新的测量值,如果比当前K 处的值更快,则用最新的值替换数组中的元素K ,然后再进行升序排序,持续不断的进行该过程,并满足误差标准,此时就称测量值已经收敛。如果M 次后,不能满足误差标准,则称为不能收敛。 在接下来的所有试验中,采用K=10,ε=2%,M=200 来获取程序运行时间,同时也对K 次最优测量方法进行了改进,不是采用最小值来表示程序执行的时间,而是采用K 次测量值的平均值来表示程序的真正运行时间。由于采用的误差ε 比较大,在所有试验程序的时间收集过程中,均能收敛,但也能说明问题。 为了可移植性,采用gettimeofday() 来获取系统时钟(system clock)时间,可以精确到微秒。 回页首测试环境 硬件:联想Dual-core 双核机器,主频2.4G,内存2G 软件:SuseLinunx Enterprise 10,内核版本:linux-2.6.16 回页首软件优化的三个层次

多核多线程

1、CMP的概念:单芯片多处理器、片上多核处理器。 单芯片多处理器(Chip Multiprocessors,简称CMP),CMP是由美国斯坦福大学提出的,其将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个处理器并行执行不同的进程。 片上多核处理器(Chip Multi-Processor,CMP)就是将多个计算内核集成在一个处理器芯片中,从而提高计算能力。 2、并行计算的弗林分类:单指令流单数据流(SISD)、单指令流多数据流(SIMD)、多指令流单数据流(MISD)、多指令流多数据流(MIMD) 3、进程与线程的关系: ●程序是指令的有序集合,是一个静态的概念。 ●进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位, 是一个动态的概念。 ●线程是程序的有序控制流,是被执行的指令序列。 ●线程属于进程,线程运行在进程空间内。 ●每个进程至少包含一个主线程,负责对进程进行初始化并开始执行初始 指令,创建其他子线程。 ●单个进程可能包含若干个线程,这些线程都并发或并行地执行进程地址 空间中的代码。 ●每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建 一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。进程与线程的主要区别在于: 进程拥有独立的地址空间,而线程和其他线程共享进程的地址空间。 进程之间的通信可以使用操作系统原语或通过共享存储空间来实现,而线程使用当前程序设计语言的原语或者通过进程共享空间来实现通信。 进程上下文的切换是重量级的,进程所有状态都要保存。而线程之间的切换是轻量级的,只需要保存当前寄存器的状态。 6、分解模式: 任务分解:两个园丁分别完成各自功能,但在工作中也需要项目协调,两个园丁不能对同一个地方又翻地又除草。 数据分解:将草坪划分成两半,各自完成一半草坪的翻地和除草工作。

相关文档
最新文档