当参数向量具有不同大小时,推力odeint make_zip_iterator与make_tuple的行为

时间:2014-09-08 15:13:15

标签: thrust odeint

当使用具有推力的odeint时,我正在开发一个观察器,它将生成状态变量的直方图,同时解决许多初始条件问题。

初始条件问题并行运行,用这样的数据填充device_vector。

Trajectory 0, Variable 0, Histogram Bin 0;
Trajectory 0, Variable 0, Histogram Bin 1;
...
Trajectory 0, Variable 1, Histogram Bin 0;
Trajectory 0, Variable 1, Histogram Bin 1;
...
Trajectory 1, Variable 0, Histogram Bin 0;
Trajectory 1, Variable 0, Histogram Bin 1;
...

或者,更简洁地说,数组的索引将根据:

计算
trajectoryIndex*N_BINS*N_VARS +varIndex*N_BINS +binIndex

......之后,对于每个变量,此向量将缩减为一个直方图。

我在odeint + thrust中使用的范例是让操作员函子使用推力make_zip_iteratormake_tuple来调用,因此:

thrust::for_each(
    thrust::make_zip_iterator(
        thrust::make_tuple(
            boost::begin( x ) + 0*m_N,
            boost::begin( x ) + 1*m_N
        ),
    thrust::make_zip_iterator(
        thrust::make_tuple(
            boost::begin( x ) + 1*m_N,
            boost::begin( x ) + 2*m_N
        ),
    observer_functor()
);

当函子的参数长度相同时,它的效果很好。但在我的情况下,如上所述要填充的histogram-data device_vector具有不同的大小,并且需要以与赋予函子的其他参数(例如状态变量)不同的方式编制索引。

环顾四周,我认为最好的方法是传递thrust::counting_iterator,为仿函数提供填充直方图矩阵所需的轨迹索引。然后,我(显然)必须以某种方式提供指向直方图矩阵的指针,以便可以填充它。为observer_functor提供直方图向量指针的最佳解决方案可能是将其作为观察者构造函数的参数提供(类似于another question I posted here的解决方案。)

当传递的参数指示不同长度的向量时,所有这些都引发了关于上面make_zip_iterator / make_tuple范例中的数组如何工作的混淆。

问题:

  1. 我建议使用thrust::counting_iterator并通过仿函像对象的构造函数将指针传递给输出数组吗?

  2. 更一般地说,当传递的参数指示不同长度的向量时,make_zip_iterator / make_tuple范例如何工作?

0 个答案:

没有答案