gpt4 book ai didi

c++ - thrust::tuple in reduction 的自定义最小运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:28 24 4
gpt4 key购买 nike

我正在尝试对 zip 迭代器进行最小缩减,但使用自定义运算符仅考虑元组中的第二个字段(第一个字段是键,而第二个字段是值)实际上与减少有关)

但是,我无法让它工作,目前正在计算 vector 中存在的结果

下面的代码重现了这个问题:

#include <thrust/device_vector.h>
#include <thrust/iterator/zip_iterator.h>
#include <thrust/tuple.h>
#include <thrust/sequence.h>

typedef thrust::tuple<unsigned int, unsigned int> DereferencedIteratorTuple;

struct tuple_snd_min{
__host__ __device__
bool operator()(const DereferencedIteratorTuple& lhs,
const DereferencedIteratorTuple& rhs){
return (thrust::get<1>(lhs) < thrust::get<1>(rhs));
}
};


void f(){
thrust::device_vector<unsigned int> X(10);
thrust::device_vector<unsigned int> Y(10);

thrust::sequence(X.begin(), X.end());
thrust::sequence(Y.begin(), Y.end());

X[0] = 5;
Y[0] = 5;
X[1] = 50;

// X: 5 50 2 3 4 5 6 7 8 9
// Y: 5 1 2 3 4 5 6 7 8 9

typedef thrust::device_vector<unsigned int>::iterator UIntIterator;
typedef thrust::tuple<UIntIterator, UIntIterator> IteratorTuple;

thrust::zip_iterator<IteratorTuple> first =
thrust::make_zip_iterator(thrust::make_tuple(X.begin(), Y.begin()));

thrust::tuple<unsigned int, unsigned int> init = first[0];
thrust::tuple<unsigned int, unsigned int> min =
thrust::reduce(first, first + 10, init, tuple_snd_min());

printf("(%d,%d)\n", thrust::get<0>(min), thrust::get<1>(min));
// should return (50,1)
// returns (0,0)
}

感谢 Jared Hoberock 的评论,我得以解决此问题。

typedef thrust::tuple<unsigned int, unsigned int> DereferencedIteratorTuple;

struct tuple_snd_min{
__host__ __device__
const DereferencedIteratorTuple& operator()(const DereferencedIteratorTuple& lhs, const DereferencedIteratorTuple& rhs)
{
if(thrust::get<1>(lhs) < thrust::get<1>(rhs)) return lhs;
else return rhs;
}
};

最佳答案

这似乎是由于对 reduce 调用中的仿函数必须实现哪个操作的误解造成的。根据 documentation ,仿函数必须是一个二元函数的模型,其输出必须可以转换为输入类型。这是你的仿函数失败的地方。而不是这个

struct tuple_snd_min{
__host__ __device__
bool operator()(const DereferencedIteratorTuple& lhs,
const DereferencedIteratorTuple& rhs){
return (thrust::get<1>(lhs) < thrust::get<1>(rhs));
}
};

你的仿函数需要像这样定义:

struct tuple_snd_min{
__host__ __device__
int operator()(const DereferencedIteratorTuple& lhs,
const DereferencedIteratorTuple& rhs){
return (thrust::get<1>(lhs) < thrust::get<1>(rhs)) ?
thrust::get<1>(lhs) : thrust::get<1>(rhs);
}
};

即该函数应该返回一个值而不是充当谓词。

[此答案是根据评论汇总并作为社区 wiki 条目发布的,以便将此问题从未回答的队列中删除]

关于c++ - thrust::tuple in reduction 的自定义最小运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com