jianyangqt / gcta

GCTA software
GNU General Public License v3.0
73 stars 23 forks source link

LAPACK API change #59

Open outpaddling opened 7 months ago

outpaddling commented 7 months ago

I was tipped off to the need for some updates due to an API change in OpenBLAS 0.3.25, which apparently follows a change to reference LAPACK:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=273219

Minimal patches that fix the FreeBSD port build are below. There are numerous other calls to these functions that are not addressed by these patches (e.g. in the plink submodule), and using '1' as the added argument is just an educated guess.

--- include/Matrix.hpp.orig     2022-08-03 06:01:52 UTC
+++ include/Matrix.hpp
@@ -32,7 +32,9 @@ bool _LLT(MatrixType &A, double &logdet){
 #if GCTA_CPU_x86
     dpotrf(&uplo, &cols, vi, &cols, &info);
 #else
-    dpotrf_(&uplo, &cols, vi, &cols, &info);
+    // OpenBLAS 0.3.25 requires a length argument.  Is 1 the right value?
+    // Should all dgeqrf_() calls be patched?
+    dpotrf_(&uplo, &cols, vi, &cols, &info, 1);
 #endif    
     //LOGGER << "  LLT time: " << LOGGER.tp("LLT") << std::endl;
     if(info == 0){
@@ -41,7 +43,9 @@ bool _LLT(MatrixType &A, double &logdet){
 #if GCTA_CPU_x86        
         dpotri(&uplo, &cols, vi, &cols, &info);
 #else
-        dpotri_(&uplo, &cols, vi, &cols, &info);
+        // OpenBLAS 0.3.25 requires a length argument.  Is 1 the right value?
+        // Should all doptri_() calls be patched?
+        dpotri_(&uplo, &cols, vi, &cols, &info, 1);
 #endif
         //LOGGER << "  LLT inverse time: " << LOGGER.tp("LLT_INV") << std::endl;
         if(info == 0){
--- main/mkl.cpp.orig   2023-11-20 14:09:49 UTC
+++ main/mkl.cpp
@@ -365,7 +365,9 @@ bool gcta::comput_inverse_logdet_LDLT_mkl(eigenMatrix 
 #if GCTA_CPU_x86
     dpotrf(&uplo, &int_n, Vi_mkl, &int_n, &info);
 #else
-    dpotrf_(&uplo, &int_n, Vi_mkl, &int_n, &info);
+    // OpenBLAS 0.3.25 requires a length argument.  Is 1 the right value?
+    // Should all dpotrf_() calls be patched?
+    dpotrf_(&uplo, &int_n, Vi_mkl, &int_n, &info, 1);
 #endif
     //LOGGER << "Finished decompose" << endl;
     //spotrf( &uplo, &n, Vi_mkl, &n, &info );
@@ -386,7 +388,9 @@ bool gcta::comput_inverse_logdet_LDLT_mkl(eigenMatrix 
 #if GCTA_CPU_x86
         dpotri(&uplo, &int_n, Vi_mkl, &int_n, &info);
 #else
-        dpotri_(&uplo, &int_n, Vi_mkl, &int_n, &info);
+        // OpenBLAS 0.3.25 requires a length argument.  Is 1 the right value?
+        // Should all dpotri_() calls be patched?
+        dpotri_(&uplo, &int_n, Vi_mkl, &int_n, &info, 1);
 #endif
         //LOGGER << "Inverse finished" << endl;
         //spotri( &uplo, &n, Vi_mkl, &n, &info );
--- src/StatLib.cpp.orig        2022-08-03 06:01:52 UTC
+++ src/StatLib.cpp
@@ -1,3 +1,4 @@
+
 /*
    GCTA: a tool for Genome-wide Complex Trait Analysis

@@ -117,8 +118,10 @@ namespace StatLib{
         dormqr(&side, &t, &n, &n, &n, X, &lda, tau, c, 
                 &lda, work, &lwork, &info);
 #else
+        // OpenBLAS 0.3.25 requires a length argument.  Is 1 the right value?
+        // Should all dormqr_() calls be patched?
         dormqr_(&side, &t, &n, &n, &n, X, &lda, tau, c, 
-                &lda, work, &lwork, &info);
+                &lda, work, &lwork, &info, 1, 1);
 #endif
         if(info != 0){
             return false;