0

我使用以下参数调用 cblas_sgemm:

  1. 顺序:CblasRowMajor
  2. transA、transB:CblasTrans 或 CblasNoTrans
  3. M:矩阵 op(A) 和矩阵 C 的行数(高度)
  4. N:矩阵 op(B) 和矩阵 C 的列数(宽度)
  5. K:矩阵 op(A) 的列数(宽度)和矩阵 op(B) 的行数(高度)
  6. 阿尔法:标量
  7. A:指向矩阵 A 的指针
  8. LDA:当 transA = CblasNoTrans 则 LDA = M,否则 LDA = K
  9. B:指向矩阵 B 的指针
  10. LDB:当 transB = CblasNoTrans 则 LDB = K,否则 LDB = N
  11. 测试版:标量
  12. C:指向矩阵 C 的指针(入口偏差和出口结果)
  13. 最不发达国家 = 米

其中,如果 transM 为 CblasNoTrans,则 op(M) = M,否则为 Transpose(M)

参数正确(根据文档),但我收到错误消息:“** 在进入 SGEMM 时,参数编号 X 具有非法值” - 如何解决此错误?

4

1 回答 1

0

TL;DR 使用时:CblasRowMajor

  1. 保持上面列出的 M,N,K 设置。
  2. 计算 LDA,LDB 时翻转 Transpose 值,设置 LDC = N

详细信息:我在使用 Transpose 乘法时遇到了这个问题,但找不到详细的答案来回答我的问题。我写这个 Q/A 希望对其他人有用。

正如其他人所指出的,根本问题是 cblas 是 BLAS 的包装器,它是用 FORTRAN 编写的,没有顺序参数并且期望列主矩阵表示。可用的文档(通常)是 BLAS 文档——我在上面的问题中使用了它。

然而,虽然 M、N 和 K 是逻辑值(矩阵的宽度/高度,无论其表示形式如何),但前导维度(LDA、LDB、LDC)不是。因此,在使用 CblasRowMajor 时,M、N 和 K 的计算应该保持不变。但是,在计算 LDA、LDB 和 LDC 时,应使用 op(A)、op(B) 和 C的转置。

如果使用 CblasColMajor,那么它与 Fortran 的表示形式相同,并且问题中显示的参数设置是正确的。

另请注意,当您在参数 X 中出现错误时,X 会移动 1,因为错误源自没有顺序参数的 BLAS。

于 2022-02-12T19:45:11.940 回答