推力减小不与非等于输入/输出类型工作(Thrust reduce not working with

2019-07-29 08:35发布

我试图降低使用推力值的数组的最小值和最大值,我似乎被卡住。 鉴于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在写这个问题,但一个不带钥匙进去。

Answer 1:

作为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);
}


文章来源: Thrust reduce not working with non equal input/output types
标签: cuda thrust