В моем приложении есть основной поток, который назначает задачи нескольким рабочим потокам. Модели связи заключается в следующем:Увеличение производительности пула потоков (C++, pthreads)
функция потока (работа указатель функции здесь):
while(true) {
pthread_mutex_lock(mutex);
while(!work)
pthread_cond_wait(cond, mutex); // wait for work...
pthread_mutex_unlock(mutex);
work();
pthread_barrier_wait(barrier); /*all threads must finish their work*/
if(thread_id == 0) {
work = NULL;
pthread_cond_signal(cond); /*tell the main thread that the work is done*/
}
pthread_barrier_wait(barrier); /* make sure that none of the other worker
threads is already waiting on condition again...*/
}
В главном потоке (функция, которая назначает задание на рабочих потоков):
pthread_mutex_lock(mutex);
work = func;
pthread_cond_broadcast(cond); // tell the worker threads to start...
while(work)
pthread_cond_wait(cond, mutex); // ...and wait for them to finish
pthread_mutex_unlock(mutex);
Я не использовал очередь здесь, потому что может быть только одна задача за раз, и основной поток должен ждать завершения задачи. Модель работает отлично, но с плохой производительностью. Проблема в том, что задачи будут выполняться очень часто при выполнении одной задачи довольно быстро. Поэтому потоки будут приостанавливаться и ждать очень часто. Я хотел бы уменьшить количество вызовов блокировки pthread_mutex_ (un), phread_cond_wait и pthread_barrier, но я не вижу, как это можно сделать.
Можете ли вы объяснить, какая задача разделяется? возможно, сама задача не улучшится от ее запуска через несколько потоков. – nrathaus
Возможно, вы можете выполнять свои задачи и запускать их группами, а не по одному за раз? – benjymous
Я разрабатываю небольшую библиотеку для вычисления линейной алгебры. Задачами, которые могут быть разделены, являются векторные операции, такие как сложение, вычитание, точечные продукты и т. Д. Я должен запускать одну задачу за раз, потому что я не знаю, какие операции будет выполнять пользователь библиотеки, но производительность этих операций значительно возрастает, Я использую потоки. Изменить: производительность вышеприведенного кода не очень плоха, но не так хороша, как использование OpenMP, например (я хочу сравнить оба метода). – cthl