我在設備上和主機上使用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)
你真正的問題是什麼?例如「爲什麼'std :: complex'和'thrust :: complex'產生的輸出不完全一樣? –
對於我來說,使用推力:: device_vector>計算sin(1 + 0i )是錯誤的:確切的解決方案的錯誤是1e-8! –
你可以在這裏提出一個錯誤報告:https://github.com/thrust/thrust/issues/new –