创建线程之前的Pthread亲和性

Jud*_*ath 2 c++ pthreads affinity

我需要在创建线程之前设置亲缘关系(线程到核心,例如:第一个线程到第一个核心).喜欢的东西KMP_AFFINITYOpenMP.可能吗?

编辑:我试试这种方式,但不要工作:/

void* DoWork(void* args)
{
    int nr = (int)args;
    printf("W?tek: %d, ID: %d, CPU: %d\n", nr,pthread_self(), sched_getcpu());  
}


int main()
{   
    int count = 8;
    pthread_t threads[count];

    pthread_attr_t attr;
    cpu_set_t mask;
    CPU_ZERO(&mask);
    pthread_attr_init(&attr);

    for (int i = 0; i < count ; i++)
         CPU_SET(i, &mask);

    pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &mask);

    for(int i=0; i<count ; i++)
    {

        pthread_create(&threads[i], &attr, DoWork, (void*)i);
    }

    for(int i=0; i<count ; i++)
    {
        pthread_join(threads[i], NULL);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 23

如前所述,您应该使用pthread_attr_setaffinity_np将线程绑定到特定核心.可以检索系统中可用的CPU核心数(请参阅下面的代码).

在创建线程时pthread_create,每次必须传递一个实例,pthread_attr_t并使用适当的方法设置cpu_set_t.每次必须清除cpu_set_t或删除先前输入的数字(我选择前一个选项),然后再将CPU核心的下一个标识符添加到集合中.如果要确定线程将在哪个CPU上执行,请在创建线程时在集合中只需要一个CPU(参见下面的代码).

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* DoWork(void* args) {
    printf("ID: %lu, CPU: %d\n", pthread_self(), sched_getcpu());
    return 0;
}

int main() {   

    int numberOfProcessors = sysconf(_SC_NPROCESSORS_ONLN);
    printf("Number of processors: %d\n", numberOfProcessors);

    pthread_t threads[numberOfProcessors];

    pthread_attr_t attr;
    cpu_set_t cpus;
    pthread_attr_init(&attr);

    for (int i = 0; i < numberOfProcessors; i++) {
       CPU_ZERO(&cpus);
       CPU_SET(i, &cpus);
       pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);
       pthread_create(&threads[i], &attr, DoWork, NULL);
    }

    for (int i = 0; i < numberOfProcessors; i++) {
        pthread_join(threads[i], NULL);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)