Предположим, что у меня есть две функции:
Fun1();
Fun2();
Эти функции независимы, и задача будет улучшена, если я смогу запустить их параллельно (то есть запустить Fun1
в одном потоке и Fun2
на другом. Я использую Visual Studio 2012 - так что Open MP 2.0.
Есть ли прямой способ (без какого-либо тестирования числа нитей параллельной области или для уклонения циклы) для достижения этого? Обеспечивает ли OpenMP такую функциональность?
Я попытался рассмотреть parallel
и task
директивы как место для начала, но я нахожу большую часть литературы совершенно непонятной и не мог найти никаких примеров...
Вы можете использовать конструкцию совместного использования sections
:
#pragma omp parallel sections
{
#pragma omp section
Fun1();
#pragma omp section
Fun2();
}
Цитирование из спецификаций OpenMP 2.0 (раздел 2.4.2):
Директива разделов определяет нетеративную конструкцию совместного использования, которая задает набор конструкций, которые должны быть разделены между потоками в команде. Каждый раздел выполняется один раз по потоку в команде.
С++ 11:
std::thread thread1(Fun1);
Fun2(); // runs on main thread
thread1.join(); // wait for completion
Если у вас нет С++ 11, вы можете заменить std::thread
на boost::thread
и сделать то же самое.
Да, почему бы не использовать собственные потоки или некоторые обертки вокруг них? Open MP, насколько я знаю, намного эффективнее, чем простой инструмент для запуска нитей. Конечно, вы можете пометить некоторую переменную флага как shared или private и проверить ее внутри parallelling pragma или, возможно, получить соответствующие результаты с помощью директивы расписания (не помните точно все функции OMP), но...
Похоже, вам не нужен Open MP.
Yeah
на? Это несколько смущает меня: S