1

BLAS と cublas のインターフェイスと、特定の行列とベクトルの乗算を行う方法について質問があります。

現在行っている呼び出しがcblas_zgemvあり、正しい結果が得られます。

基本的に、私は複雑な 3x3 行列Aと複雑なベクトルv(3 つのコンポーネント) をすべて隣接して c 順序付けしており、行列のエルミート共役 (共役と転置) をベクトルに乗算したいと考えています。この呼び出しは、cblas を使用して呼び出すことができます。

std::complex<double> const alpha=1.0;
std::complex<double> const beta=0.0;
cblas_zgemv(CblasRowMajor, CblasConjTrans, 3 /*A size*/, 3/*A size*/, &alpha, A_pointer, 3 /*A stride*/, v_pointer, 1, &beta, result_pointer, 1 /*result_stride*/)

これは BLAS インターフェイスでは実装できないようです。 http://www.netlib.org/lapack/explore-html/dc/dc1/group__complex16__blas__level2_gafaeb2abd9fffa7442b938dc384aeaf47.html#gafaeb2abd9fffa7442b938dc384aeaf47

その理由は、BLAS の "trans" 引数に "conjugate-only" オプションがないことが原因のようです。

BLAS (cblas ではない) での同等の呼び出しは次のようになります。

gemv( trans , 3, 3, alpha, A_pointer, 3, v_pointer, 1, beta, result_pointer, 1);

transオプションは、( Nno-transpose、つまり C オーダーでの転置)、T(transpose、つまり C での転置なし)、C(conjugate-transpose、C での共役のみ) のみです。

対称性により、別の組み合わせが欠落していますCO(「共役のみ」-転置なし--、C オーダーの共役転置に対応します)。

ということで、BLASには複雑な要素に対して不都合な穴が空いているようです。最悪なのは、基本的に BLAS と同じインターフェースを持つ CUDA BLAS (cuBLAS) にもこの制限が波及しているようです。cuBLAS 呼び出しを行うことが私の最終目標です。 https://docs.nvidia.com/cuda/cublas/index.html#cublas-lt-t-gt-gemv

BLAS と同様に、cuBLAS の転置オプションには、(enum を介して) 、 、 の 3 つのオプションしかありCUBLAS_OP_NませCUBLAS_OP_TCUBLAS_OP_H

明らかな何かが欠けていますか?これは既知の制限であり、よく知られている回避策はありますか?


注: おそらく、この特定のケースは GEMM を使用して ディメンション を使用して実装できることはわかっていますが、1xnGEMM について同じ議論を行うことができます。「共役のみ」オプションがありません。

4

0 に答える 0