]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Sigh, another workaround for broken blas
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 27 Aug 2020 20:12:31 +0000 (21:12 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 27 Aug 2020 20:12:31 +0000 (21:12 +0100)
cmake/Openblas.cmake
contrib/kann/kautodiff.c

index 69f065d8fb39a444e4934766ecd413a164e44b3d..2155b29551b115b96815468918b9c65c10d648d1 100644 (file)
@@ -27,5 +27,38 @@ IF(WITH_BLAS)
     ELSE()
         ADD_COMPILE_OPTIONS(-DHAVE_CBLAS_H)
     ENDIF()
+    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sgemm.c" "
+#include <stddef.h>
+enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102 };
+enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112 };
+extern void cblas_sgemm(const enum CBLAS_ORDER Order,
+                const enum CBLAS_TRANSPOSE TA,
+                const enum CBLAS_TRANSPOSE TB,
+                const int M, const int N, const int K,
+                const float  alpha, const float *A, const int lda,
+                const float *B, const int ldb, const float  beta,
+                float *C, const int ldc);
+int main(int argc, char **argv)
+{
+    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 0, 0, 0, 0, NULL, 0,
+        NULL, 0, 0, NULL, 0);
+    return 0;
+}
+")
+    try_compile(HAVE_CBLAS_SGEMM
+            ${CMAKE_CURRENT_BINARY_DIR}
+            "${CMAKE_CURRENT_BINARY_DIR}/sgemm.c"
+            COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+            LINK_LIBRARIES ${BLAS_REQUIRED_LIBRARIES}
+            OUTPUT_VARIABLE SGEMM_ERR)
+
+    # Cmake is just brain damaged
+    #CHECK_LIBRARY_EXISTS(${BLAS_REQUIRED_LIBRARIES} cblas_sgemm "" HAVE_CBLAS_SGEMM)
+    if(HAVE_CBLAS_SGEMM)
+        MESSAGE(STATUS "Blas has CBLAS sgemm")
+        ADD_COMPILE_OPTIONS(-DHAVE_CBLAS_SGEMM)
+    else()
+        MESSAGE(STATUS "Blas has -NOT- CBLAS sgemm, use internal workaround: ${SGEMM_ERR}")
+    endif()
     ADD_COMPILE_OPTIONS(-DHAVE_CBLAS)
 ENDIF(WITH_BLAS)
\ No newline at end of file
index 439485a0abe90d3b495f3eb4f112dd55608977a7..a8af6796b82e750b937b5ee8587230aabb2fb40b 100644 (file)
@@ -899,16 +899,21 @@ void kad_vec_mul_sum(int n, float *a, const float *b, const float *c)
 
 void kad_saxpy(int n, float a, const float *x, float *y) { kad_saxpy_inlined(n, a, x, y); }
 
+/* This is actually lapack not cblas, but this definition is used */
 #ifdef HAVE_CBLAS
 #ifndef __APPLE__
 /* As gfortran mangles names */
 #define ssyev ssyev_
 #endif
 extern void ssyev(const char* jobz, const char* uplo, int* n, float* a, int* lda, float* w, float* work, int* lwork, int* info);
+#endif
+
+#ifdef HAVE_CBLAS_SGEMM
+
 #ifdef HAVE_CBLAS_H
 #include "cblas.h"
 #else
-/* Poor man approach */
+/* Poor man approach, thanks for that Apple */
 enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102 };
 enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112 };
 extern void cblas_sgemm(const enum CBLAS_ORDER Order,
@@ -919,6 +924,7 @@ extern void cblas_sgemm(const enum CBLAS_ORDER Order,
                  const float *B, const int ldb, const float  beta,
                  float *C, const int ldc);
 #endif
+
 void kad_sgemm_simple(int trans_A, int trans_B, int M, int N, int K, const float *A, const float *B, float *C)
 {
        cblas_sgemm(CblasRowMajor, trans_A? CblasTrans : CblasNoTrans, trans_B? CblasTrans : CblasNoTrans, M, N, K, 1.0f, A, trans_A? M : K, B, trans_B? K : N, 1.0f, C, N);