Linux线程关联使线程运行速度变慢

Linux线程关联使线程运行速度变慢,linux,pthreads,cpu,affinity,Linux,Pthreads,Cpu,Affinity,我试图通过设置线程的cpu相关性来提高cpu利用率并使线程运行得更快。这是我的密码: #define _GNU_SOURCE #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <time.h> #define NUM 100000000 void *randf

我试图通过设置线程的cpu相关性来提高cpu利用率并使线程运行得更快。这是我的密码:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <sched.h>
#include <time.h>

#define NUM 100000000
void *randfun(void *arg)
{
    int i;

    clock_t start, end;

    start = clock();

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

    end = clock();

    printf("cpu random: %fs\n", (double)(end - start)/CLOCKS_PER_SEC);
    return;
}

void *fun(void *arg)
{
    int process_id = (int)arg;
    cpu_set_t mask;
    cpu_set_t get;

    CPU_ZERO(&mask);
    CPU_SET(process_id, &mask);

    pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);

    CPU_ZERO(&get);

    int ac_id = pthread_getaffinity_np(pthread_self(), sizeof(get), &get);

    if(ac_id < 0)
    {
        printf("set thread affinity failed\n");
        return NULL;
    }
    int i;

    clock_t start, end;

    start = clock();

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

    end = clock();

    printf("cpu affinity: %fs\n", (double)(end - start)/CLOCKS_PER_SEC);
    return;
}
int main()
{
    int i;
    int num = sysconf(_SC_NPROCESSORS_ONLN);
    pthread_t *tidset = (pthread_t*)malloc(sizeof(pthread_t)*num);

    for(i=0; i<num; i++){
        pthread_create(tidset+i, NULL, (void*)fun, (void*)i);
    }

    for(i=0; i<num; i++){
        pthread_join(tidset[i], NULL);
    }

    for(i=0; i<num; i++){
        pthread_create(tidset+i, NULL, (void*)randfun, NULL);
    }

    for(i=0; i<num; i++){
        pthread_join(tidset[i], NULL);
    }

    free(tidset);
    return 0;
}

有什么不对劲吗

试图超越内核是非常非常困难的。它能获得比你多得多的信息。是的,有点不对劲。这是:“我试图通过设置线程的cpu相关性来提高cpu利用率并使线程运行得更快”。你最初的前提是不正确的。无法保证CPU亲和力本身会产生您想要的效果。另外,你还没有解释你是如何得出一个比另一个“跑得快”的结论的。查看printf的输出并不能确定地告诉您这一点。总之,您的前提和测试方法可能需要做一些工作。
2  Intel(R) Core(TM) i5-4260U CPU @ 1.40GHz
1 physical id   : 0
1 address sizes : 36 bits physical, 48 bits virtual
1 physical id   : 0
1 address sizes : 36 bits physical, 48 bits virtual