2013-10-07 6 views
0

Пусть у меня есть две функции:.Как явным образом выполняю задачи?

Fun1(); 
Fun2(); 

Эти функции независимы и задача была бы улучшена, если бы я мог запустить их параллельно (то есть, запустить Fun1 на одну нить и Fun2 на другой, я использую Визуальное Studio 2012 -.? так Open MP 2,0

есть прямо вперед пути (без параллельной области резьбы тестирования номера или для контура dodginess) для достижения этой цели Предусматривает ли OpenMP этого вида функциональности?

Я пытался смотреть на директивах parallel и task как место, чтобы начать, но я считаю, большая часть литературы тщательно incomprehensible и не смогли найти каких-либо примеров ...

+0

Важная информация, которую нужно знать, если у вас действительно есть только две такие функции, которые вы вызываете только один раз (или, может быть, несколько раз). Если это так просто, использование 'std :: thread', как в ответе Джона Звинка, безусловно, является самым простым и эффективным решением. Если у вас есть дюжина функций, которые вы называете тысячу раз, решение Massimiliano было бы намного предпочтительнее (или, альтернативно, реализовать свою собственную очередь задач). – Damon

ответ

4

Вы можете использовать sections разделения труда построить:

#pragma omp parallel sections 
{ 
#pragma omp section 
    Fun1(); 
#pragma omp section 
    Fun2(); 
} 

Цитирование из OpenMP 2.0 specifications (с 2.4.2.):

Директива секции определяет noniterative работы по обмену конструкт, определяет набор конструкций, которые должны быть разделены среди потоков в команде. Каждый раздел выполняется один раз в потоке в команде .

5

C++ 11:

std::thread thread1(Fun1); 
Fun2(); // runs on main thread 
thread1.join(); // wait for completion 

Если у вас нет C++ 11, вы можете заменить std::thread на boost::thread и сделать то же самое.

0

Да, почему бы не использовать собственные потоки или некоторые обертки вокруг них? Open MP, насколько я знаю, намного эффективнее, чем простой инструмент для запуска нитей. Конечно, вы можете отметить некоторую переменную флаг как общие или частные и проверить его внутри Параллельное прагме или, возможно, получить соответствующие результаты с использованием графика директивы (не помню точно, все функции OMP), но ...

  • You У нас есть только две задачи
  • Это не параллельные вычисления, это не eveb какой-то примитивный пул потоков, та же проблема, что и получение GUI и вычислений в двух отдельных потоках
  • Вы еще не сказали что-либо о синхронизации или комплексном сотрудничестве ниток

Похоже, вам не нужен Open MP.

+1

Интересно, кого или кого вы нацеливаете на «Да»?Это несколько смущает меня: S –

+0

Извините, я, возможно, не слишком хорош на английском, но я определенно согласен с простым, но лучшим решением, предложенным Джоном Звинком. Автор спросил об открытии MP, кажется, он настаивал на нем, но без надлежащей причины. UPD: ops, есть другой ответ. Страница не обновлялась вовремя. – MasterAler

+0

А я вижу :) Ваш английский хороший. Однако, что касается «Да», имейте в виду, что Stack Overflow не является форумом или потоковой системой; все ответы могут быть произвольно заказаны;) –

Смежные вопросы