2016-04-12 7 views
1

と:: runge_kutta-X 'の互換性は、私が使用していたクラスステッパーの型シグネチャはここに要約される:それはすることができテンプレートパラメータ:: odeint CUDA/OpenMPの

http://www.boost.org/doc/libs/1_56_0/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_dopri5.html

boost::numeric::odeint::runge_kutta_dopri5<state_type_> stepper; 

これまでのところとても良いです。できます。

プログラムをcuda(推力を使用)に移植し、後でopenmpに移植する予定です。私は、次のように宣言を変更:

boost::numeric::odeint::runge_kutta_dopri5< state_type_ 
     , double 
     , state_type_ 
     , double 
     , boost::numeric::odeint::vector_space_algebra 
     > stepper; 

私はthis problemにソリューションを追ったが、これはコンパイルされません。

In file included from /usr/include/boost/numeric/odeint/stepper/euler.hpp:26: 
/usr/include/boost/numeric/odeint/algebra/default_operations.hpp:87:27: error: invalid operands to binary expression ('double' and 'const std::vector<double, std::allocator<double> >') 
      t1 = m_alpha1 * t2 + m_alpha2 * t3; 
       ~~~~~~~~^~~ 

私はCUDAに移植する際に最小限の変更が後で必要とされるように、ステッパを宣言するための最もポータブルな方法は何か疑問に思って。

答えて

2

あなたのやりたいことによって異なります。あなたは推力を使用したい場合は、すべての計算は、zip形式のイテレータが使用されているthrust::for_each呼び出しを適切にリダイレクトされていることを確認

boost::numeric::odeint::runge_kutta_dopri5< 
    state_type , double , state_type , double , 
    thrust_algebra , thrust_operations >; 

thrust_algebrathrust_operationsに宣言を変更する必要があります。 GPU(VexCLやViennaCLのような)上で実行されるいくつかの高水準線形代数ライブラリを使用する場合は、上記の宣言を使用してstate_typeを正しいタイプ(例えばvexcl::vector<double>)に変更するだけです。 vector_space_algebraは、state_typey = a1*x1 + a2*x2のような操作を処理できると仮定しています。これは、式テンプレートを使用しているためVexCLとViennaCLの場合です。あなたも見ることができるhere

+0

です。これはいいね。また、私はclang ++で得たコンパイルエラーメッセージを追加しました。私はこの警告については無知です。私はテンプレートの型名をサンプルコードのように使用しています。私が1つのテンプレートtypenameを渡す最初の宣言で、それはうまく動作します(実際には既存のGSLインテグレータよりもわずかに優れています)。 – Dilawar

+2

あなたのstate_typeは 'ベクトル< double >'です。ベクトル空間代数は、 'a * x + b * y'のような式を書くことができ、'ベクトル< double >'では不可能であることを意味します。 Eigen!のような線形代数ライブラリを使用してください。 – headmyshoulder