与CUDA / OpenMP兼容的`boost :: numeric :: odeint :: runge_kutta-X`的模板参数

时间:2016-04-12 05:27:30

标签: c++ boost cuda odeint

我正在使用的类步进器的类型签名总结如下:

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时需要进行最小的更改。

1 个答案:

答案 0 :(得分:2)

这取决于你想做什么。如果您想使用Thrust,您需要将声明更改为

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

thrust_algebrathrust_operations确保所有计算都重定向到使用压缩迭代器的适当thrust::for_each调用。如果您想使用在GPU上运行的某些高级线性代数库(如VexCL或ViennaCL),您可以使用上述声明,只将state_type更改为正确的类型,例如vexcl::vector< double >vector_space_algebra假定您的state_type可以处理y = a1*x1 + a2*x2之类的操作,由于使用了表达式模板,这就是VexCL和ViennaCL的情况。您还可以查看here