2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Pthreads.
Сообщение11.12.2012, 19:08 
Здравствуйте, участники форума. У меня есть программа, которая решает СЛАУ. У меня процессор Core I3. Программа точно работающая. Как запустить ее у себя на ноуте (ОС - Ubuntu 12.04)? Вот я пишу такие команды в терминале :
Код:
g++ main.cpp -lpthreads -lm -O3
. Результаты таковы: $n = 1  $ $  time1 = 10.3sec $ $ n = 2$ $time2 = 9.6sec$. Т.е. распараллеливание не идет.

 
 
 
 Re: Pthreads.
Сообщение11.12.2012, 19:22 
Для того, чтобы программа могла использовать многопоточность, её надо специально так написать. Если она у вас собиралась раньше и без -lpthreads, то она, скорее всего, просто однопоточная (хотя есть варианты и без pthreads).

 
 
 
 Re: Pthreads.
Сообщение11.12.2012, 19:26 
В программу смотреть, как там реализована многопоточность... Телепаты в отпуске.

 
 
 
 Re: Pthreads.
Сообщение11.12.2012, 19:28 
venco в сообщении #657126 писал(а):
Для того, чтобы программа могла использовать многопоточность, её надо специально так написать.
Раз время для двух потоков как-то измерялось, похоже, что она так и написана :-) . Код неплохо было бы увидеть.
А так, это вполне возможно. По самым разнообразным причинам, от неправильно написанного кода, до загрузки процессора другими процессами. А чтобы так уверенно судить, идет ли распараллеливание, нужен профилировщик, отладчик с возможностью отладки многопоточного кода или отладочная печать в программе (потокобезопасная, разумеется).
P.S. Попробую протелепатить: что будет, если убрать оптимизацию (ключик -o3)?

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 17:57 
Код сам по себе огромен, в его работоспособности нет сомнения (на университетских компах работает). Но и там есть одна проблема - без -O3 все прекрасно работает. А "минус о три" должен оптимизировать, всего лишь, не так ли?

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 18:20 
Как вариант - слишком частая синхронизация. Если компилировать без оптимизации, код выполняется медленнее, и распараллеливание помогает. Если же соптимизировать, код начинает работать слишком быстро, и почти всё время все потоки, кроме одного, ждут на каком-нибудь мутексе.

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 20:02 
Интересно еще одно - компилирую через -lpthread , а в самом коде можно убрать #inlcude <pthread.h>. Почему?

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 20:05 
3.14 в сообщении #658048 писал(а):
Интересно еще одно - компилирую через -lpthread , а в самом коде можно убрать #inlcude <pthread.h>. Почему?
Потому что pthreads.h включается каким-то другим заголовком, типа stdlib.h.

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 20:38 
Чтобы при -O3 нормально работала мне придется менять часть кода или установить дополнительные пакеты? Что я могу сделать? В кратце, моя задача такова:
Методом Гаусса-Жордана решить СЛУ(Ax = b). Для начало я распределяю матрицу A по тредам (блоками строк), т.е. каждый тред должен будет обрабатывать кусок матрицы начиная только с некоторого номера(row_start) по некоторый row_end. Моя функция work (функция, которую должен проделать каждый тред) прогоняет цикл по i номерам строк, и если эта строка лежит в куске матрицы действующего треда, то делит на a[i][i] и т.д.
Код:
void *work (void *ptr)
{
   ARGS * arg = (ARGS*) ptr;
   int   thrN = arg->thread_number,
      rs = arg->rs,
      re = arg->re,
      n = arg->n;   

   int total_threads = arg->thread_count;
   
   double *a = arg->a,
          *b = arg->b;
          
   double tmp;
   
   int i, k, j;

   for (i = 0; i < n; i++)
   {
      if (i <= re && i >= rs)
      {
         tmp = a[i*n + i];

         for (k = i; k < n; k++)
            a[i*n + k] /= tmp;
         b[i] /= tmp;       
      }
      synchronize(total_threads);
      if (i <= re && i >= rs)
      {
         for (j = rs; j < i; j++)
         {
            tmp = a[j * n + i];
            
            for (k = i; k < n; k++)
               a[j*n + k] -= a[i*n + k] * tmp;
            b[j] -= b[i] * tmp;
         }
         for (j = i + 1; j <= re; j++)
         {
            tmp = a[j * n + i];
            for (k = i; k < n; k++)
               a[j*n + k] -= a[i*n + k] * tmp;
            b[j] -= b[i] * tmp;
         }
      }
      else
      {
         for (j = rs; j <= re; j++)
         {
            tmp = a[j * n + i];
            for (k = i; k < n; k++)
               a[j*n + k] -= a[i*n + k]*tmp;
            
            b[j] -= b[i] * tmp;
         }
      }
   }
   
   return NULL;
}


Как я понимаю, чем меньше synchronize, тем быстрее работает распараллеливание. Как видите, использую sync только в одном месте. Мне кажется, это самый оптимальный вариант. Не так ли?

 
 
 
 Re: Pthreads.
Сообщение13.12.2012, 20:56 
А что делает sychronize()? Что-то я не могу сообразить...
Да и вообще, не понятно, как это работает в параллель.

 
 
 
 Re: Pthreads.
Сообщение14.12.2012, 02:07 
Это всего лишь кусок кода, все что нужно для создания потоков уже сделано. Вопрос утыкается на данный фрагмент кода(я так считаю).Каждый поток встретив synchronize() останавливается(ждет), и продолжает работу только после того, как все потоки дойдут до этой функции.

 
 
 
 Re: Pthreads.
Сообщение15.12.2012, 19:13 
Как посмотреть, что убирает или перепрыгивает -O3?

 
 
 
 Re: Pthreads.
Сообщение10.01.2013, 01:10 
3.14 в сообщении #658813 писал(а):
Как посмотреть, что убирает или перепрыгивает -O3?
Сравнить выводы дизассемблера, например.
Код:
sbar@laptop /var/tmp $ gcc h.c -O0 -o h0
sbar@laptop /var/tmp $ gcc h.c -O3 -o h3
sbar@laptop /var/tmp $ objdump -D h0 > h0.txt
sbar@laptop /var/tmp $ objdump -D h3 > h3.txt
sbar@laptop /var/tmp $ diff -u h{0,3}.txt | less

 
 
 
 Re: Pthreads.
Сообщение10.01.2013, 12:06 
А не лучше ли распределять матрицу между потоками не блоками строк, а лентами? Т.е., если у вас четыре потока, то нулевой поток работает со строками, чьи индексы кратны четырем, первый — со строками, чьи индексы $\equiv1\pmod4$, ..., третий — со строками, чьи индексы $\equiv3\pmod4$?

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

 
 
 [ Сообщений: 14 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group