数学库接口过滤脚本
介绍
在探究精度问题的过程中,经常发现由于数学库不同而造成的差异。鲲鹏数学库团队为此开发了精度与ICC数学库IMF兼容的数学库KML,使得KML的计算结果与IMF一致。该团队对鲲鹏数学库与IMF进行了精度模拟,结果表明目前大部分函数都可以实现精度一致。
精度函数清单(鲲鹏数学库和x86 IMF数学库已完全一致)
函数名 |
函数简介 |
---|---|
abs |
返回一个数的绝对值 |
fabs |
返回一个数的绝对值 |
ccos |
返回一个复数的余弦值 |
ccosf |
返回一个复数的余弦值 |
cexp |
返回一个复数的指数值 |
cexpf |
返回一个复数的指数值 |
cdiv |
返回两个复数的商 |
cdivf |
返回两个复数的商 |
ceil |
返回一个数的上限整数 |
ceilf |
返回一个数的上限整数 |
exp |
返回一个数的指数值 |
expf |
返回一个数的指数值 |
clog |
返回一个复数的自然对数 |
clogf |
返回一个复数的自然对数 |
cosd |
返回一个角度的余弦值 |
cosdf |
返回一个角度的余弦值 |
cosl |
返回一个长双精度数的余弦值 |
cosl_18 |
返回一个长双精度数的余弦值 |
cos |
返回一个弧度的余弦值 |
cosf |
返回一个弧度的余弦值 |
csin |
返回一个复数的正弦值 |
csinf |
返回一个复数的正弦值 |
erf |
返回一个数的误差函数值 |
erff |
返回一个数的误差函数值 |
expl |
返回一个长双精度数的指数值 |
expl_18 |
返回一个长双精度数的指数值 |
floor |
返回一个数的下限整数 |
floorf |
返回一个数的下限整数 |
fmod |
返回两个数的余数 |
fmodf |
返回两个数的余数 |
frexp |
返回一个数的尾数和指数 |
frexpf |
返回一个数的尾数和指数 |
gammaf |
返回一个数的伽马函数值 |
hypot |
返回两个数的平方和的平方根 |
ldexp |
返回一个数的乘方值 |
ldexpl |
返回一个长双精度数的乘方值 |
log |
返回一个数的自然对数 |
logl |
返回一个长双精度数的自然对数 |
llrint |
返回一个数的四舍五入整数 |
lround |
返回一个数的四舍五入整数 |
lroundf |
返回一个数的四舍五入整数 |
fmodf_18 |
返回两个数的余数 |
nearbyint |
返回一个数的最接近整数 |
nearbyintf |
返回一个数的最接近整数 |
pow |
返回一个数的乘方值 |
powf |
返回一个数的乘方值 |
powl |
返回一个长双精度数的乘方值 |
powi4i4 |
返回一个整数的乘方值 |
powi4i4_18 |
返回一个整数的乘方值 |
powi8i4 |
返回一个长整数的乘方值 |
powi8i4_18 |
返回一个长整数的乘方值 |
powi8i8 |
返回一个长整数的乘方值 |
powr4i4 |
返回一个实数的乘方值 |
rint |
返回一个数的最接近整数 |
rintf |
返回一个数的最接近整数 |
round |
返回一个数的四舍五入整数 |
roundf |
返回一个数的四舍五入整数 |
sin |
返回一个弧度的正弦值 |
sinf |
返回一个弧度的正弦值 |
sind |
返回一个角度的正弦值 |
sindf |
返回一个角度的正弦值 |
sinl |
返回一个长双精度数的正弦值 |
sinl_18 |
返回一个长双精度数的正弦值 |
sqrt |
返回一个数的平方根 |
sqrtl |
返回一个长双精度数的平方根 |
trunc |
返回一个数的整数部分 |
truncf |
返回一个数的整数部分 |
cexp |
计算复数的指数函数 |
cexpf |
计算单精度复数的指数函数 |
cdiv |
计算两个复数的商 |
cdivf |
计算两个单精度复数的商 |
cabs |
计算复数的模长 |
cpow |
计算复数的幂函数 |
排查方法
保存如下脚本为math-filter.sh,然后在应用的二进制目录下运行math-filter.sh xx.exe来排查应用中包含的所有数学库接口。若出现未和x86的数学库函数对标过的接口,就联系KML数学库团队进行补齐。
#!/bin/bash #保存为xx.sh,然后cd到二进制目录,运行xx.sh 二进制名称即可 name=$(basename $1) log_name=${name}_mathlib.log echo $name echo -e "collect mathlib function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libmathlib.so" >> $log_name echo -e "collect bsmath function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libbsmath.so" >> $log_name echo -e "collect pgmath function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libpgmath.so" >> $log_name echo -e "collect KML function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libk" >> $log_name echo -e "collect sys math function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libm.so" >> $log_name echo -e "collect fftw function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libfftw3" >> $log_name echo -e "collect blas&lapack function...\n" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libopenblas" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "libblas" >> $log_name LD_DEBUG=symbols,bindings ldd -r $name |& grep "$name" |grep "normal symbol" |grep "liblapack" >> $log_name