我试图执行一个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()
)
dmapt
, dflagt
是类型的thrust::device_ptr<int>
和dvelt
, dmasst
和danst
是类型的thrust::device_ptr<double>
。
(他们撵包装我生CUDA数组)
阵列mapt
和flagt
是从中我需要执行从阵列一个聚集操作两个索引向量dmasst
和dvelt
。
在还原步骤后,我打算在我的数据写入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