DavidRConnell / matlab-igraph

Igraph bindings for matlab
https://davidrconnell.github.io/matlab-igraph
GNU General Public License v3.0
1 stars 0 forks source link

Matlab links against shared libraries it packages instead of following rpath #1

Closed DavidRConnell closed 6 months ago

DavidRConnell commented 10 months ago

It appears, at runtime, MATLAB gives preference to shared libraries in the MATLAB installation. This leads to using different libraries than what igraph was compilled with. There have been a few unexpected crashes when running MEX files that may be caused by this. For example, running the dotproduct random game crashes with the stack trace:

[  0] 0x00007fa34b8f58c0      /home/voidee/matlab/R2023b/bin/glnxa64/mkl.so+21977280 mkl_blas_avx2_xddot+00000736
[  1] 0x00007fa34aa6d0d6      /home/voidee/matlab/R2023b/bin/glnxa64/mkl.so+06738134 mkl_blas_ddot+00001190
[  2] 0x00007fa605b55893 /home/voidee/matlab/R2023b/bin/glnxa64/../../sys/os/glnxa64/libiomp5.so+01398931 __kmp_invoke_microtask+00000147
[  3] 0x00007fa605ac8cb3 /home/voidee/matlab/R2023b/bin/glnxa64/../../sys/os/glnxa64/libiomp5.so+00822451
[  4] 0x00007fa605ac9f7d /home/voidee/matlab/R2023b/bin/glnxa64/../../sys/os/glnxa64/libiomp5.so+00827261 __kmp_fork_call+00003965
[  5] 0x00007fa605a85425 /home/voidee/matlab/R2023b/bin/glnxa64/../../sys/os/glnxa64/libiomp5.so+00545829 __kmpc_fork_call+00000421
[  6] 0x00007fa34aa6cdff      /home/voidee/matlab/R2023b/bin/glnxa64/mkl.so+06737407 mkl_blas_ddot+00000463
[  7] 0x00007fa34a84ba27      /home/voidee/matlab/R2023b/bin/glnxa64/mkl.so+04504103 DDOT+00000167
[  8] 0x00007fa355d31b08 /home/voidee/packages/matlab/matlab-igraph/toolbox/+igraph/private/mexIgraphRandGame.mexa64+00117512
[  9] 0x00007fa355d1bb33 /home/voidee/packages/matlab/matlab-igraph/toolbox/+igraph/private/mexIgraphRandGame.mexa64+00027443
[ 10] 0x00007fa355d1d795 /home/voidee/packages/matlab/matlab-igraph/toolbox/+igraph/private/mexIgraphRandGame.mexa64+00034709 mexFunction+00000357
[ 11] 0x00007fa61c38ba1f   /home/voidee/matlab/R2023b/bin/glnxa64/libmex.so+00956959
[ 12] 0x00007fa61c38ba97   /home/voidee/matlab/R2023b/bin/glnxa64/libmex.so+00957079
[ 13] 0x00007fa61c38d0ba   /home/voidee/matlab/R2023b/bin/glnxa64/libmex.so+00962746
[ 14] 0x00007fa61c378a70   /home/voidee/matlab/R2023b/bin/glnxa64/libmex.so+00879216

Despite ldd's output:

linux-vdso.so.1 (0x00007fff62eaa000)
        libmxIgraph.so => /home/voidee/packages/matlab/matlab-igraph/toolbox/lib/libmxIgraph.so (0x00007f2bdc00a000)
        libigraph.so.3 => /home/voidee/packages/matlab/matlab-igraph/toolbox/lib/libigraph.so.3 (0x00007f2bdbc00000)
        libmx.so => not found
        libmex.so => not found
        libmat.so => not found
        libm.so.6 => /nix/store/qn3ggz5sf3hkjs2c797xf7nan3amdxmp-glibc-2.38-27/lib/libm.so.6 (0x00007f2bdbf28000)
        libstdc++.so.6 => /nix/store/myw67gkgayf3s2mniij7zwd79lxy8v0k-gcc-12.3.0-lib/lib/libstdc++.so.6 (0x00007f2bdb800000)
        libc.so.6 => /nix/store/qn3ggz5sf3hkjs2c797xf7nan3amdxmp-glibc-2.38-27/lib/libc.so.6 (0x00007f2bdb618000)
        libarpack.so.2 => /nix/store/w2c2n187mi2f512zh284z7k10l5dlvxp-arpack-3.9.1/lib/libarpack.so.2 (0x00007f2bdbedb000)
        libblas.so.3 => /nix/store/jx5r3fyz26nvrj5zcx2f7fc2yszfalwb-blas-3/lib/libblas.so.3 (0x00007f2bd9b98000)
        libglpk.so.40 => /nix/store/fxj15dlpa97m0kbyz28j61y15440kib7-glpk-5.0/lib/libglpk.so.40 (0x00007f2bdbb12000)
        libgmp.so.10 => /nix/store/s3s7gv33p88kzbgki2bprg2a1nc7jnf8-gmp-with-cxx-6.3.0/lib/libgmp.so.10 (0x00007f2bdba6f000)
        libdl.so.2 => /nix/store/qn3ggz5sf3hkjs2c797xf7nan3amdxmp-glibc-2.38-27/lib/libdl.so.2 (0x00007f2bdbed4000)
        libxml2.so.2 => /nix/store/8iqf3yxqy256rsr7zqb1w0i503qxws12-libxml2-2.11.5/lib/libxml2.so.2 (0x00007f2bd9a37000)
        libgomp.so.1 => /nix/store/myw67gkgayf3s2mniij7zwd79lxy8v0k-gcc-12.3.0-lib/lib/libgomp.so.1 (0x00007f2bdba2a000)
        libpthread.so.0 => /nix/store/qn3ggz5sf3hkjs2c797xf7nan3amdxmp-glibc-2.38-27/lib/libpthread.so.0 (0x00007f2bdbecd000)
        libgcc_s.so.1 => /nix/store/myw67gkgayf3s2mniij7zwd79lxy8v0k-gcc-12.3.0-lib/lib/libgcc_s.so.1 (0x00007f2bd9a16000)
        /nix/store/qn3ggz5sf3hkjs2c797xf7nan3amdxmp-glibc-2.38-27/lib64/ld-linux-x86-64.so.2 (0x00007f2bdc01c000)
        libgfortran.so.5 => /nix/store/4avaj23y8h6hq8wck73250w77y0s6kvi-gfortran-12.3.0-lib/lib/libgfortran.so.5 (0x00007f2bd9600000)
        libquadmath.so.0 => /nix/store/myw67gkgayf3s2mniij7zwd79lxy8v0k-gcc-12.3.0-lib/lib/libquadmath.so.0 (0x00007f2bd99cf000)
        libz.so.1 => /nix/store/8xgb8phqmfn9h971q7dg369h647i1aa0-zlib-1.3/lib/libz.so.1 (0x00007f2bd99b1000)

Specifically, mkl's blas is used for the ddot command instead of using openblas (the blas used when compiling igraph).

Can either try to force MATLAB to link against values defined in rpath or try to compile igraph with the MATLAB's libraries, where possible. Given that MATLAB provides versions of libxml2, GMP, ARPACK, and BLAS and LAPACK, this may significantly simplify distribution of precompiled binaries. Particularly if MATLAB will automatically set the path to the libraries at link time so the location of the MATLAB installation on the machine the binaries were compiled on doesn't matter. However, I am not sure how to point CMake to the MATLAB's libraries when compiling igraph since CMake's find_package is failing to find MATLAB.

DavidRConnell commented 6 months ago

Something fixed this issue. Possibly the switch to using igraph's internal BLAS library.