2016-06-17 1 views
0

по некоторым причинам, я должен поставить код между каждым for заявление в вложенных циклов, как это:OpenMP вложенных циклов с кодом между каждым `for` цикла

for (int i = 0; i < n; ++i) { 
    //i have to put some code here 
    do something_1 

    for (int j = 0; j < n; ++j) { 
     //i have to put some code here 
     do something_2 

     for (int k = 0; k < n; ++k) { 
      do something_3 
     } 

    } 
} 

------ Обновление 20: 11 6.17 2016 ----------------------

Я нашел, что это не вложенные петли, сделанные моей программой с программой OpenMP, я использую std::vector с методом push_back() внутри и это действительно опасно при использовании OpenMP.

+0

Я не являюсь экспертом в OpenMP, но как насчет того, чтобы вы обманули его и переместили «сделать что-то» и внутреннее для функции, а затем назовите его в for? – hauron

+0

Вы пробовали '#pragma omp parallel for'? – hmatar

+1

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

ответ

1

Вы можете в принципе распараллелить этот код с помощью openmp. Вот как вы можете это сделать, используя Visual Studio. (Для других сред разработки вы найдете аналогичные настройки):

На странице свойств, включите OpenMP:

Configuration Protperties->C/C++->Language->Open Mp support 

Включите файл заголовка ompenmp:

#include "omp.h" 

Поместите следующую строку перед ваш первый цикл:

#pragma omp parallel for 

Это будет распараллеливать вас внешним контуром, whi ch - это то, что вы хотите в большинстве случаев, если n значительно больше, чем количество ядер.

Помните, что если вы запустите свой цикл параллельно, чтобы ваши разные итерации были независимы друг от друга. Если вы еще не знакомы с параллельной обработкой, вы можете посмотреть некоторые обучающие программы openmp, чтобы избежать типичных ошибок. Я нашел these slides довольно полезно.

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