gpt4 book ai didi

c++ - 创建线程前的 Pthread affinity

转载 作者:太空狗 更新时间:2023-10-29 23:21:51 25 4
gpt4 key购买 nike

我需要在创建线程之前设置关联(线程到核心,例如:第一个线程到第一个核心)。类似于 OpenMP 中的 KMP_AFFINITY。可能吗?

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

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);
}
}

最佳答案

如前所述,您应该使用 pthread_attr_setaffinity_np 将线程绑定(bind)到特定核心。可以检索系统中可用的 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;
}

关于c++ - 创建线程前的 Pthread affinity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com