gpt4 book ai didi

cuda - 为什么transform_reduce给出的结果与transform&reduce不同?

转载 作者:行者123 更新时间:2023-12-02 00:57:50 25 4
gpt4 key购买 nike

我正在测试一些推力代码,发现transform_reduce给出的计算结果略有不同,这让我完全困惑。

这是一个测试示例代码:(计算 sum(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 .

(顺便说一句,您发布的代码将无法编译。)

关于cuda - 为什么transform_reduce给出的结果与transform&reduce不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com