linux中的sched_setaffinity cpu affinity

时间:2013-01-18 05:01:06

标签: c linux cpu

我已在Linux中在一个带有1个插槽,4个内核的服务器上进行了sched_setaffinity测试, 以下/ 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

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

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 以下是测试结果:

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秒,也混淆了为什么会发生这种情况?

1 个答案:

答案 0 :(得分:7)

核心0和1共享L2缓存,核心2和3也共享。在共享缓存的两个核心上运行使共享变量保留在L2缓存中,这使事情变得更快。

今天的英特尔处理器并非如此,其中L2是每核心。但是在您正在使用的CPU上,这就是它的工作原理(它实际上是通过将两个双核CPU粘合在一起而制成的四核CPU)。