2016-09-15 69 views
0

我在設備上和主機上使用Thrust複雜雙向量上的sin函數有一些問題:它看起來像計算是在浮動。使用推力複合(雙)矢量與竇功能故障

隨着thrust::device_vector< thrust::complex<double> >thrust::host_vector< thrust::complex<double> >,我得到:

sin(1+0i) == (0.8414709568023682,0) 

std::complex<double>

sin(1+0i) == (0.8414709848078965,0) 

std::complex<float>

sin(1+0i) == (0.8414709568023682,0) 

爲什麼我在我的代碼做什麼錯誤?在編制過程中,我用

nvcc test.cu -o test 

下面是完整的代碼:

#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/complex.h> 
#include <iostream> 
#include <iomanip> 
#include <complex> 
#include <cmath> 

template <typename Vector> 
void Print(Vector &V){ 
    for (int i=0;i<V.size();i++) 
    std::cout << V[i] << " "; 
    std::cout << "\n"; 
} 

template <typename T> 
struct sin_functor : public thrust::unary_function< T , T > 
{ 
    __host__ __device__ 
    T operator()(T x) const 
    { 
    return sin(x); 
    } 
}; 

template <typename Vector> 
void ThrustComputation(){ 
    typedef typename Vector::value_type Tvec; 
    Vector A(2); 
    A[0]=Tvec(1.,0.);A[1]=Tvec(1.,1.); 

    std::cout << "A: " << std::endl; 
    std::cout << " ";Print<Vector>(A); 

    Vector B(A.size()); 

    thrust::transform(A.begin(),A.end(),B.begin(), sin_functor<Tvec>()); 
    std::cout << "B =sin(A): " << std::endl; 
    std::cout << " ";Print<Vector>(B); 
} 

template <typename T> 
void stdComputation(){ 
    std::complex<T> sA[2]; 
    sA[0]=std::complex<T>(1.,0.); 
    sA[1]=std::complex<T>(1.,1.); 

    std::cout << "sA: " << std::endl; 
    std::cout << " " << sA[0] << " " << sA[1] << std::endl; 
    std::cout << "sin(sA): " << std::endl; 
    std::cout << " " << sin(sA[0]) << " " << sin(sA[1]) << std::endl; 
} 


int main(int argc, char **argv) 
{ 
    std::cout << std::setprecision(16); 
    std::cout << "Thrust: Computation on GPU device (double)\n"; 
    ThrustComputation<thrust::device_vector< thrust::complex<double> > >(); 
    std::cout << "Thrust: Computation on host (double)\n"; 
    ThrustComputation<thrust::host_vector< thrust::complex<double> > >(); 
    std::cout << "std: Computation (double)\n"; 
    stdComputation<double>(); 
    std::cout << "std: Computation (float)\n"; 
    stdComputation<float>(); 
    return 0; 
} 

我的計算機上的輸出(Ubuntu的14.04 LTS,CUDA 7.5)是:

Thrust: Computation on GPU device (double) 
A: 
    (1,0) (1,1) 
B =sin(A): 
    (0.8414709568023682,0) (1.298457622528076,0.6349639296531677) 
Thrust: Computation on host (double) 
A: 
    (1,0) (1,1) 
B =sin(A): 
    (0.8414709568023682,0) (1.298457622528076,0.6349639296531677) 
std: Computation (double) 
sA: 
    (1,0) (1,1) 
sin(sA): 
    (0.8414709848078965,0) (1.298457581415977,0.6349639147847361) 
std: Computation (float) 
sA: 
    (1,0) (1,1) 
sin(sA): 
    (0.8414709568023682,0) (1.298457503318787,0.6349638700485229) 
+1

你真正的問題是什麼?例如「爲什麼'std :: complex'和'thrust :: complex'產生的輸出不完全一樣? –

+0

對於我來說,使用推力:: device_vector >計算sin(1 + 0i )是錯誤的:確切的解決方案的錯誤是1e-8! –

+1

你可以在這裏提出一個錯誤報告:https://github.com/thrust/thrust/issues/new –

回答

2

這似乎是推力庫中的一個真正的缺陷。 github上的代碼快速掃描導致我this,這可能是罪魁禍首。似乎推力的雙精度函數csinh依賴於複雜的函數,它有一個意外的中間轉換爲浮動,這可能導致您觀察到的精度損失。正如評論中所建議的那樣,您應該將此報告爲一個錯誤。

+2

我已經提交了一個拉請求https:// github .COM /推力/推力/拉/ 834 –