2016-07-13 8 views
0

odeintとopenmpを使用してopenmpを使用してコードを並列化しようとしていますが、スレッドの数を変更すると並列性がうまくいかず、実行を確定する時間が改善されません。私が間違っていることは何ですか?ここでodeintでopenmpを使用する

は、コードの重要な部分です:

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

forループでは、aux'変数が使用されていません。おそらくcompiler/runtimeはそれに気付くほどスマートです(ただし、警告?)、何も並列化しません。コンパイラオプションに '-fopenmp'が含まれていますか? –

答えて

0

状態のサイズが2です。これは並列化の改善が期待できないほど小さすぎます。約1000個の変数を使って例を試してみてください...

+0

私はそれを試しましたが、動作しません。オブザーバ関数の中でメソッドomp_get_num_threads()を呼び出すと、スレッド数が1になっていることがわかります。私が間違っていることを理解していません。それには多少の変更がありますか? –

+0

オブザーバは自動的には並列化されません。 omp_get_num_threads()を呼び出すと、並列領域内でのみ動作します – mariomulansky

関連する問題