Мне нужно установить сродство (поток к ядру, например: 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);
}
}
Как упоминалось ранее, вы должны использовать 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;
}
Вы можете вызвать pthread_self (), чтобы получить идентификатор потока для вашего основного потока и использовать его в pthread_setaffinity_np.
Ты можешь использовать pthread_attr_setaffinity_np
для установки атрибутов сродства для pthread_create
функция.