为什么transform_reduce给出的结果与transform&reduce不同?
问题描述:
我正在测试一些推力代码,发现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一样吗?
请帮我解释发生了什么......
答
从整数改变你的初始化常数:
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。
(顺便说一句,您发布的代码不会编译。)
谢谢!我没有注意到0 -_-。但为什么它没有编译...我从vs2010复制并粘贴他们 – Chris 2014-10-20 23:06:25
我不认为这是有效的语法:'cout 2014-10-20 23:32:14
没错。我在这里添加了它们。愚蠢的错误:)但你应该明白我的意思 – Chris 2014-10-23 00:52:02