pthreads - установить привязку процессора для двух потоков к одному ядру - PullRequest
0 голосов
/ 17 апреля 2020

Следующий код C для Linux инициализирует N потоков с одним потоком на ядро. Потоки созданы и сродство установлено в первом для -l oop. Поток 0 (в разделе «если i == 0») назначен для вызова Thread_Process2, а все остальные потоки (в разделе «если i> 0») - для вызова Thread_Process1. Я использовал эту программу в течение некоторого времени с большим успехом.

Теперь я хочу создать два потока на ядре 0 и один поток на всех остальных ядрах. Я думаю, что я могу создать дополнительный поток в ядре 0, добавив дополнительную строку pthread_create, которую я добавил в раздел «если i == 0», но где мы вызываем pthread_join во втором for-l oop, потоки идентифицируются потоками [ я], но два потока имеют один и тот же номер ядра и, следовательно, не идентифицируются отдельно для соединения.

Вот код:

int thread_create_in_C_FC(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);
       printf("Core created %d\n", i);
       pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);

    if (i > 1){
       printf("Thread created %d\n", i);
       pthread_create(&threads[i], &attr, Thread_Process2, NULL); }

    if (i == 0){
       printf("Final thread created %d\n", i);
       pthread_create(&threads[i], &attr, Thread_Process1, NULL);
       pthread_create(&threads[i], &attr, Thread_Process1, NULL);}
    }

    for (int i = 0; i < numberOfProcessors; i++) {
        pthread_join(threads[i], NULL);
        printf("Core joined %d\n", i);
    }

    return numberOfProcessors;
}

Мои вопросы:

  1. Это правильно, что я могу создать два потока на ядре 0, добавив дополнительная строка pthread_create в разделе «if i ​​== 0»?

  2. Если это так, как мне объединить оба потока на ядре 0 во втором for-l oop, где мы вызываем pthread_join?

1 Ответ

0 голосов
/ 17 апреля 2020

Вот как я решил эту проблему. До сих пор, похоже, не было никаких проблем с этим:

int thread_create_in_C_FC(numberOfProcessors) {

    pthread_t threads[numberOfProcessors+1];

    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);
       printf("Core created %d\n", i);
       pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);

    if (i > 0){
       printf("Thread created %d\n", i);
       pthread_create(&threads[i+1], &attr, Thread_Process2, NULL); }

    if (i == 0){ //Core 0 Thread 1
       printf("Final thread created %d\n", i);
       pthread_create(&threads[i], &attr, Thread_Process1, NULL);
       pthread_create(&threads[i+1], &attr, Thread_Process1, NULL);}
    }

    for (int i = 0; i < numberOfProcessors+1; i++) {
        pthread_join(threads[i], NULL);
        printf("Core joined %d\n", i);
    }

    return numberOfProcessors;
}

В нескольких точках выше я добавил 1 к счету, как показано цветовой кодировкой, которую вы видите, если вы находитесь на Стек переполнен темным режимом.

Если я обнаружу какие-либо проблемы после работы с ним, я обновлю этот ответ. Но это выглядит как правильный способ сделать это, потому что теперь я получаю два потока, назначенные ядру 0, а другие - более высокие номера ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...