编译了一个动态库,需要调用blas的库函数进行矩阵向量运算。在linux环境下一开始使用的是atlas库,编译运行后没有问题,但是速度和windows下的程序比较慢了很多,唯一的不同之处在于windows下调用的是openblas函数库,于是考虑是不是这个动态库的速度有差别。
然后编译openblas的源代码,下载地址如下https://github.com/xianyi/OpenBLAS,编译的时候需要使用FC=gfortran选项才能编译成功。
但是编译成功后,我写的动态库调用openblas,问题出现在外部函数链接动态库的时候。只用链接了这个库,在main函数执行之前,程序直接core掉,完全没法调试。
于是我考虑是不是我编译oepnblas的库的问题,另外写了一个简单的testlib库,调用openblas,运行良好。也就是说openblas库编译没有问题。
我完全迷惑了,在工程组同事的帮助下,找到了问题的所在。
流程如下: 首先在http://itil.gyoss.oa.com公司内部网站上申请”现网环境管理“下的coredump开关的使用权,打开服务器上的coredump开关。然后在服务器上使用
ulimit -c unlimited 设置core file size(ps: 使用 ulimit -a 可以查看core file size的大小)
可以看到程序是在main函数运行前调用blas分配内存时出了问题。查看openblas的资料可以发现,openblas根据自动探测的cpu内核开多个线程,服务器有12核,所以它开了12个线程,分配内存时出了问题,使用
程序挂掉时 segmentation fault后面会多个括号,里面写着 coredumped
这时候会在/home/tmp下生成core文件,用gdb可以查看
查看是问题是这样的
export OPENBLAS_NUM_THREADS=1
运行ok
但是还是觉得有些地方不能理解