我对 BLAS 和 cublas 接口以及如何进行特定的矩阵向量乘法有疑问。
我目前正在打一个电话,cblas_zgemv
并给出了正确的结果。
基本上我有一个复杂的 3x3 矩阵A
和一个复杂的向量v
(3 个分量),在 c 排序中所有连续的,我想将矩阵的 Hermitian 共轭(共轭和转置)乘以向量。可以通过调用 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
(无转置,即 C 排序中的转置)、(转置,即 C 中的T
无转置)、C
(共轭转置,仅 C 中的共轭)。
由于对称性,缺少另一种组合,例如CO
(“仅共轭”--没有转置--,这将对应于 C 排序中的共轭-转置)。
因此,对于复杂元素,BLAS 似乎有一个不方便的漏洞。最糟糕的是,这种限制似乎传播到了与 BLAS 基本具有相同接口的 CUDA BLAS (cuBLAS)。拨打 cuBLAS 电话将是我的最终目标。 https://docs.nvidia.com/cuda/cublas/index.html#cublas-lt-t-gt-gemv
与 BLAS 一样,cuBLAS 只有三个选项(通过枚举)用于转置选项:CUBLAS_OP_N
, CUBLAS_OP_T
, CUBLAS_OP_H
.
我错过了一些明显的东西吗?这是一个已知的限制并且有一个众所周知的解决方法吗?
注意:我知道也许这种特殊情况可以用 GEMM 在具有维度的情况下实现1xn
,但是可以对 GEMM 提出相同的论点,它缺少“仅共轭”选项。