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'))
我试图在 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'))