From c431f75a4a07e4842e69c7eadc1ff73836dee668 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Wed, 30 Aug 2023 17:38:52 -0600 Subject: [PATCH 1/6] Fix BLAS++ and LAPACK++ build --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b281d6045..d688386f8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,7 +477,7 @@ if (BLAS++) include(ExternalProject) ExternalProject_Add(blaspp URL https://bitbucket.org/icl/blaspp/downloads/blaspp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) @@ -490,7 +490,7 @@ if (LAPACK++) if (BUILD_SHARED_LIBS) ExternalProject_Add(lapackpp URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) @@ -498,7 +498,7 @@ if (LAPACK++) # FIXME this does not really work as the libraries list gets converted to a semicolon-separated list somewhere in the lapack++ build files ExternalProject_Add(lapackpp URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp + CONFIGURE_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp BUILD_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . ) From 9ff5e49ed192e866ac4d670b5d60da7fe9fbc5c8 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Thu, 31 Aug 2023 15:02:13 -0600 Subject: [PATCH 2/6] Add test to the CI for BLAS++ and LAPACK++ flags --- .github/workflows/cmake.yml | 88 +++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 9a9fb4a7e5..c680b4d7fd 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -151,3 +151,91 @@ jobs: echo "Coverage" cmake --build build --target coverage bash <(curl -s https://codecov.io/bash) -X gcov + + test-blaspp-flag: + runs-on: ubuntu-latest + + env: + BUILD_TYPE: Release + FFLAGS: "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all" + + strategy: + fail-fast: false + matrix: + sharedlib: [ ON, OFF ] + lapackpp: [ ON, OFF ] + + steps: + + - name: Checkout LAPACK + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 + + - name: Install the Basics + # Adding some noise to the system: libopenblas-dev liblapack-dev should not + # be linked to BLAS++ or LAPACK++. + run: | + sudo apt update + sudo apt install -y cmake gfortran + # sudo apt purge libopenblas-dev liblapack-dev + + - name: Configure CMake + run: > + cmake -B build -G Ninja + -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install + -D CBLAS:BOOL=OFF + -D LAPACKE:BOOL=OFF + -D BUILD_TESTING:BOOL=OFF + -D BUILD_SHARED_LIBS:BOOL=${{ matrix.sharedlib }} + -D BLAS++:BOOL=ON + -D LAPACK++:BOOL=${{ matrix.lapackpp }} + + - name: Build + run: cmake --build build --config ${{env.BUILD_TYPE}} + + - name: Check dependencies of BLAS++ + working-directory: ${{github.workspace}}/build + run: | + if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then + blaspp_blas=$(ldd lib/libblaspp.so | grep libblas.so | { grep -v grep || true; }) + if [[ -z $blaspp_blas || "$blaspp_blas" != *"${{github.workspace}}/build"* ]]; then + echo "BLAS++ dependency to BLAS is not correct!" + echo "ldd lib/libblaspp.so:" + ldd lib/libblaspp.so + exit 1 + fi + else + blaspp_blas=$(cat lib/blaspp/blasppConfig.cmake | grep -lblas | { grep -v grep || true; }) + if [[ -z $blaspp_blas ]]; then + echo "BLAS++ dependency to BLAS is not correct!" + echo "We could not find -lblas in lib/blaspp/blasppConfig.cmake" + exit 1 + fi + fi + + - name: Check dependencies when LAPACK++ is ON + if: ${{ matrix.lapackpp == 'ON' }} + working-directory: ${{github.workspace}}/build + run: | + if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then + lapackpp_lapack=$(ldd lib/liblapackpp.so | grep liblapack.so | { grep -v grep || true; }) + if [[ -z $lapackpp_lapack || $lapackpp_lapack != *"${{github.workspace}}/build"* ]]; then + echo "LAPACK++ dependency to LAPACK is not correct!" + echo "ldd lib/liblapackpp.so:" + ldd lib/liblapackpp.so + exit 1 + fi + else + lapackpp_lapack=$(cat lib/lapackpp/lapackppConfig.cmake | grep -llapack | { grep -v grep || true; }) + if [[ -z $lapackpp_lapack ]]; then + echo "LAPACK++ dependency to LAPACK is not correct!" + echo "We could not find -llapack in lib/lapackpp/lapackppConfig.cmake" + exit 1 + fi + fi + + - name: Install + run: cmake --build build --target install -j2 From 35c78b79de862aed7fe42f5aeb73309ef7cb99b1 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Tue, 5 Sep 2023 09:11:56 -0600 Subject: [PATCH 3/6] Try to fix BLAS++ and LAPACK++ installation so that the tests pass --- .github/workflows/cmake.yml | 51 ++++-------- CMakeLists.txt | 149 +++++++++++++++++++++++++----------- 2 files changed, 117 insertions(+), 83 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c680b4d7fd..b4ac8164b9 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -163,7 +163,7 @@ jobs: fail-fast: false matrix: sharedlib: [ ON, OFF ] - lapackpp: [ ON, OFF ] + lapackpp: [ OFF ] steps: @@ -179,7 +179,7 @@ jobs: run: | sudo apt update sudo apt install -y cmake gfortran - # sudo apt purge libopenblas-dev liblapack-dev + sudo apt purge libopenblas-dev liblapack-dev - name: Configure CMake run: > @@ -199,42 +199,19 @@ jobs: - name: Check dependencies of BLAS++ working-directory: ${{github.workspace}}/build run: | - if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then - blaspp_blas=$(ldd lib/libblaspp.so | grep libblas.so | { grep -v grep || true; }) - if [[ -z $blaspp_blas || "$blaspp_blas" != *"${{github.workspace}}/build"* ]]; then - echo "BLAS++ dependency to BLAS is not correct!" - echo "ldd lib/libblaspp.so:" - ldd lib/libblaspp.so - exit 1 - fi - else - blaspp_blas=$(cat lib/blaspp/blasppConfig.cmake | grep -lblas | { grep -v grep || true; }) - if [[ -z $blaspp_blas ]]; then - echo "BLAS++ dependency to BLAS is not correct!" - echo "We could not find -lblas in lib/blaspp/blasppConfig.cmake" - exit 1 - fi + blaspp_blas=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/libblas" | { grep -v grep || true; }) + echo "blaspp_blas: $blaspp_blas" + if [[ -z $blaspp_blas ]]; then + echo "BLAS++ dependency to BLAS is not correct!" + echo "CMake could not find ${{github.workspace}}/build/lib/libblas in lib/cmake/blaspp/blasppConfig.cmake" + exit 1 fi - - - name: Check dependencies when LAPACK++ is ON - if: ${{ matrix.lapackpp == 'ON' }} - working-directory: ${{github.workspace}}/build - run: | - if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then - lapackpp_lapack=$(ldd lib/liblapackpp.so | grep liblapack.so | { grep -v grep || true; }) - if [[ -z $lapackpp_lapack || $lapackpp_lapack != *"${{github.workspace}}/build"* ]]; then - echo "LAPACK++ dependency to LAPACK is not correct!" - echo "ldd lib/liblapackpp.so:" - ldd lib/liblapackpp.so - exit 1 - fi - else - lapackpp_lapack=$(cat lib/lapackpp/lapackppConfig.cmake | grep -llapack | { grep -v grep || true; }) - if [[ -z $lapackpp_lapack ]]; then - echo "LAPACK++ dependency to LAPACK is not correct!" - echo "We could not find -llapack in lib/lapackpp/lapackppConfig.cmake" - exit 1 - fi + blaspp_lapack=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/liblapack" | { grep -v grep || true; }) + echo "blaspp_lapack: $blaspp_lapack" + if [[ -z $blaspp_lapack ]]; then + echo "BLAS++ dependency to LAPACK is not correct!" + echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in lib/cmake/blaspp/blasppConfig.cmake" + exit 1 fi - name: Install diff --git a/CMakeLists.txt b/CMakeLists.txt index d688386f8d..0701dedf6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.11) +# VERSION 3.11: FetchContent project(LAPACK Fortran C) @@ -10,6 +11,19 @@ set( ${LAPACK_MAJOR_VERSION}.${LAPACK_MINOR_VERSION}.${LAPACK_PATCH_VERSION} ) +# Dependencies on other projects +include(FetchContent) +FetchContent_Declare( + blaspp + GIT_REPOSITORY https://github.com/icl-utk-edu/blaspp + GIT_TAG f8f983d5b45a8f366aae41fbe9888b14cbae20f8 # v2023.08.25 +) +FetchContent_Declare( + lapackpp + GIT_REPOSITORY https://github.com/icl-utk-edu/lapackpp + GIT_TAG 62680a16a9aba2a426e3d089dd13e18bfd140c74 # v2023.08.25 +) + # Allow setting a prefix for the library names set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") set(CMAKE_SHARED_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") @@ -472,38 +486,86 @@ function(_display_cpp_implementation_msg name) message(STATUS "For support ${name}++ related question, please email: slate-user@icl.utk.edu") message(STATUS "----------------") endfunction() -if (BLAS++) - _display_cpp_implementation_msg("BLAS") - include(ExternalProject) - ExternalProject_Add(blaspp - URL https://bitbucket.org/icl/blaspp/downloads/blaspp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . - ) - ExternalProject_Add_StepDependencies(blaspp build ${BLAS_LIBRARIES}) + +if (BLAS++ OR LAPACK++) + + if (BLAS++) + _display_cpp_implementation_msg("BLAS") + endif() + + # Check if population has already been performed + FetchContent_GetProperties(blaspp) + if(NOT blaspp_POPULATED) + # Fetch the content using previously declared details + FetchContent_Populate(blaspp) + endif() + + # For static builds, we may need to link against a Fortran library + set(BLAS_Fortran_LIB "") + if (NOT BLAS_FOUND AND NOT BUILD_SHARED_LIBS) + if (CMAKE_Fortran_COMPILER_ID MATCHES GNU) + set(BLAS_Fortran_LIB ";-lgfortran") + else() + # TODO: This is incomplete. Fill in the other cases. + set(BLAS_Fortran_LIB "") + endif() + endif() + + # Adds target blaspp + add_custom_target( blaspp ALL + COMMAND ${CMAKE_COMMAND} + -B "${blaspp_BINARY_DIR}" + -D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}" + -D blas_libraries_cached="" + "-DBLAS_LIBRARIES=\"$,${BLAS_LIBRARIES},$>${BLAS_Fortran_LIB}\"" + -D lapack_libraries_cached="" + "-DLAPACK_LIBRARIES=\"$,${LAPACK_LIBRARIES},$>\"" + -D build_tests=OFF + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} + COMMAND ${CMAKE_COMMAND} + --build "${blaspp_BINARY_DIR}" + --target install + WORKING_DIRECTORY "${blaspp_SOURCE_DIR}" + COMMENT "Building BLAS++" + ) + + # Set up dependencies + if(NOT BLAS_FOUND) + add_dependencies(blaspp ${BLASLIB}) + endif() + if(NOT LATESTLAPACK_FOUND) + add_dependencies(blaspp ${LAPACKLIB}) + endif() endif() + if (LAPACK++) - message (STATUS "linking lapack++ against ${LAPACK_LIBRARIES}") _display_cpp_implementation_msg("LAPACK") - include(ExternalProject) - if (BUILD_SHARED_LIBS) - ExternalProject_Add(lapackpp - URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . - ) - else () -# FIXME this does not really work as the libraries list gets converted to a semicolon-separated list somewhere in the lapack++ build files - ExternalProject_Add(lapackpp - URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz - CONFIGURE_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -Dbuild_tests=OFF -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp - BUILD_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . - ) + + # Check if population has already been performed + FetchContent_GetProperties(lapackpp) + if(NOT lapackpp_POPULATED) + # Fetch the content using previously declared details + FetchContent_Populate(lapackpp) endif() - ExternalProject_Add_StepDependencies(lapackpp build blaspp ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) + + # Adds target lapackpp + add_custom_target( lapackpp ALL + COMMAND ${CMAKE_COMMAND} + -B "${lapackpp_BINARY_DIR}" + -D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}" + -D lapack_libraries_cached="" + "-DLAPACK_LIBRARIES=\"$,${LAPACK_LIBRARIES},$>\"" + -D build_tests=OFF + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} + COMMAND ${CMAKE_COMMAND} + --build "${lapackpp_BINARY_DIR}" + --target install + WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}" + COMMENT "Building LAPACK++" + ) + + # Set up dependencies + add_dependencies(lapackpp blaspp) endif() # -------------------------------------------------- @@ -617,41 +679,36 @@ if (LAPACK++) DESTINATION ${CMAKE_INSTALL_LIBDIR} FILES_MATCHING REGEX "liblapackpp.(a|so)$" ) - install( - DIRECTORY "${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp/include/" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING REGEX "\\.(h|hh)$" - ) write_basic_package_version_file( "lapackppConfigVersion.cmake" - VERSION 2020.10.02 + VERSION 2023.08.25 COMPATIBILITY AnyNewerVersion ) install( - FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfigVersion.cmake" + FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/" ) endif() if (BLAS++) + install( + DIRECTORY "${LAPACK_BINARY_DIR}/lib/" + DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILES_MATCHING REGEX "libblaspp.(a|so)$" + ) write_basic_package_version_file( "blasppConfigVersion.cmake" - VERSION 2020.10.02 + VERSION 2023.08.25 COMPATIBILITY AnyNewerVersion ) install( - FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfigVersion.cmake" + FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/" ) install( - DIRECTORY "${LAPACK_BINARY_DIR}/lib/" - DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILES_MATCHING REGEX "libblaspp.(a|so)$" - ) - install( - DIRECTORY "${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp/include/" + DIRECTORY "${PROJECT_BINARY_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" FILES_MATCHING REGEX "\\.(h|hh)$" ) From 680cfd8b6bc767c7357885b0f20526edfbbd2432 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Fri, 8 Sep 2023 12:32:31 -0600 Subject: [PATCH 4/6] More changes to improve flags BLAS++ and LAPACK++ --- .github/workflows/cmake.yml | 53 ++++++++++------ CMakeLists.txt | 122 +++++++++++++++++++++++++----------- 2 files changed, 118 insertions(+), 57 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index b4ac8164b9..9da2645a14 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -162,8 +162,13 @@ jobs: strategy: fail-fast: false matrix: - sharedlib: [ ON, OFF ] + sharedlib: [ OFF, ON ] lapackpp: [ OFF ] + optblas: [ OFF, ON ] + optlapack: [ OFF, ON ] + exclude: + - optblas: ON + optlapack: ON steps: @@ -174,12 +179,9 @@ jobs: uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 - name: Install the Basics - # Adding some noise to the system: libopenblas-dev liblapack-dev should not - # be linked to BLAS++ or LAPACK++. run: | sudo apt update - sudo apt install -y cmake gfortran - sudo apt purge libopenblas-dev liblapack-dev + sudo apt install -y cmake gfortran libopenblas-dev - name: Configure CMake run: > @@ -192,26 +194,39 @@ jobs: -D BUILD_SHARED_LIBS:BOOL=${{ matrix.sharedlib }} -D BLAS++:BOOL=ON -D LAPACK++:BOOL=${{ matrix.lapackpp }} + -D USE_OPTIMIZED_BLAS:BOOL=${{ matrix.optblas }} + -D USE_OPTIMIZED_LAPACK:BOOL=${{ matrix.optlapack }} - name: Build run: cmake --build build --config ${{env.BUILD_TYPE}} - - name: Check dependencies of BLAS++ + - name: Check dependencies of BLAS++ on BLAS and LAPACK working-directory: ${{github.workspace}}/build run: | - blaspp_blas=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/libblas" | { grep -v grep || true; }) - echo "blaspp_blas: $blaspp_blas" - if [[ -z $blaspp_blas ]]; then - echo "BLAS++ dependency to BLAS is not correct!" - echo "CMake could not find ${{github.workspace}}/build/lib/libblas in lib/cmake/blaspp/blasppConfig.cmake" - exit 1 - fi - blaspp_lapack=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/liblapack" | { grep -v grep || true; }) - echo "blaspp_lapack: $blaspp_lapack" - if [[ -z $blaspp_lapack ]]; then - echo "BLAS++ dependency to LAPACK is not correct!" - echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in lib/cmake/blaspp/blasppConfig.cmake" - exit 1 + configFile="lib/cmake/blaspp/blasppConfig.cmake" + if [[ ${{ matrix.optblas }} == 'ON' || ${{ matrix.optlapack }} == 'ON' ]]; then + if grep -q "openblas" $configFile; then + echo "BLAS++ dependency to openblas is correct." + else + echo "CMake could not find openblas in $configFile:" + cat $configFile + exit 1 + fi + else + if grep -q "${{github.workspace}}/build/lib/libblas" $configFile; then + echo "BLAS++ dependency to BLAS is correct." + else + echo "CMake could not find ${{github.workspace}}/build/lib/libblas in $configFile:" + cat $configFile + exit 1 + fi + if grep -q "${{github.workspace}}/build/lib/liblapack" $configFile; then + echo "BLAS++ dependency to LAPACK is correct." + else + echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in $configFile:" + cat $configFile + exit 1 + fi fi - name: Install diff --git a/CMakeLists.txt b/CMakeLists.txt index 0701dedf6c..8effd6c325 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -512,21 +512,55 @@ if (BLAS++ OR LAPACK++) endif() # Adds target blaspp - add_custom_target( blaspp ALL + add_custom_target( blaspp ALL DEPENDS blaspp-cmd ) + add_custom_command( OUTPUT blaspp-cmd + WORKING_DIRECTORY "${blaspp_SOURCE_DIR}" + COMMENT "Building BLAS++" ) + + # Set up information about the BLAS and LAPACK libraries + if(NOT BLAS_FOUND) + if(NOT LATESTLAPACK_FOUND) + add_custom_command( OUTPUT blaspp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${blaspp_BINARY_DIR}" + -D BLAS_LIBRARIES="$${BLAS_Fortran_LIB}" + -D LAPACK_LIBRARIES="$" ) + else() + add_custom_command( OUTPUT blaspp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${blaspp_BINARY_DIR}" + -D BLAS_LIBRARIES="$${BLAS_Fortran_LIB}" + -D LAPACK_LIBRARIES="${LAPACK_LIBRARIES}" ) + endif() + else() + if(NOT LATESTLAPACK_FOUND) + add_custom_command( OUTPUT blaspp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${blaspp_BINARY_DIR}" + -D BLAS_LIBRARIES="${BLAS_LIBRARIES}" + -D LAPACK_LIBRARIES="$${BLAS_Fortran_LIB}" ) + else() + add_custom_command( OUTPUT blaspp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${blaspp_BINARY_DIR}" + -D BLAS_LIBRARIES="${BLAS_LIBRARIES}" + -D LAPACK_LIBRARIES="${LAPACK_LIBRARIES}" ) + endif() + endif() + + # Setup remaining configuration options and installation + add_custom_command( OUTPUT blaspp-cmd APPEND COMMAND ${CMAKE_COMMAND} - -B "${blaspp_BINARY_DIR}" - -D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}" - -D blas_libraries_cached="" - "-DBLAS_LIBRARIES=\"$,${BLAS_LIBRARIES},$>${BLAS_Fortran_LIB}\"" - -D lapack_libraries_cached="" - "-DLAPACK_LIBRARIES=\"$,${LAPACK_LIBRARIES},$>\"" - -D build_tests=OFF - -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} + -B "${blaspp_BINARY_DIR}" + -D CMAKE_INSTALL_PREFIX="${blaspp_BINARY_DIR}" + -D CMAKE_INSTALL_LIBDIR="${PROJECT_BINARY_DIR}/lib" + -D blas_libraries_cached="" + -D lapack_libraries_cached="" + -D build_tests=OFF + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} COMMAND ${CMAKE_COMMAND} --build "${blaspp_BINARY_DIR}" --target install - WORKING_DIRECTORY "${blaspp_SOURCE_DIR}" - COMMENT "Building BLAS++" ) # Set up dependencies @@ -549,19 +583,36 @@ if (LAPACK++) endif() # Adds target lapackpp - add_custom_target( lapackpp ALL - COMMAND ${CMAKE_COMMAND} + add_custom_target( lapackpp ALL DEPENDS lapackpp-cmd ) + add_custom_command( OUTPUT lapackpp-cmd + WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}" + COMMENT "Building LAPACK++" ) + + # Set up information about the LAPACK library + if(NOT LATESTLAPACK_FOUND) + add_custom_command( OUTPUT lapackpp-cmd APPEND + COMMAND ${CMAKE_COMMAND} -B "${lapackpp_BINARY_DIR}" - -D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}" - -D lapack_libraries_cached="" - "-DLAPACK_LIBRARIES=\"$,${LAPACK_LIBRARIES},$>\"" - -D build_tests=OFF - -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} + -D LAPACK_LIBRARIES="$${BLAS_Fortran_LIB}" ) + else() + add_custom_command( OUTPUT lapackpp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${lapackpp_BINARY_DIR}" + -D LAPACK_LIBRARIES="${LAPACK_LIBRARIES}" ) + endif() + + # Setup remaining configuration options and installation + add_custom_command( OUTPUT lapackpp-cmd APPEND + COMMAND ${CMAKE_COMMAND} + -B "${lapackpp_BINARY_DIR}" + -D CMAKE_INSTALL_PREFIX="${lapackpp_BINARY_DIR}" + -D CMAKE_INSTALL_LIBDIR="${PROJECT_BINARY_DIR}/lib" + -D lapack_libraries_cached="" + -D build_tests=OFF + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} COMMAND ${CMAKE_COMMAND} --build "${lapackpp_BINARY_DIR}" --target install - WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}" - COMMENT "Building LAPACK++" ) # Set up dependencies @@ -675,14 +726,14 @@ install(FILES ) if (LAPACK++) install( - DIRECTORY "${LAPACK_BINARY_DIR}/lib/" - DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILES_MATCHING REGEX "liblapackpp.(a|so)$" + DIRECTORY "${LAPACK_BINARY_DIR}/lib/" + DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILES_MATCHING REGEX "liblapackpp.(a|so)$" ) - write_basic_package_version_file( - "lapackppConfigVersion.cmake" - VERSION 2023.08.25 - COMPATIBILITY AnyNewerVersion + install( + DIRECTORY "${lapackpp_BINARY_DIR}/include/" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + FILES_MATCHING REGEX "\\.(h|hh)$" ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfig.cmake" @@ -692,23 +743,18 @@ if (LAPACK++) endif() if (BLAS++) - install( - DIRECTORY "${LAPACK_BINARY_DIR}/lib/" - DESTINATION ${CMAKE_INSTALL_LIBDIR} - FILES_MATCHING REGEX "libblaspp.(a|so)$" - ) - write_basic_package_version_file( - "blasppConfigVersion.cmake" - VERSION 2023.08.25 - COMPATIBILITY AnyNewerVersion - ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/" ) install( - DIRECTORY "${PROJECT_BINARY_DIR}/include/" + DIRECTORY "${LAPACK_BINARY_DIR}/lib/" + DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILES_MATCHING REGEX "libblaspp.(a|so)$" + ) + install( + DIRECTORY "${blaspp_BINARY_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" FILES_MATCHING REGEX "\\.(h|hh)$" ) From fa719d38d845c27b8768d1c3a57d61e14d86eaa8 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Fri, 8 Sep 2023 15:34:56 -0600 Subject: [PATCH 5/6] Adds testBLAS tests to the CMake build system --- .github/workflows/cmake.yml | 38 +++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 38 ++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 9da2645a14..61477cb91a 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -231,3 +231,41 @@ jobs: - name: Install run: cmake --build build --target install -j2 + + run-testBLAS: + runs-on: ubuntu-latest + + env: + BUILD_TYPE: Release + FFLAGS: "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all" + + steps: + + - name: Checkout LAPACK + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + + - name: Install ninja-build tool + uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3 + + - name: Install the Basics + run: | + sudo apt update + sudo apt install -y cmake gfortran + + - name: Configure CMake + run: > + cmake -B build -G Ninja + -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install + -D CBLAS:BOOL=OFF + -D LAPACKE:BOOL=OFF + -D BUILD_TESTING:BOOL=OFF + -D BLAS++:BOOL=ON + -D RUN_testBLAS:BOOL=ON + + - name: Build + run: cmake --build build --config ${{env.BUILD_TYPE}} + + - name: Run testBLAS + working-directory: ${{github.workspace}}/build + run: cmake --build . --target run-testBLAS diff --git a/CMakeLists.txt b/CMakeLists.txt index 8effd6c325..c63dcda0d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,11 @@ FetchContent_Declare( GIT_REPOSITORY https://github.com/icl-utk-edu/lapackpp GIT_TAG 62680a16a9aba2a426e3d089dd13e18bfd140c74 # v2023.08.25 ) +FetchContent_Declare( + testBLAS + GIT_REPOSITORY https://github.com/tlapack/testBLAS + GIT_TAG 3693e5feb8cba5b31bc67ab67ef2fd68029331fb # v2023.08.30 +) # Allow setting a prefix for the library names set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") @@ -487,7 +492,7 @@ function(_display_cpp_implementation_msg name) message(STATUS "----------------") endfunction() -if (BLAS++ OR LAPACK++) +if (BLAS++ OR LAPACK++ OR RUN_testBLAS) if (BLAS++) _display_cpp_implementation_msg("BLAS") @@ -557,6 +562,7 @@ if (BLAS++ OR LAPACK++) -D blas_libraries_cached="" -D lapack_libraries_cached="" -D build_tests=OFF + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} COMMAND ${CMAKE_COMMAND} --build "${blaspp_BINARY_DIR}" @@ -609,6 +615,7 @@ if (LAPACK++) -D CMAKE_INSTALL_LIBDIR="${PROJECT_BINARY_DIR}/lib" -D lapack_libraries_cached="" -D build_tests=OFF + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} COMMAND ${CMAKE_COMMAND} --build "${lapackpp_BINARY_DIR}" @@ -853,3 +860,32 @@ if(BUILD_HTML_DOCUMENTATION OR BUILD_MAN_DOCUMENTATION) endif() endif() + +# -------------------------------------------------- +# Run testBLAS tests + +option( RUN_testBLAS "Run testBLAS to test Inf/NaN propagation and corner cases in the BLAS, as proposed in https://arxiv.org/abs/2207.09281" OFF ) + +if(RUN_testBLAS) + # Check if population has already been performed + FetchContent_GetProperties(testBLAS) + if(NOT testBLAS_POPULATED) + # Fetch the content using previously declared details + FetchContent_Populate(testBLAS) + endif() + + # Create custom target run-testBLAS + add_custom_target( run-testBLAS DEPENDS testBLAS-cmd ) + add_custom_command( OUTPUT testBLAS-cmd + COMMAND ${CMAKE_COMMAND} + -S "${testblas_SOURCE_DIR}" + -B "${testblas_BINARY_DIR}" + -D blaspp_DIR="${blaspp_BINARY_DIR}" + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + COMMAND ${CMAKE_COMMAND} + --build "${testblas_BINARY_DIR}" + --target testBLAS + COMMAND "${testblas_BINARY_DIR}/testBLAS" + WORKING_DIRECTORY "${testblas_BINARY_DIR}" ) + add_dependencies(run-testBLAS blaspp) +endif() From c7d2dc2f0100d745c0ebab93d6e49b7e61d47538 Mon Sep 17 00:00:00 2001 From: Weslley S Pereira Date: Thu, 14 Sep 2023 11:41:23 -0600 Subject: [PATCH 6/6] Improve messages on the testBLAS tester. Also, update BLAS++ and LAPACK++ to add bug fixes. See https://github.com/icl-utk-edu/lapackpp/issues/44. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c63dcda0d0..8757c1a6fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,17 +16,17 @@ include(FetchContent) FetchContent_Declare( blaspp GIT_REPOSITORY https://github.com/icl-utk-edu/blaspp - GIT_TAG f8f983d5b45a8f366aae41fbe9888b14cbae20f8 # v2023.08.25 + GIT_TAG 91dd418fa910498cc03dee397826099914cc3185 # v2023.10.09 ) FetchContent_Declare( lapackpp GIT_REPOSITORY https://github.com/icl-utk-edu/lapackpp - GIT_TAG 62680a16a9aba2a426e3d089dd13e18bfd140c74 # v2023.08.25 + GIT_TAG 88088c33cd9467475e8f139f42d158620f11e64d # v2023.10.09 ) FetchContent_Declare( testBLAS GIT_REPOSITORY https://github.com/tlapack/testBLAS - GIT_TAG 3693e5feb8cba5b31bc67ab67ef2fd68029331fb # v2023.08.30 + GIT_TAG 504ea500b40108b80c6f9134bf6a72cde8795455 # v2023.10.10 ) # Allow setting a prefix for the library names @@ -885,7 +885,7 @@ if(RUN_testBLAS) COMMAND ${CMAKE_COMMAND} --build "${testblas_BINARY_DIR}" --target testBLAS - COMMAND "${testblas_BINARY_DIR}/testBLAS" + COMMAND "${testblas_BINARY_DIR}/testBLAS" --reporter Automake WORKING_DIRECTORY "${testblas_BINARY_DIR}" ) add_dependencies(run-testBLAS blaspp) endif()