1

我试图通过对 .so 使用 dlopen() 并在每个版本中打开函数来支持 Ubuntu 18.04 和 CentOS 7 中的 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);

如何将其转换为 call zgetrf_(...)

4

1 回答 1

0

LAPACKE_ 函数将调用链接的 openblas.so.0 库,因此无需直接链接到 openblas.so.0。

对于 ATLAS,您可以调用 liblapack_atlas.so.3 导出的 clapack_ 函数,它们的格式几乎相同(相同的顺序,相同的类型),只是transform参数不同。例如,zgetrs()在 ATLAS 中的 in 可能采用标准 BLASCblasTrans枚举作为transform参数。但是,在 OpenBLAS(和 MKL)中,此参数应从 ATLAS 转换为 OpenBLAS,如下所示:

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

于 2021-09-22T00:16:09.933 回答