сложные потоки с OpenMP - PullRequest
       34

сложные потоки с OpenMP

4 голосов
/ 30 июня 2011

Мне нужно переключиться с 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
}

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

У Intel очень хороший ответ на дилемму OpenMP vs Threads, я хотел бы отложить их и попросить вашего босса получить некоторое образование.

OpenMP очень ориентирован на циклы, вы парализуетевесь цикл, а не иметь синхронизированные потоки.

0 голосов
/ 01 июля 2011

Ваш дизайн мне кажется правильным: иметь отдельный поток для ввода-вывода и пул потоков для вычислений - это правильно. Возможно, вы замените потоки Boost в пуле [1..8] на OpenMP для вычислительной части, но я бы не пошел дальше. Если вы не можете использовать Boost, используйте потоки POSIX.

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