2016-04-12 7 views
1

Die Art Signatur für Klasse Schritt ich verwende hier zusammengefasst:Template-Parameter von `boost :: numeric :: odeint :: runge_kutta-X` kompatibel mit CUDA/OpenMP

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

kann es sein, instanziiert wie folgt:

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

So weit so gut. Es klappt.

Ich plane Port mein Programm CUDA (mit Schub) und später OpenMP. Ich habe die Erklärung folgende:

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

Ich folgte Lösung this problem aber nicht kompiliert.

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; 
       ~~~~~~~~^~~ 

Ich frage mich, was der meist tragbare Weg zu erklären, werden später den Schritt so dass minimale Änderungen erforderlich, wenn CUDA portiert.

Antwort

2

Es hängt davon ab, was Sie tun möchten. Wenn Sie Thrust verwenden wollen, müssen Sie die Erklärung ändern

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

Die thrust_algebra und der thrust_operations sicherzustellen, dass alle Berechnungen umgeleitet werden thrust::for_each Anrufe anzueignen, wo Reißverschluss Iteratoren verwendet werden. Wenn Sie eine High-Level-Bibliothek für lineare Algebra verwenden möchten, die auf der GPU läuft (wie VexCL oder ViennaCL), können Sie Ihre obige Deklaration verwenden und nur die state_type auf den richtigen Typ ändern, zum Beispiel vexcl::vector<double>. Die vector_space_algebra setzt voraus, dass Ihre state_type Operationen wie y = a1*x1 + a2*x2 verarbeiten kann, was der Fall für VexCL und ViennaCL aufgrund der Verwendung von Expression-Vorlagen ist. Sie können auch einen Blick auf here werfen.

+0

Ich sehe. Das ist nett. Auch habe ich eine Kompilierungsfehlermeldung hinzugefügt, die ich mit clang ++ bekommen habe. Ich habe keine Ahnung von dieser Warnung. Ich verwende die Template-Typnamen wie im Beispielcode. Bei der ersten Deklaration, bei der ich nur einen Vorlagentypnamen übergebe, funktioniert es gut (es funktioniert sogar etwas besser als der vorhandene GSL-Integrator). – Dilawar

+2

Ihr state_type ist 'vector < double >'. Vektorraumalgebra bedeutet, dass Sie Ausdrücke wie 'a * x + b * y' schreiben können, was mit 'vector < double >' nicht möglich ist. Verwenden Sie eine lineare Algebra-Bibliothek wie Eigen! – headmyshoulder

Verwandte Themen