Pthread сродство, прежде чем создавать темы

Мне нужно установить сродство (поток к ядру, например: 1-й поток к 1-му ядру) перед созданием потока. Что-то вроде KMP_AFFINITY в OpenMP, Является ли это возможным?

редактировать:
Я пытаюсь таким образом, но не работает: /

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

2

Решение

Как упоминалось ранее, вы должны использовать pthread_attr_setaffinity_np привязать поток к конкретному ядру. Количество ядер ЦП, доступных в вашей системе, может быть получено (см. Код ниже).

При создании темы с pthread_createкаждый раз, когда вы должны передать экземпляр pthread_attr_t который установлен с соответствующими cpu_set_t, Каждый раз, когда вы должны очистить cpu_set_t или удалите ранее введенный номер (я выбрал первый вариант) перед добавлением следующего идентификатора ядра процессора в набор. Вам нужно иметь ровно один процессор в наборе при создании потока, если вы хотите точно определить, на каком процессоре будет выполняться поток (см. Код ниже).

#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;
}
20

Другие решения

Вы можете вызвать pthread_self (), чтобы получить идентификатор потока для вашего основного потока и использовать его в pthread_setaffinity_np.

0

Ты можешь использовать pthread_attr_setaffinity_np для установки атрибутов сродства для pthread_create функция.

0
По вопросам рекламы [email protected]