【问题标题】:Performance of MKL `dgesvd` vs MKL `LAPACKE_dgesvd`?MKL `dgesvd` 与 MKL `LAPACKE_dgesvd` 的性能?
【发布时间】:2017-06-05 18:00:59
【问题描述】:
dgesvd 似乎是 LAPACKE_dgesvd,布局为 LAPACK_COL_MAJOR,但查看 dgesvd 和 LAPACKE_dgesvd 的示例,dgesvd 示例中似乎有一个额外的步骤,其中最佳工作空间被查询分配。
假设这一步是判断输入矩阵是COL_MAJOR还是ROW_MAJOR是否正确?
假设一旦找到最佳工作空间,'dgesvd' 会在内部调用 LAPACKE_dgesvd 并使用适当的布局是否正确?
如果我已经知道COL_MAJOR 的矩阵布局使用LAPACKE_dgesvd 比dgesvd 更好(更快/更便宜)?
【问题讨论】:
标签:
c
performance
matrix
linear-algebra
intel-mkl
【解决方案1】:
这里有两个函数,分别指代两个不同的接口:
i. dgesvd : calls fortran interface
ii. LAPACKE_dgesvd : calls C interface
详情see this。
- 不,这是不正确的。正如您在第一次调用
dgesvd 时会注意到的,lwork 的值设置为-1,其中as documented here 仅用于计算lwork 的大小。因此,如果您已经知道lwork 的大小,则无需调用它两次。对于dgesvd,输入矩阵必须为LAPACK_COL_MAJOR,因为这是fortran 的默认值。也无法计算矩阵是行优先还是列优先。
- 不,这不是真的。
dgesvd 是首先实现的fortran 接口。
- 这取决于编译器优化。如果矩阵很小,则可能无关紧要。对我来说,如果它的专栏专业我会使用 fortran 接口。
对于矩阵布局信息see this。这是technical paper for C interface