在一些压缩阵列上编写一个简单的推力函子

时间:2012-09-05 00:16:11

标签: cuda thrust

我正在尝试使用zip和置换迭代器执行thrust::reduce_by_key。 即在几个“虚拟”置换数组的压缩数组上执行此操作。 我在编写仿函数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数组。由于在缩减中使用了多个数组,显然我使用的是zip迭代器。

我的问题在于编写二进制操作的仿函数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));
  }
};

返回的值是 double 。为什么二元运算看起来像上面的仿函数 不重要。我只是想知道如何纠正上述语法。 如上所示,代码抛出了许多编译错误。我不知道我哪里出错了。

我在Ubuntu 10.10上的GTX 570上使用CUDA 4.0

1 个答案:

答案 0 :(得分: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));
  }
};