编写一个简单的推力函子上的一些压缩阵列操作(Writing a simple thrust func

2019-10-17 05:31发布

我试图执行一个thrust::reduce_by_key用ZIP和排列迭代器。 即几个“虚拟”置换阵列的一个压缩阵列上这样做。 我有在写仿函数的语法麻烦density_update

但首先问题的设置。

这里是我的函数调用:

thrust::reduce_by_key(  dflagt,
                        dflagtend,
                        thrust::make_zip_iterator( 
                            thrust::make_tuple(
                                thrust::make_permutation_iterator(dmasst, dmapt), 
                                thrust::make_permutation_iterator(dvelt, dmapt),
                                thrust::make_permutation_iterator(dmasst, dflagt),
                                thrust::make_permutation_iterator(dvelt, dflagt)
                            )
                        ),
                        thrust::make_discard_iterator(),
                        danswert,
                        thrust::equal_to<int>(),
                        density_update()
                  ) 

dmaptdflagt是类型的thrust::device_ptr<int>dveltdmasstdanst是类型的thrust::device_ptr<double>

(他们撵包装我生CUDA数组)

阵列maptflagt是从中我需要执行从阵列一个聚集操作两个索引向量dmasstdvelt

在还原步骤后,我打算在我的数据写入danswert阵列。 由于在还原正在使用多个阵列,很明显,我现在用拉链迭代器。

我的问题就出在书面函子density_update这是二元运算。

struct density_update
{
  typedef thrust::device_ptr<double> ElementIterator;
  typedef thrust::device_ptr<int>   IndexIterator;
  typedef thrust::permutation_iterator<ElementIterator,IndexIterator> PIt;

  typedef thrust::tuple< PIt , PIt , PIt, PIt> Tuple;
  __host__ __device__
  double operator()(const Tuple& x , const Tuple& y)
  {   
      return    thrust::get<0>(*x) * (thrust::get<1>(*x) - thrust::get<3>(*x)) + \
                thrust::get<0>(*y) * (thrust::get<1>(*y) - thrust::get<3>(*y));
  }
};

返回的值是一个 。 为什么二元运算看起来像上面的函子并不重要。 我只是想知道我怎么会去纠正上述语法。 作为代码如上所示投掷数编译错误。 我不知道在哪里出了问题。

我在Ubuntu 10.10上GTX 570使用CUDA 4.0

Answer 1:

density_update不应该接受迭代器作为参数的元组-它需要迭代器引用的元组。

在原则上,你可以写density_update::operator()在特定方面reference了各种迭代器的类型,但它更简单,可以让编译推断出参数的类型:

struct density_update
{
  template<typename Tuple>
  __host__ __device__
  double operator()(const Tuple& x, const Tuple& y)
  {   
    return thrust::get<0>(x) * (thrust::get<1>(x) - thrust::get<3>(x)) + \
           thrust::get<0>(y) * (thrust::get<1>(y) - thrust::get<3>(y));
  }
};


文章来源: Writing a simple thrust functor operating on some zipped arrays
标签: cuda thrust