Как назначить потоки на разные ядра в C? - PullRequest
0 голосов
/ 29 ноября 2018

Я создал программу, которая делает сложение 8 чисел, используя 4 потока, а затем произведение результатов.Как обеспечить, чтобы каждый поток использовал отдельное ядро ​​для максимального увеличения производительности.Я новичок в pthreads, поэтому я действительно не знаю, как правильно его использовать.Пожалуйста, предоставьте ответы как можно проще.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[9];
void *sum_thread(void *arg)
{
    int *args_array;
    args_array = arg;
    int n1,n2,sum;
    n1=args_array[0];
    n2=args_array[1];
    sum = n1*n2;

    printf("N1 * N2 = %d\n",sum);
    return (void*) sum;
}
void *sum_thread1(void *arg)
{
    int *args_array;
    args_array = arg;
    int n3,n4,sum2;
    n3=args_array[2];
    n4=args_array[3];
    sum2=n3*n4;
    printf("N3 * N4 = %d\n",sum2);
    return (void*) sum2;
}
void *sum_thread2(void *arg)
{
    int *args_array;
    args_array = arg;
    int n5,n6,sum3;
    n5=args_array[4];
    n6=args_array[5];
    sum3=n5*n6;
    printf("N5 * N6 = %d\n",sum3);
    return (void*) sum3;
}
void *sum_thread3(void *arg)
{
    int *args_array;
    args_array = arg;
    int n8,n7,sum4;
    n7=args_array[6];
    n8=args_array[7];
    sum4=n7*n8;
    printf("N7 * N8 = %d\n",sum4);
    return (void*) sum4;
}
int main()
{
    int sum3,sum2,sum,sum4;
    int prod;
    global[0]=9220; global[1]=1110; global[2]=1120; global[3]=2320; global[4]=5100; global[5]=6720; global[6]=7800; global[7]=9290;// the input
    pthread_t tid_sum;
    pthread_create(&tid_sum,NULL,sum_thread,global);
    pthread_join(tid_sum,(void*)&sum);
    pthread_t tid_sum1;
    pthread_create(&tid_sum1,NULL,sum_thread1,global);
    pthread_join(tid_sum1,(void*)&sum2);
    pthread_t tid_sum2;
    pthread_create(&tid_sum2,NULL,sum_thread2,global);
    pthread_join(tid_sum2,(void*)&sum3);
    pthread_t tid_sum3;
    pthread_create(&tid_sum3,NULL,sum_thread3,global);
    pthread_join(tid_sum3,(void*)&sum4);
    prod=sum+sum2+sum3+sum4;
    printf("The sum of the products is: %d", prod);
    return 0;
}

1 Ответ

0 голосов
/ 29 ноября 2018

Вы не имеете, не хотите и не должны (хотя я не знаю, можете ли вы как-нибудь) управлять аппаратными ресурсами на таких низких уровнях.Это работа для вашей ОС и частично для стандартных библиотек: они были протестированы, оптимизированы и стандартизированы должным образом.

Я сомневаюсь, что вы можете добиться большего успеха.Если вы делаете то, что говорите, либо являетесь опытным программистом аппаратного обеспечения / ОС, либо разрушаете десятилетия работы :).

Также учтите этот факт: ваш код больше не будет переносимым, если вы сможете индексировать ядра.вручную, так как это зависит от количества ядер вашей машины.

С другой стороны, многопоточные программы должны работать (а иногда даже лучше) даже при наличии одного ядра.Примером является случай, когда один из потоков ничего не делает до тех пор, пока не произойдет событие: вы можете заставить один поток перейти в «спящий режим», чтобы только другие потоки использовали ЦП;затем, когда событие произойдет, оно выполнится.В не многопоточной программе обычно используется опрос, который использует ресурсы процессора, чтобы ничего не делать.

Также @yano сказал, что многопоточная программа в этом случае не параллельна, так как вы создаете поток, а затем ожидаете его.закончить с pthread_join перед запуском других потоков.

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