pthread_join является узким местом - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть приложение, где pthread_join является узким местом.Мне нужна помощь для решения этой проблемы.

void *calc_corr(void *t) {
         begin = clock();
         // do work
         end = clock();
         duration = (double) (1000*((double)end - (double)begin)/CLOCKS_PER_SEC);
         cout << "Time is "<<duration<<"\t"<<h<<endl;
         pthread_exit(NULL);
}

int main() {
         start_t = clock();

         for (ii=0; ii<16; ii++) 
            pthread_create(&threads.p[ii], NULL, &calc_corr, (void *)ii);

         for (i=0; i<16; i++) 
            pthread_join(threads.p[15-i], NULL);

         stop_t = clock();

         duration2 = (double) (1000*((double)stop_t - (double)start_t)/CLOCKS_PER_SEC);
         cout << "\n Time is "<<duration2<<"\t"<<endl;

         return 0;
}

Время, напечатанное в функции нити, находится в диапазоне 40 мс - 60 мс , где время, указанное в основной функции, находится в 650мс - 670мс .Ирония в том, что мой серийный код работает в 650 мс - 670 мс времени.Что я могу сделать, чтобы сократить время, затрачиваемое на pthread_join?

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 01 февраля 2012

В Linux clock() измеряет суммарное время процессора. Он не измеряет время стены.

Это объясняет, почему вы получаете ~640 ms = 16 * 40ms.(как указано в комментариях)

Чтобы измерить время на стене, вы должны использовать что-то вроде:

1 голос
/ 01 февраля 2012

Создавая несколько потоков, вы добавляете накладные расходы в вашу систему: время создания, время планирования.Создание потока требует выделения стека и т. Д .;планирование означает больше переключения контекста.Также pthread_join suspends execution of the calling thread until the target thread terminates.Это означает, что вы хотите, чтобы поток 1 завершился, когда он перезаписывает вас как можно быстрее, но не мгновенно, затем вы ждете поток 2 и т. Д. *

Теперь на вашем компьютере мало ядер, например одноили 2, и вы создаете 16 потоков.В лучшем случае 2 потока вашей программы будут работать одновременно, и просто добавив их измерения часов, вы получите что-то около 400 ms.

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

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