OpenBLAS 中 LAPACKE_zgetrf() 和 zgetrf_() 之间的调用约定有什么区别?

What is the calling convention difference between LAPACKE_zgetrf() and zgetrf_() in OpenBLAS?

我试图在 Ubuntu 18.04 和 CentOS 7 中通过对 .so 使用 dlopen() 并在每个版本中打开函数来支持 zgetrf(),但调用约定不同。在 CentOS 中它可以使用 LAPACKE_zgetrf() 但在 Ubuntu 18.04 中它们不会导出为 LAPACKE_zgetrf,唯一的选项是 zgetrf_:

# objdump -T /usr/lib/i386-linux-gnu/libopenblas.so.0 |grep zgetrf
[...]
000c3a60 g    DF .text  00000191  Base        zgetrf_

我可以按如下方式进行 LAPACKE_zgetrf() 调用,这有效:

LAPACKE_zgetrf(order, m, n, a, ndim, (int32_t*)ip);

如何将其转换为调用 zgetrf_(...)

LAPACKE_ 函数将调用 linked openblas.so.0 库,因此不需要直接 link 到 openblas.so.0。

对于ATLAS,可以调用liblapack_atlas.so.3导出的clapack_函数,除了transform参数不同外,格式几乎相同(顺序相同,类型相同)。例如,在 ATLAS 中的 zgetrs() 中,transform 参数可能采用标准的 BLAS CblasTrans 枚举。然而,在 OpenBLAS(和 MKL)中,这个参数应该从 ATLAS 转换为 OpenBLAS,如下所示:

openblas_trans = ((trans) == CblasConjTrans ? 'C' : ((trans) == CblasTrans ? 'T' : 'N'))