我试图降低使用推力值的数组的最小值和最大值,我似乎被卡住。 鉴于float数组什么,我想是减少一个合格的最小值和最大值,但使用推力的降低方法,而不是我得到的所有模板的母亲(或至少阿姨)编译错误。
我原来的代码包含分布在2个float4阵列,我想降低值的5名名单,但我已经熬下来到这个简短的例子。
struct ReduceMinMax {
__host__ __device__
float2 operator()(float lhs, float rhs) {
return make_float2(Min(lhs, rhs), Max(lhs, rhs));
}
};
int main(int argc, char *argv[]){
thrust::device_vector<float> hat(4);
hat[0] = 3;
hat[1] = 5;
hat[2] = 6;
hat[3] = 1;
ReduceMinMax binary_op_of_dooooom;
thrust::reduce(hat.begin(), hat.end(), 4.0f, binary_op_of_dooooom);
}
如果我把它分成2级减少,而不是当然的作品吧。 我的问题则是:是否有可能同时减少最小和最大的一个通带推力又如何呢? 如果没有,那么什么是实现所述减少的最有效的方法是什么? 将一个转换迭代帮我(如果有的话,就会减少,然后是一个道次压下?)
一些额外的信息:我使用的推力1.5(由CUDA 4.2.7提供)我的实际代码是使用reduce_by_key,而不仅仅是降低。 我发现transform_reduce在写这个问题,但一个不带钥匙进去。
作为talonmies笔记,你的降低不会编译,因为thrust::reduce
预期二元运算符的参数类型相匹配的结果类型,但ReduceMinMax
的参数类型为float
,而它的结果类型为float2
。
thrust::minmax_element
直接实现这种操作,但如果需要,你可以实现,而不是与你的减少thrust::inner_product
,从而推广thrust::reduce
:
#include <thrust/inner_product.h>
#include <thrust/device_vector.h>
#include <thrust/extrema.h>
#include <cassert>
struct minmax_float
{
__host__ __device__
float2 operator()(float lhs, float rhs)
{
return make_float2(thrust::min(lhs, rhs), thrust::max(lhs, rhs));
}
};
struct minmax_float2
{
__host__ __device__
float2 operator()(float2 lhs, float2 rhs)
{
return make_float2(thrust::min(lhs.x, rhs.x), thrust::max(lhs.y, rhs.y));
}
};
float2 minmax1(const thrust::device_vector<float> &x)
{
return thrust::inner_product(x.begin(), x.end(), x.begin(), make_float2(4.0, 4.0f), minmax_float2(), minmax_float());
}
float2 minmax2(const thrust::device_vector<float> &x)
{
using namespace thrust;
pair<device_vector<float>::const_iterator, device_vector<float>::const_iterator> ptr_to_result;
ptr_to_result = minmax_element(x.begin(), x.end());
return make_float2(*ptr_to_result.first, *ptr_to_result.second);
}
int main()
{
thrust::device_vector<float> hat(4);
hat[0] = 3;
hat[1] = 5;
hat[2] = 6;
hat[3] = 1;
float2 result1 = minmax1(hat);
float2 result2 = minmax2(hat);
assert(result1.x == result2.x);
assert(result1.y == result2.y);
}