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
オプションは、( N
no-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_T
んCUBLAS_OP_H
。
明らかな何かが欠けていますか?これは既知の制限であり、よく知られている回避策はありますか?
注: おそらく、この特定のケースは GEMM を使用して ディメンション を使用して実装できることはわかっていますが、1xn
GEMM について同じ議論を行うことができます。「共役のみ」オプションがありません。