2016-04-12 3 views
1

Сигнатурой типа для класса шагового я использую суммируюсь здесь:параметров шаблона `повышение :: числовая :: odeint :: runge_kutta-x` совместит с 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

Это зависит от того, что вы хотите сделать. Если вы хотите использовать Thrust вам необходимо изменить декларацию

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

thrust_algebra и thrust_operations убедиться, что все вычисления будут перенаправлены на соответствующие thrust::for_each вызов, где используются молнии итераторов. Если вы хотите использовать некоторую библиотеку линейных алгебр высокого уровня, которая работает на графическом процессоре (например, VexCL или ViennaCL), вы можете использовать указанное выше объявление и только изменить state_type на правильный тип, например vexcl::vector<double>. vector_space_algebra предполагает, что ваш state_type может обрабатывать операции, такие как y = a1*x1 + a2*x2, что и для VexCL и ViennaCL из-за использования шаблонов выражений. Вы также можете посмотреть here.

+0

Я вижу. Это мило. Также я добавил сообщение об ошибке компиляции, которое я получил с clang ++. Я не знаю об этом предупреждении; Я использую шаблоны, как они есть в примере кода. С первым объявлением, в котором я передаю только одно имя шаблона, он отлично работает (фактически работает немного лучше, чем существующий интегратор GSL). – Dilawar

+2

Ваш state_type является 'vector < double >'. Векторная пространственная алгебра означает, что вы можете писать выражения типа 'a * x + b * y', что невозможно с помощью' vector < double > '. Используйте библиотеку линейной алгебры, такую ​​как Eigen! – headmyshoulder