2014-10-20 109 views
3

我正在测试一些推力代码,发现transform_reduce给出了一个稍微不同的计算结果,这完全让我困惑。为什么transform_reduce给出的结果与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一样吗?

请帮我解释发生了什么......

回答

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_reducepicks up its OutputType from the type of this parameter

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

+0

谢谢!我没有注意到0 -_-。但为什么它没有编译...我从vs2010复制并粘贴他们 – Chris 2014-10-20 23:06:25

+1

我不认为这是有效的语法:'cout <<“transform_reduce result:”d << endl;' – 2014-10-20 23:32:14

+0

没错。我在这里添加了它们。愚蠢的错误:)但你应该明白我的意思 – Chris 2014-10-23 00:52:02