2016-07-13 4 views
0

Я пытаюсь использовать openmp для параллелизации моего кода с помощью odeint и openmp, но когда я изменяю количество потоков, параллелизм не работает, время завершения выполнения не улучшается. Что я делаю неправильно?Использование openmp с odeint

Вот основные части кода:

using namespace boost::numeric::odeint; 
using namespace std; 
typedef std::vector<double> state_type; 

struct ode { 
    void operator()(const state_type &XY , state_type &dUdt , double t) { 

    const size_t N = XY.size(); 

    #pragma omp parallel for schedule(runtime) 
    for (size_t aux = 0; aux <= N; aux++) { 

     dUdt[0] = XY[1]; 
     dUdt[1] = 2 * w * XY[3] + 3 * (w * w) * XY[0]; 

    } 
    } 
}; 

main() { 

    typedef runge_kutta4< 
       state_type , double , 
       state_type , double , 
       openmp_range_algebra 
      > rk4; 

    state_type XY(2); 

    int number_threads = 1; 

    omp_set_num_threads(number_threads); 
    int chunk_size = omp_get_max_threads(); 
    omp_set_schedule(omp_sched_static , chunk_size); 

    integrate_n_steps(rk4() , ode() , XY , 0.0 , 0.00001 , 200); 

} 

Я надеюсь, что я достаточно ясно, я просто хотел бы иметь возможность использовать OpenMP с моим кодом.

Большое спасибо за помощь.

+0

Переменная 'aux' не используется в этом for-loop, возможно, компилятор/время выполнения достаточно умен, чтобы заметить это (хотя должно быть предупреждение?) и ничего не распараллеливает. Существуют ли опции компилятора '-fopenmp'? –

ответ

0

Ваше состояние имеет размер 2. Это слишком мало, чтобы ожидать какого-либо улучшения от распараллеливания. Попробуйте пример с ~ 1000 переменными и посмотрите, найдете ли вы какое-то улучшение ...

+0

Я пробовал, но не работает. Когда я вызываю метод omp_get_num_threads() внутри функции наблюдателя, я вижу, что количество потоков равно 1. Я не понимаю, что я делаю неправильно. Есть что-то изменить? –

+0

Наблюдатель не распараллелен автоматически. Вызов omp_get_num_threads() будет работать только в параллельном регионе – mariomulansky