2014-10-20 2 views
3

Я тестировал некоторый код тяги и обнаружил, что transform_reduce дает немного другой результат вычисления, который полностью смутил меня.Почему transform_reduce дает отличный результат, чем преобразование & сокращение?

Вот выборочное тестирование кода: (вычислить сумму (ехр (х)))

Это было выполнено и запустить в 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

+1

Я не думаю, что это допустимый синтаксис: 'cout <<" transform_reduce result: "d << endl;' –

+0

right. Я добавил их сюда. глупые ошибки :), но вы должны понимать, что я на самом деле имел в виду – Chris

Смежные вопросы