OpenBLAS中LAPACKE_zgetrf()与zgetrf_()调用约定差异及转换方法
解决方案
LAPACKE_zgetrf是LAPACK项目封装的原生C接口,而zgetrf_是Fortran实现的LAPACK核心函数导出的C兼容符号,二者调用约定存在本质差异,改写逻辑如下:
核心差异说明
- Fortran接口所有参数均按引用传递,入参必须传指针
- Fortran原生
zgetrf仅支持列优先存储,无需传入order参数 - 末尾多一个返回执行状态的
info指针参数
改写后的调用代码
如果你原调用中order参数为LAPACK_COL_MAJOR(列优先),可直接按如下形式改写:
// 先定义状态接收变量 int info; // 调用Fortran接口的zgetrf_ zgetrf_(&m, &n, a, &ndim, (int32_t*)ip, &info);
如果原order为LAPACK_ROW_MAJOR(行优先),需要先手动将矩阵转置为列优先格式,调用完成后再转置回行优先,同时调整ip(主元索引数组)的映射关系。
多环境兼容提示
你可以通过dlsym的返回值自动适配两种环境:优先查找LAPACKE_zgetrf符号,找不到再查找zgetrf_符号,用函数指针封装后统一调用,就可以同时兼容CentOS和Ubuntu 18.04的运行环境。
内容的提问来源于stack exchange,提问作者KJ7LNW
相关产品推荐
相关产品推荐

