2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Pthreads.
Сообщение11.12.2012, 19:08 


26/08/09
197
Асгард
Здравствуйте, участники форума. У меня есть программа, которая решает СЛАУ. У меня процессор 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 
Заслуженный участник


04/05/09
4587
Для того, чтобы программа могла использовать многопоточность, её надо специально так написать. Если она у вас собиралась раньше и без -lpthreads, то она, скорее всего, просто однопоточная (хотя есть варианты и без pthreads).

 Профиль  
                  
 
 Re: Pthreads.
Сообщение11.12.2012, 19:26 


10/04/12
705
В программу смотреть, как там реализована многопоточность... Телепаты в отпуске.

 Профиль  
                  
 
 Re: Pthreads.
Сообщение11.12.2012, 19:28 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Pthreads.
Сообщение13.12.2012, 17:57 


26/08/09
197
Асгард
Код сам по себе огромен, в его работоспособности нет сомнения (на университетских компах работает). Но и там есть одна проблема - без -O3 все прекрасно работает. А "минус о три" должен оптимизировать, всего лишь, не так ли?

 Профиль  
                  
 
 Re: Pthreads.
Сообщение13.12.2012, 18:20 
Заслуженный участник


04/05/09
4587
Как вариант - слишком частая синхронизация. Если компилировать без оптимизации, код выполняется медленнее, и распараллеливание помогает. Если же соптимизировать, код начинает работать слишком быстро, и почти всё время все потоки, кроме одного, ждут на каком-нибудь мутексе.

 Профиль  
                  
 
 Re: Pthreads.
Сообщение13.12.2012, 20:02 


26/08/09
197
Асгард
Интересно еще одно - компилирую через -lpthread , а в самом коде можно убрать #inlcude <pthread.h>. Почему?

 Профиль  
                  
 
 Re: Pthreads.
Сообщение13.12.2012, 20:05 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Pthreads.
Сообщение13.12.2012, 20:38 


26/08/09
197
Асгард
Чтобы при -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 
Заслуженный участник


04/05/09
4587
А что делает sychronize()? Что-то я не могу сообразить...
Да и вообще, не понятно, как это работает в параллель.

 Профиль  
                  
 
 Re: Pthreads.
Сообщение14.12.2012, 02:07 


26/08/09
197
Асгард
Это всего лишь кусок кода, все что нужно для создания потоков уже сделано. Вопрос утыкается на данный фрагмент кода(я так считаю).Каждый поток встретив synchronize() останавливается(ждет), и продолжает работу только после того, как все потоки дойдут до этой функции.

 Профиль  
                  
 
 Re: Pthreads.
Сообщение15.12.2012, 19:13 


26/08/09
197
Асгард
Как посмотреть, что убирает или перепрыгивает -O3?

 Профиль  
                  
 
 Re: Pthreads.
Сообщение10.01.2013, 01:10 


10/01/11
4
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 
Заслуженный участник


09/09/10
3729
А не лучше ли распределять матрицу между потоками не блоками строк, а лентами? Т.е., если у вас четыре потока, то нулевой поток работает со строками, чьи индексы кратны четырем, первый — со строками, чьи индексы $\equiv1\pmod4$, ..., третий — со строками, чьи индексы $\equiv3\pmod4$?

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group