Если вы хотите подключить потоки/процессы к конкретным процессорам, вам необходимо использовать системный вызов sched_setaffinity(2)
или вызов библиотеки pthread_setaffinity_np(3)
. Каждое ядро в Linux имеет собственный виртуальный идентификатор процессора.
Эти вызовы позволяют установить разрешенную маску процессора.
В противном случае это будет до отступления планировщика, чтобы запустить ваши потоки, где ему кажется, что они запускают их.
Не гарантирует, что ваш процесс будет проходить параллельно. Это то, что может решить только планировщик, если вы не запустите в реальном времени.
Вот некоторые примеры кода:
#include <sched.h>
int run_on_cpu(int cpu) {
cpu_set_t allcpus;
CPU_ZERO(&allcpus);
sched_getaffinity(0, sizeof(cpu_set_t), &allcpus);
int num_cpus = CPU_COUNT(&allcpus);
fprintf(stderr, "%d cpus available for scheduling\nAvailable CPUs: ", num_cpus);
size_t i;
for (i = 0; i < CPU_SETSIZE; i++) {
if (CPU_ISSET(i, &allcpus))
fprintf(stderr, "%zu, ", i);
}
fprintf(stderr, "\n");
if (CPU_ISSET(cpu, &allcpus)) {
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
CPU_SET(cpu, &cpu_set);
return pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu_set);
}
return -1;
}
Да, если не сделать что-то, чтобы предотвратить это, ядро будет планировать процессы на всех ядрах. Чтобы использовать несколько ядер в одной программе, вы обычно используете несколько потоков (хотя иногда это может быть неявным, например, с использованием OpenMp). –