2016-06-01 8 views
4

thrustライブラリとcufftを私のプロジェクトに結合したいと思います。 thrust::sequenceだけthrust::complex<double> -vectorsで正常に動作している間にこのように、私は残念ながら推力ライブラリで操作するときにカフを使用する

int length = 5; 
    thrust::device_vector<thrust::complex<double> > V1(length); 
    thrust::device_vector<cuDoubleComplex> V2(length); 
    thrust::device_vector<thrust::complex<double> > V3(length); 
    thrust::sequence(V1.begin(), V1.end(), 1); 
    thrust::sequence(V2.begin(), V2.end(), 2); 
    thrust::transform(V1.begin(), V1.end(), V2.begin(), V3.begin(), thrust::multiplies<thrust::complex<double> >()); 
    cufftHandle plan; 
    cufftPlan1d(&plan, length, thrust::complex<double>, 1); 
    cufftExecZ2Z(plan, &V1, &V2, CUFFT_FORWARD); 
    for (int i = 0; i < length; i++) 
     std::cout << V1[i] << ' ' << V2[i] << ' ' << V3[i] << '\n'; 
    std::cout << '\n'; 
    return EXIT_SUCCESS; 

を書いたテストのために、cufftは、そのようcuDoubleComplex *aとして配列を受け入れます。上記のコードをコンパイルするときに、私は2つのエラーを取得:第二つstd::cout << V1[i] << ' ' << V2[i] << ' ' << V3[i] << '\n';を指す

error : no operator "=" matches these operands 
error : no operator "<<" matches these operands 

を最初のものは、thrust::sequence(V2.begin(), V2.end(), 2);を指します。私がV2とコメントすると、すべて正常に動作します。
thrust::device_vector<thrust::complex<double>>cuDoubleComplex *の間に変換がありますか?そうでない場合は、どのように組み合わせることができますか?

+0

方法の代わりに、 '推力:: sequence'のカスタム' UnaryOperation'で '推力:: tabulate'を使用してはどうですか? –

答えて

5

thrust::complex<double>std::complex<double>cuDoubleComplexと同じデータレイアウトを共有します。その結果、あなたの例を上にするために必要なのは、device_vectorのデータを生ポインタにキャストしてcuFFTに渡すことだけです。スラスト自体は、PODタイプの予期している操作を実行するために必要な演算子を定義しない単純なコンテナなので、ほとんどの操作では推力自体はcuDoubleComplexで機能しません。

これは動作するはずです:

#include <thrust/device_vector.h> 
#include <thrust/transform.h> 
#include <thrust/sequence.h> 
#include <thrust/complex.h> 
#include <iostream> 
#include <cufft.h> 

int main() 
{ 
    int length = 5; 
    thrust::device_vector<thrust::complex<double> > V1(length); 
    thrust::device_vector<thrust::complex<double> > V2(length); 
    thrust::device_vector<thrust::complex<double> > V3(length); 
    thrust::sequence(V1.begin(), V1.end(), 1); 
    thrust::sequence(V2.begin(), V2.end(), 2); 
    thrust::transform(V1.begin(), V1.end(), V2.begin(), V3.begin(), 
         thrust::multiplies<thrust::complex<double> >()); 
    cufftHandle plan; 
    cufftPlan1d(&plan, length, CUFFT_Z2Z, 1); 
    cuDoubleComplex* _V1 = (cuDoubleComplex*)thrust::raw_pointer_cast(V1.data()); 
    cuDoubleComplex* _V2 = (cuDoubleComplex*)thrust::raw_pointer_cast(V2.data()); 

    cufftExecZ2Z(plan, _V1, _V2, CUFFT_FORWARD); 
    for (int i = 0; i < length; i++) 
     std::cout << V1[i] << ' ' << V2[i] << ' ' << V3[i] << '\n'; 
    std::cout << '\n'; 
    return EXIT_SUCCESS; 
} 
+1

CUFFT_C2C - > CUFFT_Z2Z – kangshiyin

関連する問題