Мне нужно переключиться с boost :: thread на OpenMP, потому что так говорит босс.
Проблема довольно проста: результат моделирования записывается на диск каждые 5 итераций (int it = 5,10,15 ...). Для простоты предположим, что у меня 8-ядерный процессор. Я создал 9 потоков; поток 0 используется для ввода-вывода, остальные 8 для вычислений. Когда (это% 5 == 0), я проверяю поток 0, чтобы увидеть, закончил ли он. Если да, я создаю другой поток, вызываю 0 и прошу его записать результат на диск. Если нет, все темы должны ждать. Обычно время записи результата составляет менее 5 итераций, поэтому я эффективно «скрываю» стоимость ввода-вывода.
Я потратил несколько часов на изучение OpenMP и, полагаю, тот же алгоритм можно реализовать с помощью конструкции «задача», но я не понимаю, как я могу синхронизировать потоки. Эксперты OpenMP помогите пожалуйста. Спасибо.
Текущий псевдокод выглядит следующим образом
boost::thread pool[9];
for(int it=0;it<1000;it++)
{
- simulate using pool[1,8]
- if(it%5 == 0)
+ check pool[0]
+ if finished: create new thread, assign to pool[0], write data out
+ if not, wait
}