OK, details. Since SuiteSparse is part of the Julia dependencies, if you compile Julia from source (recommended) then you already have KLU and SuiteSparse usually. To use KLU we need to make it into a shared library (like cholmod is). I've patched some makefiles to do this (just 3 makefiles).
After installing the klu shared library it can be ccalled. I've put together a test which basically replicates klu_simple.c from the tests in KLU directory of SuiteSparse. Finally, added a little benchmark to see if there is actually a speedup when pre-analyzing a matrix. There is - on my computer it was a 5x speedup, but this speedup really depends on the use patterns. The attachments include a patch file detailing the makefile changes and the klu_simple.jl file. Would love to hear if you put the KLU library to use and what kind of speedup you get. Also, if you found a different solution it would be interesting to hear about it. On Sunday, July 10, 2016 at 9:38:44 PM UTC-4, Gabriel Goh wrote: > > I'd love more details Dan! > > On Saturday, July 9, 2016 at 8:53:16 PM UTC-7, Dan wrote: >> >> Hi Gabe, >> >> SuiteSparse which comes together with Julia includes a library KLU which >> does sparse LU factorization. It has the option to return the fill-in >> reducing order it manages to find for a given sparsity pattern. With this >> returned structure it can subsequently factorize many matrices (and solve >> equations). After some tinkering, I have got it to work, so it is possible. >> >> If this is still an issue and using KLU fits the bill, I'll provide more >> details of my tinkering. >> >> DG >> >> On Friday, July 8, 2016 at 4:40:45 AM UTC-4, Gabriel Goh wrote: >>> >>> Hey, >>> >>> I have a sequence of sparse matrix factorizations I need to do, each one >>> a different matrix but with the same sparsity structure. Is there a way I >>> can save the AMD (or any other) ordering that sparsesuite returns, it does >>> not need to be recomputed each time? >>> >>> Thanks a lot for the help! >>> >>> Gabe >>> >>
klu_simple.jl
Description: Binary data
diff --git a/Makefile b/Makefile
index f9a02c6..44227c7 100644
--- a/Makefile
+++ b/Makefile
@@ -279,7 +279,7 @@ JL_PRIVATE_LIBS += arpack
endif
ifeq ($(USE_SYSTEM_SUITESPARSE),0)
ifeq ($(USE_GPL_LIBS), 1)
-JL_PRIVATE_LIBS += amd camd ccolamd cholmod colamd umfpack spqr suitesparseconfig
+JL_PRIVATE_LIBS += amd camd ccolamd cholmod klu colamd umfpack spqr suitesparseconfig
endif
endif
ifeq ($(USE_SYSTEM_LLVM),0)
diff --git a/contrib/repackage_system_suitesparse4.make b/contrib/repackage_system_suitesparse4.make
index cb39df7..535a3fc 100755
--- a/contrib/repackage_system_suitesparse4.make
+++ b/contrib/repackage_system_suitesparse4.make
@@ -24,13 +24,15 @@ default:
mkdir -p $(build_libdir)
mkdir -p $(JULIAHOME)/deps/build/SuiteSparse-SYSTEM/lib
cd $(JULIAHOME)/deps/build/SuiteSparse-SYSTEM/lib && \
- rm -f $(build_libdir)/lib{amd,cholmod,colamd,spqr,umfpack}.$(SHLIB_EXT)
+ rm -f $(build_libdir)/lib{amd,cholmod,btf,klu,colamd,spqr,umfpack}.$(SHLIB_EXT)
$(CC) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libsuitesparseconfig.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libsuitesparseconfig.$(SHLIB_EXT)
$(INSTALL_NAME_CMD)libsuitesparseconfig.$(SHLIB_EXT) $(build_libdir)/libsuitesparseconfig.$(SHLIB_EXT)
$(CC) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libamd.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libamd.$(SHLIB_EXT) $(LDFLAGS) -L$(build_libdir) -lsuitesparseconfig $(RPATH_ORIGIN)
$(INSTALL_NAME_CMD)libamd.$(SHLIB_EXT) $(build_libdir)/libamd.$(SHLIB_EXT)
$(CC) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libcolamd.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libcolamd.$(SHLIB_EXT) $(LDFLAGS) $(LIBBLAS) -L$(build_libdir) -lsuitesparseconfig $(RPATH_ORIGIN)
$(INSTALL_NAME_CMD)libcolamd.$(SHLIB_EXT) $(build_libdir)/libcolamd.$(SHLIB_EXT)
+ $(CXX) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libbtf.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libbtf.$(SHLIB_EXT) $(LDFLAGS) $(LIBBLAS) -L$(build_libdir) -lsuitesparseconfig -lcolamd -lccolamd -lcamd -lamd $(RPATH_ORIGIN)
+ $(CXX) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libklu.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libklu.$(SHLIB_EXT) $(LDFLAGS) $(LIBBLAS) -L$(build_libdir) -lsuitesparseconfig -lcolamd -lccolamd -lcamd -lamd $(RPATH_ORIGIN)
$(CXX) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libcholmod.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libcholmod.$(SHLIB_EXT) $(LDFLAGS) $(LIBBLAS) -L$(build_libdir) -lsuitesparseconfig -lcolamd -lccolamd -lcamd -lamd $(RPATH_ORIGIN)
$(INSTALL_NAME_CMD)libcholmod.$(SHLIB_EXT) $(build_libdir)/libcholmod.$(SHLIB_EXT)
$(CXX) -shared $(WHOLE_ARCHIVE) $(SS_LIB)/libumfpack.a $(NO_WHOLE_ARCHIVE) -o $(build_libdir)/libumfpack.$(SHLIB_EXT) $(LDFLAGS) $(LIBBLAS) -L$(build_libdir) -lsuitesparseconfig -lcolamd -lccolamd -lcamd -lamd -lcholmod $(RPATH_ORIGIN)
diff --git a/deps/suitesparse.mk b/deps/suitesparse.mk
index c8974b1..a08bb7b 100644
--- a/deps/suitesparse.mk
+++ b/deps/suitesparse.mk
@@ -56,7 +56,7 @@ $(SUITESPARSE_OBJ_TARGET): $(SUITESPARSE_OBJ_SOURCE)
mkdir -p $(BUILDDIR)/SuiteSparse-$(SUITESPARSE_VER)/lib && \
cd $(BUILDDIR)/SuiteSparse-$(SUITESPARSE_VER)/lib && \
rm -f *.a && \
- cp -f `find .. -name libamd.a -o -name libcolamd.a -o -name libcamd.a -o -name libccolamd.a -o -name libcholmod.a -o -name libumfpack.a -o -name libsuitesparseconfig.a -o -name libspqr.a 2>/dev/null` . && \
+ cp -f `find .. -name libamd.a -o -name libcolamd.a -o -name libcamd.a -o -name libccolamd.a -o -name libbtf.a -o -name libklu.a -o -name libcholmod.a -o -name libumfpack.a -o -name libsuitesparseconfig.a -o -name libspqr.a 2>/dev/null` . && \
$(CC) -shared $(WHOLE_ARCHIVE) libsuitesparseconfig.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libsuitesparseconfig.$(SHLIB_EXT) && \
$(INSTALL_NAME_CMD)libsuitesparseconfig.$(SHLIB_EXT) $(build_shlibdir)/libsuitesparseconfig.$(SHLIB_EXT) && \
$(CC) -shared $(WHOLE_ARCHIVE) libamd.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libamd.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lsuitesparseconfig $(RPATH_ORIGIN) && \
@@ -67,6 +67,10 @@ $(SUITESPARSE_OBJ_TARGET): $(SUITESPARSE_OBJ_SOURCE)
$(INSTALL_NAME_CMD)libcamd.$(SHLIB_EXT) $(build_shlibdir)/libcamd.$(SHLIB_EXT) && \
$(CC) -shared $(WHOLE_ARCHIVE) libccolamd.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libccolamd.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lsuitesparseconfig $(RPATH_ORIGIN) && \
$(INSTALL_NAME_CMD)libccolamd.$(SHLIB_EXT) $(build_shlibdir)/libccolamd.$(SHLIB_EXT) && \
+ $(CXX) -shared $(WHOLE_ARCHIVE) libbtf.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libbtf.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lcolamd -lamd -lcamd -lccolamd -lsuitesparseconfig $(LIBLAPACK) $(LIBBLAS) $(RPATH_ORIGIN) && \
+ $(INSTALL_NAME_CMD)libbtf.$(SHLIB_EXT) $(build_shlibdir)/libbtf.$(SHLIB_EXT) && \
+ $(CXX) -shared $(WHOLE_ARCHIVE) libklu.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libklu.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lcolamd -lamd -lcamd -lccolamd -lbtf -lsuitesparseconfig $(LIBLAPACK) $(LIBBLAS) $(RPATH_ORIGIN) && \
+ $(INSTALL_NAME_CMD)libklu.$(SHLIB_EXT) $(build_shlibdir)/libklu.$(SHLIB_EXT) && \
$(CXX) -shared $(WHOLE_ARCHIVE) libcholmod.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libcholmod.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lcolamd -lamd -lcamd -lccolamd -lsuitesparseconfig $(LIBLAPACK) $(LIBBLAS) $(RPATH_ORIGIN) && \
$(INSTALL_NAME_CMD)libcholmod.$(SHLIB_EXT) $(build_shlibdir)/libcholmod.$(SHLIB_EXT) && \
$(CXX) -shared $(WHOLE_ARCHIVE) libumfpack.a $(NO_WHOLE_ARCHIVE) -o $(build_shlibdir)/libumfpack.$(SHLIB_EXT) $(LDFLAGS) -L$(build_shlibdir) -lcholmod -lcolamd -lamd -lsuitesparseconfig $(LIBBLAS) $(RPATH_ORIGIN) && \
@@ -92,10 +96,10 @@ install-suitesparse: $(SUITESPARSE_OBJ_TARGET) install-suitesparse-wrapper
ifeq ($(USE_SYSTEM_SUITESPARSE), 1)
SUITESPARSE_INC := -I /usr/include/suitesparse
-SUITESPARSE_LIB := -lumfpack -lcholmod -lamd -lcamd -lcolamd -lspqr
+SUITESPARSE_LIB := -lumfpack -lbtf -lklu -lcholmod -lamd -lcamd -lcolamd -lspqr
else
SUITESPARSE_INC := -I $(BUILDDIR)/SuiteSparse-$(SUITESPARSE_VER)/CHOLMOD/Include -I $(BUILDDIR)/SuiteSparse-$(SUITESPARSE_VER)/SuiteSparse_config -I $(BUILDDIR)/SuiteSparse-$(SUITESPARSE_VER)/SPQR/Include
-SUITESPARSE_LIB := -L$(build_shlibdir) -lcholmod -lumfpack -lspqr $(RPATH_ORIGIN)
+SUITESPARSE_LIB := -L$(build_shlibdir) -lbtf -lklu -lcholmod -lumfpack -lspqr $(RPATH_ORIGIN)
$(build_shlibdir)/libsuitesparse_wrapper.$(SHLIB_EXT): $(SUITESPARSE_OBJ_TARGET)
endif
