2011-01-27 35 views
3

ホストコードとデバイスコードの両方で複素数を使用する方法を理解しようとしています。私はcuComplexに出くわしましたが(ドキュメントは見つかりませんでした)、float2は少なくともCUDAプログラミングガイドで言及されています。float2とcuComplexの違いは何ですか?

どうすればよいですか? cuComplexのヘッダーファイルでは、関数が__host__ __device__と宣言されているように見えるので、どちらの場所でも使用することができます。

私の元のデータは、ファイルからstd::complex<float>に読み込まれているので、実際にはそれを使いたくないです。 GPUで複雑な値を使うには、元のcomplex<float>からcuComplexにコピーする必要がありますか?

答えて

5

cuComplexは、/usr/local/cuda/include/cuComplex.h(moduloのインストールディレクトリ)で定義されています。関連するスニペット:

typedef float2 cuFloatComplex; 
typedef cuFloatComplex cuComplex; 
typedef double2 cuDoubleComplex; 

そこには便利な機能が複素数での作業にもあります - float2cuComplexを使用するかどうかについてなど、それらを構築し、それらを掛け合わ

を、あなたはどちらを使用する必要があります意味的に適切です - それはベクトルか複素数ですか?また、複素数の場合は、完全に明示するためにcuFloatComplexまたはcuDoubleComplexを使用することをお勧めします。

+0

私はいくつかの他の質問があります、私はあなたが答えを提供できることを願っています。 1) 'float2'はどこに定義されていますか? 2)あなたの答えから、 'float2'と' cuComplex'はお互いに 'typedef'ですので、私はそれらが同じタイプであると言います。投稿の[Complex Numbers](https://devtalk.nvidia.com/default/topic/411477/complex-numbers/)から、 'cuBLAS'関数には' cuComplex'だけが必要で、 'float2'は受け入れられないようですs。そうですか? 3)あなたが言及した 'include'ファイルでは、sum、mulなどの演算は'演算子 'のオーバーロードとして定義されていません。 'float2'についても同じことが当てはまりますか?どうもありがとうございました。 – JackOLantern

2

あなたがcuComplexを使用する必要がありますCUBLASまたはCUFFTで動作するようにしようとしている場合:

この投稿はcuComplexの詳細を検索する場所を指すように思えます。あなた自身の関数を書くつもりなら、両方が2つのフロートの構造体なので、パフォーマンスに違いはありません。

+0

ええ、私は複雑な値を必要とする私自身の関数で動作しています。 2番目の質問はどうですか?元のデータ(サードパーティ製のlibからstd :: complexというものをコピーしたもの)をcuComplex型にコピーする必要はありませんか? – Derek

+0

'std :: complex 'が 'float [2]'に 'reinterpret_cast 'できるように制限する必要があるかどうか議論があります。これは実際には既に移植可能です。 – MSalters

関連する問題