在Linux中sched_setaffinity cpu亲和力

我在一台服务器上做了一个sched_setaffinitytesting,使用1个socket,4个内核,下面的/ proc / cpuinfo显示了cpu的信息:

processor : 0 model name : Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz cache size : 2048 KB physical id : 0 siblings : 4 cpu cores : 4 processor : 1 model name : Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz cache size : 2048 KB physical id : 0 siblings : 4 cpu cores : 4 processor : 2 model name : Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz cache size : 2048 KB physical id : 0 siblings : 4 cpu cores : 4 processor : 3 model name : Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz cache size : 2048 KB physical id : 0 siblings : 4 cpu cores : 4 

我有一个简单的testing应用程序:

 struct foo { int x; int y; } ; //globar var volatile struct foo fvar ; pid_t gettid( void ) { return syscall( __NR_gettid ); } void *test_func0(void *arg) { int proc_num = (int)(long)arg; cpu_set_t set; CPU_ZERO( &set ); CPU_SET( proc_num, &set ); printf("proc_num=(%d)\n",proc_num) ; if (sched_setaffinity( gettid(), sizeof( cpu_set_t ), &set )) { perror( "sched_setaffinity" ); return NULL; } int i=0; for(i=0;i<1000000000;++i){ __sync_fetch_and_add(&fvar.x,1); } return NULL; } //test_func0 

编译:gcc testsync.c -D_GNU_SOURCE -lpthread -o testsync.exe以下是testing结果:

 2 threads running test_func0 in core 0,1 take 35 secs ; 2 threads running test_func0 in core 0,2 take 55 secs ; 2 threads running test_func0 in core 0,3 take 55 secs ; 2 threads running test_func0 in core 1,2 take 55 secs ; 2 threads running test_func0 in core 1,3 take 55 secs ; 2 threads running test_func0 in core 2,3 take 35 secs ; 

我想知道为什么2个线程运行在核心(0,1)或核心(2,3)将在其他更快? 如果我在同一个内核上运行2个线程,如核心(1,1),核心(2,2),核心(3,3),这将需要28秒,也混淆了为什么会发生这种情况?

Solutions Collecting From Web of "在Linux中sched_setaffinity cpu亲和力"

内核0和1共享一个二级缓存,内核2和内核3也共享一个内核。运行在共享缓存的两个内核上,共享变量保持在二级缓存中,这使得速度更快。

在今天的英特尔处理器中,L2是每个核心,这是不正确的。 但是在你使用的CPU上,它是如何工作的(它实际上是一个由两个双核CPU粘合在一起的四核CPU)。