2013-07-01 4 views
2

Я пишу программу linux C с двумя процессами. Я запустил программу на разных машинах.Как программировать, чтобы разные процессы выполнялись на разных ядрах процессора?

Эти машины могут иметь несколько ядер процессора.

Когда я запускаю программу, система будет выделять различные ядра ЦП для разных процессов? или мне нужно написать некоторые коды, чтобы полностью использовать ядра процессора?

+2

Да, если не сделать что-то, чтобы предотвратить это, ядро ​​будет планировать процессы на всех ядрах. Чтобы использовать несколько ядер в одной программе, вы обычно используете несколько потоков (хотя иногда это может быть неявным, например, с использованием OpenMp). –

ответ

1

Если вы хотите подключить потоки/процессы к конкретным процессорам, вам необходимо использовать системный вызов 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; 
} 
+0

Я не уверен, кто отрицает этот ответ, но это справедливый ответ. Если кто-то хочет привязать задачу к определенному процессору, это путь, если вы не хотите, чтобы планировщик решил. +1 –

+0

@rakib Cheers. Я никогда не понимал, как люди могут ниспровергать в любом случае, не комментируя, что не так. –