当使用带推力的 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 + 推力中看到的范式是使用推力的make_zip_iterator
and调用运算符函子make_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()
);
当函子的参数长度相同时,这很有效。但在我的情况下,如上所述要填充的直方图数据 device_vector 的大小不同,并且需要与提供给函子的其他参数(例如状态变量)不同的索引。
环顾四周后,我认为最好的方法是传递一个thrust::counting_iterator,它为函子提供填充直方图矩阵所需的轨迹索引。然后,我还(显然)必须以某种方式提供指向直方图矩阵的指针,以便可以填充它。也许为observer_functor 提供指向直方图向量的指针的最佳解决方案是将其作为参数提供给观察者的构造函数(类似于我在此处发布的另一个问题的解决方案)。
当传递的参数指示不同长度的向量时,所有这些都引起了关于make_zip_iterator
/范式中的数组如何工作的一些困惑。make_tuple
问题:
我建议使用
thrust::counting_iterator
并通过仿函数对象的构造函数传递指向输出数组的指针是推荐的方法吗?更一般地说,当传递的参数指示不同长度的向量时,上面的
make_zip_iterator
/范例如何工作?make_tuple