为什么transform_reduce提供的结果与transform&;降低?

时间:2014-10-20 20:18:11

标签: cuda thrust

我正在测试一些推力代码,发现transform_reduce给出了一个稍微不同的计算结果,这让我很困惑。

这是一个测试样本代码:(计算总和(exp(x)))

它已在VS2012 + CUDA 6.0中运行并运行

#include <iostream>
#include <cmath>
#include <thrust/device_vector.h>

using namespace std;

template <typename T>
struct exponential
{
    __host__ __device__
        T operator()(const T& x) const { 
            return exp(x);
    }
};

void main() {
    thrust::device_vector<double> f(7), g(7);
    f[0]=0.0; f[1]=1.0; f[2]=2.0; f[3]=3.0; f[4]=5.0; f[5]=5.0; f[6]=5.0;
    double d = thrust::transform_reduce(f.begin(), f.end(), exponential<double>(), 0, thrust::plus<double>());
    cout<<"transform_reduce result: " d<<endl;

    thrust::transform(f.begin(), f.end(), g.begin(), exponential<double>());
    double e = thrust::reduce(g.begin(), g.end());
    cout<<"transform+reduce result: "<<e;

}

我得到的输出是

transform_reduce result: 474
transform+reduce result: 476.432

正确的值应为476.432 我不知道transform_reduce发生了什么。它不仅给出了整数,还给出了错误的答案。 transform_reduce不应该与transform + reduce相同吗?

请帮我解释发生的事情......

1 个答案:

答案 0 :(得分:2)

从整数更改初始化常量:

double d = thrust::transform_reduce(f.begin(), f.end(), exponential<double>(), 0, thrust::plus<double>());

加倍:

double d = thrust::transform_reduce(f.begin(), f.end(), exponential<double>(), 0.0, thrust::plus<double>());
                                                                               ^^^

transform_reduce picks up its OutputType from the type of this parameter

(顺便说一句,你发布的代码不会编译。)