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
>>>
>>

Attachment: 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
 

Reply via email to