параллельное программирование на С - PullRequest
1 голос
/ 07 марта 2011

Я пытаюсь распараллелить трассировщик лучей в C, но время выполнения не уменьшается по мере увеличения числа потоков. Код, который у меня пока есть:

main2(thread function):

float **result=malloc(width * sizeof(float*));
int count=0;
for (int px=0;, px<width; ++px)
{
     ...
     for (int py=0; py<height; ++py)
     {
         ...
         float *scaled_color=malloc(3*sizeof(float));
         scaled_color[0]=...
         scaled_color[1]=...
         scaled_color[2]=...

         result[count]=scaled_color;
         count++;
         ...
      }
}
...
return (void *) result;

main:
pthread_t threads[nthreads];
 for (i=0;i<nthreads;i++)
 {
      pthread_create(&threads[i], NULL, main2, &i);
 }

 float** result_handler;

 for (i=0; i<nthreads; i++)
 {
      pthread_join(threads[i], (void *) &result_handler);
      int count=0;

      for(j=0; j<width;j++)
     {
          for(k=0;k<height;k++)
          {
               float* scaled_color=result_handler[count];
               count ++;
               printf...
           }
           printf("\n");
       }
  }

main2 возвращает число с плавающей точкой **, так что картинка может быть распечатана по порядку в основной функции. Кто-нибудь знает, почему время выполнения не уменьшается (например, оно работает дольше с 8-ю потоками, чем с 4-мя потоками, когда это должно быть наоборот)?

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

Недостаточно добавлять темы, нужно также разделить задачу.Похоже, вы выполняете одну и ту же работу в каждом потоке, поэтому вы получаете n копий результата с n потоками.

2 голосов
/ 07 марта 2011

Параллелизм программ и алгоритмов, как правило, нетривиальны для достижения и не требует каких-либо вложений.

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

0 голосов
/ 07 марта 2011

Две вещи работают против вас здесь.(1) Если вы не можете выделить потоки более чем одному ядру, вы не могли ожидать ускорения в первую очередь;используя одно ядро, это ядро ​​выполняет одинаковую работу, независимо от того, распараллеливаете ли вы код или нет.(2) Даже при использовании нескольких ядер параллельная производительность чрезвычайно чувствительна к отношению вычислений, выполняемых на ядре, к объему связи, необходимому между ядрами.С помощью ptrhead_join () внутри цикла вы часто сталкиваетесь с подобными хитами производительности «остановись и жди другого парня».

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