From 90fd5b90379c0b00e62c9ac3ed9972647532c0b0 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 14 Jul 2024 22:46:37 +0200 Subject: [PATCH 1/4] Add support mkl --- CMakeLists.txt | 16 ++++++++++++++-- src/CMakeLists.txt | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04925096f..37ecae37e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,11 +46,23 @@ option(FIND_BLAS "Find external BLAS and LAPACK" ON) # --- find BLAS and LAPACK if(FIND_BLAS) - find_package(BLAS) + if(NOT BLAS_FOUND) + #Required for MKL + if(DEFINED ENV{MKLROOT} OR "${BLA_VENDOR}" MATCHES "^Intel") + enable_language("C") + endif() + find_package("BLAS") + endif() if(BLAS_FOUND) add_compile_definitions(STDLIB_EXTERNAL_BLAS) endif() - find_package(LAPACK) + if(NOT LAPACK_FOUND) + #Required for MKL + if(DEFINED ENV{MKLROOT} OR "${BLA_VENDOR}" MATCHES "^Intel") + enable_language("C") + endif() + find_package("LAPACK") + endif() if(LAPACK_FOUND) add_compile_definitions(STDLIB_EXTERNAL_LAPACK) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c7c738bbe..398935080 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -122,10 +122,10 @@ add_library(${PROJECT_NAME} ${SRC}) # Link to BLAS and LAPACK if(BLAS_FOUND) - target_link_libraries(${PROJECT_NAME} BLAS::BLAS) + target_link_libraries(${PROJECT_NAME} "BLAS::BLAS") endif() if(LAPACK_FOUND) - target_link_libraries(${PROJECT_NAME} LAPACK::LAPACK) + target_link_libraries(${PROJECT_NAME} "LAPACK::LAPACK") endif() set_target_properties( From a6903905e7fa4fb3a16edcc35e706931d620eac3 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 14 Jul 2024 22:57:48 +0200 Subject: [PATCH 2/4] test --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b6bb075b0..88c781fbf 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -138,9 +138,9 @@ jobs: -DCMAKE_MAXIMUM_RANK:String=4 -DCMAKE_INSTALL_PREFIX=$PWD/_dist -DFIND_BLAS:STRING=TRUE - -DBLAS_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" - -DLAPACK_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" -S . -B build_mkl +# -DBLAS_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" +# -DLAPACK_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" - name: Build and compile with MKL run: cmake --build build_mkl --parallel From 40765adbd8ec5783c2a311dbf3d104d4270cce09 Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Mon, 15 Jul 2024 00:15:09 +0200 Subject: [PATCH 3/4] fix test svd (related to signs of singular values) --- test/linalg/test_linalg_svd.fypp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/linalg/test_linalg_svd.fypp b/test/linalg/test_linalg_svd.fypp index d5a01d123..fdb5d5a0e 100644 --- a/test/linalg/test_linalg_svd.fypp +++ b/test/linalg/test_linalg_svd.fypp @@ -93,7 +93,7 @@ module test_linalg_svd if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(u-u_sol)<=tol) .or. all(abs(u+u_sol)<=tol), test//': U') + call check(error, all(abs(abs(u)-abs(u_sol))<=tol), test//': U') if (allocated(error)) return !> [S, U]. Overwrite A matrix @@ -104,7 +104,7 @@ module test_linalg_svd if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(u-u_sol)<=tol) .or. all(abs(u+u_sol)<=tol), test//': U') + call check(error, all(abs(abs(u)-abs(u_sol))<=tol), test//': U') if (allocated(error)) return !> [S, U, V^T] @@ -116,9 +116,9 @@ module test_linalg_svd if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(u-u_sol)<=tol) .or. all(abs(u+u_sol)<=tol), test//': U') + call check(error, all(abs(abs(u)-abs(u_sol))<=tol), test//': U') if (allocated(error)) return - call check(error, all(abs(vt-vt_sol)<=tol) .or. all(abs(vt+vt_sol)<=tol), test//': V^T') + call check(error, all(abs(abs(vt)-abs(vt_sol))<=tol), test//': V^T') if (allocated(error)) return !> [S, V^T]. Do not overwrite A matrix @@ -130,7 +130,7 @@ module test_linalg_svd if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(vt-vt_sol)<=tol) .or. all(abs(vt+vt_sol)<=tol), test//': V^T') + call check(error, all(abs(abs(vt)-abs(vt_sol))<=tol), test//': V^T') if (allocated(error)) return !> [S, V^T]. Overwrite A matrix @@ -141,7 +141,7 @@ module test_linalg_svd if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(vt-vt_sol)<=tol) .or. all(abs(vt+vt_sol)<=tol), test//': V^T') + call check(error, all(abs(abs(vt)-abs(vt_sol))<=tol), test//': V^T') if (allocated(error)) return !> [U, S, V^T]. @@ -151,11 +151,11 @@ module test_linalg_svd test = '[U, S, V^T]' call check(error,state%ok(),test//': '//state%print()) if (allocated(error)) return - call check(error, all(abs(u-u_sol)<=tol) .or. all(abs(u+u_sol)<=tol), test//': U') + call check(error, all(abs(abs(u)-abs(u_sol))<=tol), test//': U') if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(vt-vt_sol)<=tol) .or. all(abs(vt+vt_sol)<=tol), test//': V^T') + call check(error, all(abs(abs(vt)-abs(vt_sol))<=tol), test//': V^T') if (allocated(error)) return !> [U, S, V^T]. Partial storage -> compare until k=2 columns of U rows of V^T @@ -167,11 +167,11 @@ module test_linalg_svd test = '[U, S, V^T], partial storage' call check(error,state%ok(),test//': '//state%print()) if (allocated(error)) return - call check(error, all(abs(u(:,:2)-u_sol(:,:2))<=tol) .or. all(abs(u(:,:2)+u_sol(:,:2))<=tol), test//': U(:,:2)') + call check(error, all(abs(abs(u(:,:2))-abs(u_sol(:,:2)))<=tol), test//': U(:,:2)') if (allocated(error)) return call check(error, all(abs(s-s_sol)<=tol), test//': S') if (allocated(error)) return - call check(error, all(abs(vt(:2,:)-vt_sol(:2,:))<=tol) .or. all(abs(vt(:2,:)+vt_sol(:2,:))<=tol), test//': V^T(:2,:)') + call check(error, all(abs(abs(vt(:2,:))-abs(vt_sol(:2,:)))<=tol), test//': V^T(:2,:)') if (allocated(error)) return end subroutine test_svd_${ri}$ From b867c2bc40e00becb949870163d6314653500a9c Mon Sep 17 00:00:00 2001 From: Jeremie Vandenplas Date: Sun, 14 Jul 2024 18:17:37 -0400 Subject: [PATCH 4/4] Update .github/workflows/CI.yml --- .github/workflows/CI.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 88c781fbf..97f2fc343 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -139,8 +139,6 @@ jobs: -DCMAKE_INSTALL_PREFIX=$PWD/_dist -DFIND_BLAS:STRING=TRUE -S . -B build_mkl -# -DBLAS_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" -# -DLAPACK_LIBRARIES="/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so" - name: Build and compile with MKL run: cmake --build build_mkl --parallel