Calling Intel MKL as an external library on Mac

Hi, I’d like to use the Fortran subroutine ZGELSS from MKL in Julia and I’m a bit confused.

julia> versioninfo()
Julia Version 1.3.0
Commit 46ce4d7933 (2019-11-26 06:09 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin19.0.0)
  CPU: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_NUM_THREADS = 4

I tried to find the subroutine in libmkl_rt.dylib and I’m confused about what everything is.

nm /opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib/libmkl_rt.dylib | grep zgelss
00000000003e28f0 T _LAPACKE_zgelss
00000000003e2ed0 T _LAPACKE_zgelss_work
00000000003e2590 T _lapacke_zgelss
00000000003e27d0 T _lapacke_zgelss_
00000000003e2a20 T _lapacke_zgelss_work
00000000003e2d40 T _lapacke_zgelss_work_
0000000000528960 T _mkl_lapack__zgelss_
00000000005284e0 T _zgelss
0000000000528660 T _zgelss_

The closest topic I could find regarding this was Call Intel MKL as external library. The code shown there worked, so I tried to ccall LAPACKE_zgelss that way and I get

signal (11): Segmentation fault: 11
in expression starting at /path to julia file/MKL_zgelss_test.jl:46
mkl_lapack_zgelss at /opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib/libmkl_core.dylib (unknown line)
ZGELSS at /opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib/libmkl_intel_ilp64.dylib (unknown line)
LAPACKE_zgelss_work at /opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib/libmkl_intel_ilp64.dylib (unknown line)
LAPACKE_zgelss at /opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib/libmkl_intel_ilp64.dylib (unknown line)
Allocations: 53473789 (Pool: 53462622; Big: 11167); GC: 57

the code for this is

using Libdl


const global librt = Libdl.find_library(["libmkl_rt"],
 ["path to libmkl_rt"])

Libdl.dlopen(librt)

function zgelssMKL_C(A::StridedMatrix{ComplexF64}, b::StridedMatrix{ComplexF64})
  m, n = size(A)
  lda = ldb  = max(1,stride(A, 2))
  s = similar(A, Float64, lda)
  rcond = -1.0
  rank = 0
  # lapack_int LAPACKE_zgelss(
  # int 	matrix_layout,
  # lapack_int 	m,
  # lapack_int 	n,
  # lapack_int 	nrhs,
  # lapack_complex_double * 	a,
  # lapack_int 	lda,
  # lapack_complex_double * 	b,
  # lapack_int 	ldb,
  # double * 	s,
  # double 	rcond,
  # lapack_int * 	rank)
  dd = ccall(("LAPACKE_zgelss", librt),
              Cint, # Return type
                (Int64, Int64, Int64, Int64,
                Ptr{ComplexF64}, Int64, Ptr{ComplexF64}, Int64,
                Ptr{Float64}, Float64, Int64),
                102, m, n, 1,
                A, lda, b, ldb,
                s, rcond, rank)
  dd, b # dd = 0 if calculation is done, b = output
end # function


N = 10;
A = rand(ComplexF64,N,N);
AA = copy(A);
b = rand(ComplexF64, N,1);
c = copy(b);


dd, x = zgelssMKL_C(A, b)

What could be causing this?
Is it possible to call ZGELSS?
Would there be any differences between LAPACKE_zgelss and ZGELSS

Thanks

Partly solved by @mkitti. He used the gelsd! definition in lapack.jl to hack a gelss! function together.

I’d still like to know what the functions shown in nm are, but I’ll mark it as solved if no one answers in 24h as it’s not really a Julia thing.

1 Like

Between my answer and @mfh 's answer, I believe you have a full solution to use the MKL and call ZGELSS: