From 070022283a8b70feb30d2fce874fd2209e1fbf04 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri Date: Wed, 22 May 2024 13:51:52 -0600 Subject: [PATCH 01/51] added BLAS library specification in build script --- etc/derecho/build_tuvx_derecho_gnu.sh | 24 +++--------------------- etc/derecho/build_tuvx_derecho_intel.sh | 17 ----------------- 2 files changed, 3 insertions(+), 38 deletions(-) mode change 100755 => 100644 etc/derecho/build_tuvx_derecho_gnu.sh mode change 100755 => 100644 etc/derecho/build_tuvx_derecho_intel.sh diff --git a/etc/derecho/build_tuvx_derecho_gnu.sh b/etc/derecho/build_tuvx_derecho_gnu.sh old mode 100755 new mode 100644 index ca383199..73c6818e --- a/etc/derecho/build_tuvx_derecho_gnu.sh +++ b/etc/derecho/build_tuvx_derecho_gnu.sh @@ -3,7 +3,6 @@ # The TUVX_HOME environment variable must be set to the directory to build TUV-x # in prior to calling this script - module purge module load ncarenv/23.09 module load craype/2.7.20 @@ -13,6 +12,7 @@ module load netcdf/4.9.2 module load ncarcompilers/1.0.0 module load cmake/3.26.3 + if [[ -z "${TUVX_HOME}" ]]; then echo "You must set the TUVX_HOME environment variable to the directory where TUV-x should be build." return @@ -23,29 +23,11 @@ if [[ ! -d "${TUVX_HOME}" ]]; then return fi -echo "Building JSON Fortran" - -# get & build the source code of JSON Fortran - -cd ${TUVX_HOME} -curl -LO https://github.com/jacobwilliams/json-fortran/archive/8.3.0.tar.gz -tar -zxvf 8.3.0.tar.gz -cd json-fortran-8.3.0 -mkdir build -cd build -INSTALL_DIR=$TUVX_HOME/json-fortran-8.3.0 -cmake -D SKIP_DOC_GEN:BOOL=TRUE -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR .. -make install - -echo "Building TUV-x" - -# get & build the source code of TUV-x - +# download and build TUV-X cd ${TUVX_HOME} git clone git@github.com:NCAR/tuv-x.git cd tuv-x mkdir build cd build -export JSON_FORTRAN_HOME=$INSTALL_DIR/jsonfortran-gnu-8.3.0 -cmake -D CMAKE_BUILD_TYPE=release -D TUVX_ENABLE_MEMCHECK=OFF -D LAPACK_LIBRARIES=-lsci_gnu .. +cmake -D CMAKE_BUILD_TYPE=release -D TUVX_ENABLE_MEMCHECK=OFF -D LAPACK_LIBRARIES=-lsci_gnu -D BLAS_LIBRARIES=-lsci_gnu .. make -j 8 diff --git a/etc/derecho/build_tuvx_derecho_intel.sh b/etc/derecho/build_tuvx_derecho_intel.sh old mode 100755 new mode 100644 index 2bae2629..303a8f40 --- a/etc/derecho/build_tuvx_derecho_intel.sh +++ b/etc/derecho/build_tuvx_derecho_intel.sh @@ -21,24 +21,7 @@ if [[ ! -d "${TUVX_HOME}" ]]; then return fi -echo "Building JSON Fortran" - -# get & build the source code of JSON Fortran - -cd ${TUVX_HOME} -curl -LO https://github.com/jacobwilliams/json-fortran/archive/8.3.0.tar.gz -tar -zxvf 8.3.0.tar.gz -cd json-fortran-8.3.0 -mkdir build -cd build -INSTALL_DIR=$TUVX_HOME/json-fortran-8.3.0 -cmake -D SKIP_DOC_GEN:BOOL=TRUE -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR .. -make install - -echo "Building TUV-x" - # get & build the source code of TUV-x - cd ${TUVX_HOME} git clone git@github.com:NCAR/tuv-x.git cd tuv-x From 42d8147b83e2dfa7dcd225acdabf0b318aacb53a Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri Date: Thu, 13 Jun 2024 15:33:01 -0600 Subject: [PATCH 02/51] lapacke added in cmake --- cmake/test_util.cmake | 7 +- src/CMakeLists.txt | 134 ++++++++++------------ test/CMakeLists.txt | 2 +- test/unit/linear_algebra/CMakeLists.txt | 1 + test/unit/linear_algebra/test_lapacke.cpp | 7 ++ 5 files changed, 74 insertions(+), 77 deletions(-) create mode 100644 test/unit/linear_algebra/test_lapacke.cpp diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index d77af674..9a9950bc 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -49,9 +49,10 @@ function(create_standard_cxx_test) cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" "${multiValues}" ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) - - target_link_libraries(test_${TEST_NAME} PUBLIC musica::tuvx GTest::gtest_main) - + target_include_directories(test_${TEST_NAME} PUBLIC ${LAPACK_INCLUDE_DIRS}) + target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx GTest::gtest_main) + message(STATUS ${OpenBLAS_INCLUDE_DIRS}) + # link additional libraries foreach(library ${TEST_LIBRARIES}) target_link_libraries(test_${TEST_NAME} PUBLIC ${library}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d7ee4517..bb4e571c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -################################################################################ +# ############################################################################## # Photo-decomp tool source # object library @@ -6,101 +6,89 @@ add_library(tuvx_object OBJECT) target_compile_features(tuvx_object PUBLIC cxx_std_11) -set_target_properties(tuvx_object PROPERTIES - Fortran_MODULE_DIRECTORY ${TUVX_MOD_DIR} -) +set_target_properties(tuvx_object PROPERTIES Fortran_MODULE_DIRECTORY + ${TUVX_MOD_DIR}) -target_include_directories(tuvx_object - PUBLIC - $ - $ - $ - $ -) +target_include_directories( + tuvx_object + PUBLIC $ + $ + $ + $) message(STATUS "blas libraries: ${BLAS_LIBRARIES}") message(STATUS "lapack libraries: ${LAPACK_LIBRARIES}") -target_link_libraries(tuvx_object - PRIVATE - PkgConfig::netcdff - PkgConfig::netcdfc - yaml-cpp::yaml-cpp -) +target_link_libraries(tuvx_object PRIVATE PkgConfig::netcdff PkgConfig::netcdfc + yaml-cpp::yaml-cpp) if(BLAS_LIBRARIES) - target_link_libraries(tuvx_object - PRIVATE - ${BLAS_LIBRARIES} - ) + target_link_libraries(tuvx_object PRIVATE ${BLAS_LIBRARIES}) else() message(FATAL_ERROR "BLAS Libraries not found.") endif() if(LAPACK_LIBRARIES) - target_link_libraries(tuvx_object - PRIVATE - ${LAPACK_LIBRARIES} - ) + target_link_libraries(tuvx_object PRIVATE ${LAPACK_LIBRARIES} LAPACK::LAPACK) else() message(FATAL_ERROR "LAPACK libraries not found.") endif() - # tuvx library add_library(tuvx $) add_library(musica::tuvx ALIAS tuvx) -set_target_properties(tuvx PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${TUVX_LIB_DIR} - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} -) +set_target_properties( + tuvx + PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${TUVX_LIB_DIR} + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) -target_link_libraries(tuvx - PRIVATE - tuvx_object -) +target_link_libraries(tuvx PRIVATE tuvx_object) -message(STATUS "TUV-x build include directories: ${TUVX_MOD_DIR};${CMAKE_CURRENT_SOURCE_DIR}/../include") -message(STATUS "TUV-x install include directories: ${TUVX_INSTALL_MOD_DIR};${TUVX_INSTALL_INCLUDE_DIR}") -target_include_directories(tuvx - PUBLIC - $ - $ - $ - $ +message( + STATUS + "TUV-x build include directories: ${TUVX_MOD_DIR};${CMAKE_CURRENT_SOURCE_DIR}/../include" ) - -target_sources(tuvx_object - PRIVATE - constants.F90 - core.F90 - cross_section.F90 - cross_section_factory.F90 - cross_section_warehouse.F90 - diagnostic_util.F90 - dose_rates.F90 - grid.F90 - grid_factory.F90 - grid_warehouse.F90 - heating_rates.F90 - interpolate.F90 - la_sr_bands.F90 - linear_algebra.F90 - netcdf.F90 - output.F90 - photolysis_rates.F90 - profile.F90 - profile_factory.F90 - profile_warehouse.F90 - quantum_yield.F90 - quantum_yield_factory.F90 - spectral_weight.F90 - spectral_weight_factory.F90 - spherical_geometry.F90 - util.F90 +message( + STATUS + "TUV-x install include directories: ${TUVX_INSTALL_MOD_DIR};${TUVX_INSTALL_INCLUDE_DIR}" ) +target_include_directories( + tuvx + PUBLIC $ + $ + $ + $) + +target_sources( + tuvx_object + PRIVATE constants.F90 + core.F90 + cross_section.F90 + cross_section_factory.F90 + cross_section_warehouse.F90 + diagnostic_util.F90 + dose_rates.F90 + grid.F90 + grid_factory.F90 + grid_warehouse.F90 + heating_rates.F90 + interpolate.F90 + la_sr_bands.F90 + linear_algebra.F90 + netcdf.F90 + output.F90 + photolysis_rates.F90 + profile.F90 + profile_factory.F90 + profile_warehouse.F90 + quantum_yield.F90 + quantum_yield_factory.F90 + spectral_weight.F90 + spectral_weight_factory.F90 + spherical_geometry.F90 + util.F90) add_subdirectory(cross_sections) add_subdirectory(grids) @@ -110,4 +98,4 @@ add_subdirectory(quantum_yields) add_subdirectory(radiative_transfer) add_subdirectory(spectral_weights) add_subdirectory(util) -################################################################################ +# ############################################################################## diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a61c517e..52649f39 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,7 +2,7 @@ # Test utilities add_library(tuvx_test_utils unit/test_utils.F90) -target_link_libraries(tuvx_test_utils musica::tuvx) +target_link_libraries(tuvx_test_utils PUBLIC LAPACK::LAPACK musica::tuvx) set_target_properties(tuvx_test_utils PROPERTIES Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/test_include diff --git a/test/unit/linear_algebra/CMakeLists.txt b/test/unit/linear_algebra/CMakeLists.txt index 436ce7a6..df88a27f 100644 --- a/test/unit/linear_algebra/CMakeLists.txt +++ b/test/unit/linear_algebra/CMakeLists.txt @@ -9,5 +9,6 @@ include(test_util) create_standard_cxx_test(NAME tridiagonal_solver SOURCES test_tridiagonal_solver.cpp) create_standard_cxx_test(NAME error_function SOURCES test_error_function.cpp) +create_standard_cxx_test(NAME lapacke SOURCES test_lapacke.cpp) # ############################################################################## diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp new file mode 100644 index 00000000..21fe32b6 --- /dev/null +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -0,0 +1,7 @@ +#include + +#include + +TEST(TestLapacke, SinglePrecision) +{ +} From c2d6472874e56aa5310888af253f79aa7ef98673 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri Date: Mon, 17 Jun 2024 15:32:54 -0600 Subject: [PATCH 03/51] added google benchmark --- CMakeLists.txt | 114 +++++++++------- benchmark/CMakeLists.txt | 12 ++ cmake/benchmark_util.cmake | 17 +++ cmake/dependencies.cmake | 12 +- test/benchmark/linalg/benchmark_tridiag.cpp | 0 test/unit/linear_algebra/test_lapacke.cpp | 124 +++++++++++++++++- .../test_tridiagonal_solver.cpp | 46 ++++++- .../double_precision_errors.png | Bin 0 -> 20711 bytes .../double_precision_times.png | Bin 0 -> 21022 bytes .../lapacke_double_precision.dat | 5 + .../lapacke_single_precision.dat | 5 + .../tridiagonal_solver/plot_analysis.jl | 59 +++++++++ .../single_precision_errors.png | Bin 0 -> 24701 bytes .../single_precision_times.png | Bin 0 -> 20928 bytes .../tuvx_double_precision.dat | 5 + .../tuvx_single_precision.dat | 5 + 16 files changed, 345 insertions(+), 59 deletions(-) create mode 100644 benchmark/CMakeLists.txt create mode 100644 cmake/benchmark_util.cmake delete mode 100644 test/benchmark/linalg/benchmark_tridiag.cpp create mode 100644 tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/double_precision_times.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat create mode 100644 tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat create mode 100644 tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl create mode 100644 tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/single_precision_times.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat create mode 100644 tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat diff --git a/CMakeLists.txt b/CMakeLists.txt index 2508e8ae..db2d537b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -################################################################################ +# ############################################################################## # Preamble cmake_minimum_required(VERSION 3.17) @@ -6,23 +6,29 @@ cmake_minimum_required(VERSION 3.17) project( tuv-x VERSION 0.8.0 - LANGUAGES Fortran CXX C -) + LANGUAGES Fortran CXX C) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake") -set(CMAKE_USER_MAKE_RULES_OVERRIDE "${PROJECT_SOURCE_DIR}/cmake/set_defaults.cmake") +set(CMAKE_USER_MAKE_RULES_OVERRIDE + "${PROJECT_SOURCE_DIR}/cmake/set_defaults.cmake") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING - "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." - FORCE) + set(CMAKE_BUILD_TYPE + "Release" + CACHE + STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) endif(NOT CMAKE_BUILD_TYPE) -message ( STATUS "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}" ) +message( + STATUS + "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}" +) -if(${CMAKE_VERSION} VERSION_LESS "3.21") +if(${CMAKE_VERSION} VERSION_LESS "3.21") if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_TOP_LEVEL TRUE) else() @@ -30,26 +36,33 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -################################################################################ +# ############################################################################## # Projet wide setup options include(CMakeDependentOption) option(TUVX_ENABLE_MPI "Enable MPI parallel support" OFF) -cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF "TUVX_ENABLE_MPI" OFF) +cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF + "TUVX_ENABLE_MPI" OFF) option(TUVX_ENABLE_TESTS "Build tests" ON) option(TUVX_ENABLE_COVERAGE "Enable code coverage output" OFF) option(TUVX_ENABLE_MEMCHECK "Enable memory checking in tests" OFF) option(TUVX_ENABLE_NC_CONFIG "Use nc-config to determine NetCDF libraries" OFF) option(TUVX_ENABLE_REGRESSION_TESTS "Enable regression tests" ON) option(TUVX_BUILD_DOCS "Build the documentation" OFF) -set(TUVX_MOD_DIR "${PROJECT_BINARY_DIR}/include" CACHE PATH "Directory to find Fortran module files during the build") -set(TUVX_INSTALL_MOD_DIR "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "Directory to install Fortran module files") -set(TUVX_INSTALL_INCLUDE_DIR "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "Directory to install include files") +set(TUVX_MOD_DIR + "${PROJECT_BINARY_DIR}/include" + CACHE PATH "Directory to find Fortran module files during the build") +set(TUVX_INSTALL_MOD_DIR + "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" + CACHE PATH "Directory to install Fortran module files") +set(TUVX_INSTALL_INCLUDE_DIR + "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" + CACHE PATH "Directory to install include files") # Set up include and lib directories set(TUVX_LIB_DIR "${PROJECT_BINARY_DIR}/lib") include(GNUInstallDirs) -set(INSTALL_PREFIX "tuvx-${PROJECT_VERSION}" ) +set(INSTALL_PREFIX "tuvx-${PROJECT_VERSION}") # Compiler specific flags if(${CMAKE_Fortran_COMPILER_ID} MATCHES "NAG") @@ -66,21 +79,27 @@ if(TUVX_ENABLE_MPI) endif() # copy data -if (TUVX_ENABLE_TESTS) - add_custom_target(copy-data ALL COMMAND ${CMAKE_COMMAND} - -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/data ${CMAKE_BINARY_DIR}/data) - add_custom_target(copy-tool ALL COMMAND ${CMAKE_COMMAND} - -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/tool ${CMAKE_BINARY_DIR}/tool) - add_custom_target(copy-examples ALL COMMAND ${CMAKE_COMMAND} - -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) +if(TUVX_ENABLE_TESTS) + add_custom_target( + copy-data ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/data + ${CMAKE_BINARY_DIR}/data) + add_custom_target( + copy-tool ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/tool + ${CMAKE_BINARY_DIR}/tool) + add_custom_target( + copy-examples ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -################################################################################ +# ############################################################################## # Dependencies include(cmake/dependencies.cmake) -################################################################################ +# ############################################################################## # TUV-x targets add_subdirectory(src) @@ -90,43 +109,31 @@ configure_file(src/version.F90.in version.F90 @ONLY) add_executable(tuv-x src/tuvx.F90 version.F90) -set_target_properties(tuv-x - PROPERTIES - LINKER_LANGUAGE Fortran -) +set_target_properties(tuv-x PROPERTIES LINKER_LANGUAGE Fortran) if(NOT BUILD_SHARED_LIBS) - set_target_properties(tuv-x - PROPERTIES - POSITION_INDEPENDENT_CODE ON - ) + set_target_properties(tuv-x PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(tuv-x - PUBLIC - musica::tuvx - yaml-cpp::yaml-cpp - ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} -) +target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp + ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) -target_include_directories(tuv-x - PUBLIC - $ - $) +target_include_directories( + tuv-x PUBLIC $ + $) if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -################################################################################ +# ############################################################################## # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -################################################################################ +# ############################################################################## # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -135,18 +142,23 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) include(CodeCoverage) if(${CMAKE_Fortran_COMPILER_ID} MATCHES "GNU") setup_target_for_coverage_lcov( - NAME coverage - EXECUTABLE "ctest" - EXCLUDE "${PROJECT_SOURCE_DIR}/test/*" - BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src") + NAME + coverage + EXECUTABLE + "ctest" + EXCLUDE + "${PROJECT_SOURCE_DIR}/test/*" + BASE_DIRECTORY + "${PROJECT_SOURCE_DIR}/src") endif() endif() enable_testing() add_subdirectory(test) + add_subdirectory(benchmark) endif() -################################################################################ +# ############################################################################## # Packaging # only include packaging if we are the top level project being built @@ -154,4 +166,4 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -################################################################################ \ No newline at end of file +# ############################################################################## diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt new file mode 100644 index 00000000..f90b063a --- /dev/null +++ b/benchmark/CMakeLists.txt @@ -0,0 +1,12 @@ +# ############################################################################## +# Benchmark utilities + +include(benchmark_utils) + +# ############################################################################## +# tests + +create_standard_cxx_benchmark(NAME tridiagonal_solver SOURCES + benchmark_tridiagonal_solver.cpp) + +# ############################################################################## diff --git a/cmake/benchmark_util.cmake b/cmake/benchmark_util.cmake new file mode 100644 index 00000000..be3f30da --- /dev/null +++ b/cmake/benchmark_util.cmake @@ -0,0 +1,17 @@ +function(create_standard_cxx_benchmark) + set(prefix BENCHMARK) + set(optionalValues SKIP_MEMCHECK) + + include(CMakeParseArguments) + cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" + "${multiValues}" ${ARGN}) + + add_executable(benchmark_${BENCHMARK_NAME} ${BENCHMARK_SOURCES}) + target_include_directories(benchmark_${BENCHMARK_NAME} + PUBLIC ${LAPACK_INCLUDE_DIRS}) + target_link_libraries(benchmark_${BENCHMARK_NAME} + PUBLIC LAPACK::LAPACK musica::tuvx benchmark::benchmark) + + # add_tuvx_test(${BENCHMARK_NAME} benchmark_${BENCHMARK_NAME} "" + # ${BENCHMARK_WORKING_DIRECTORY} ${BENCHMARK_SKIP_MEMCHECK}) +endfunction(create_standard_cxx_benchmark) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 29371bed..6aa14bb9 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -83,9 +83,19 @@ if(TUVX_ENABLE_TESTS) OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(googletest) + # google benchmark + + FetchContent_Declare( + googlebenchmark + GIT_REPOSITORY https://github.com/google/benchmark.git + GIT_TAG main) # need main for benchmark::benchmark + + FetchContent_MakeAvailable(googletest googlebenchmark) # don't run clang-tidy on google test set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "") set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() + +# ############################################################################## +# ############################################################################## diff --git a/test/benchmark/linalg/benchmark_tridiag.cpp b/test/benchmark/linalg/benchmark_tridiag.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp index 21fe32b6..d0afedb1 100644 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -1,7 +1,129 @@ +#include + #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + +using namespace tuvx; +using std::chrono::duration; +using std::chrono::duration_cast; +using std::chrono::high_resolution_clock; +using std::chrono::milliseconds; + +typedef TridiagonalMatrix trid_matd; +typedef std::vector vecd; -TEST(TestLapacke, SinglePrecision) +typedef TridiagonalMatrix trid_matf; +typedef std::vector vecf; + +const double tol_dp = std::numeric_limits::epsilon(); +const float tol_sp = std::numeric_limits::epsilon(); + +/// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. +/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// compute $b=A \cdot x$, and check if solution is reconstructed +/// accurately using L2 norm (single precision). Check for different +/// sizes to check consistency +TEST(LapackeTest, SinglePrecision) { + std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + vecf errors(5); + vecd times(5); + + for (std::size_t i = 0; i < 5; i++) + { + vecf x(sizes[i]); + vecf b(sizes[i]); + trid_matf A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); + + auto clock_start = high_resolution_clock::now(); + LAPACKE_sgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + // to be written to a file + errors[i] = ComputeError(x, b); + times[i] = elapsed_time.count(); + EXPECT_LE(errors[i], tol_sp); + } + + // Open the file for output as text: + std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat"); + for (std::size_t i = 0; i < 5; i++) + { + file << errors[i] << " " << times[i] << std::endl; + } + file.close(); +} + +/// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. +/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// compute $b=A \cdot x$, and check if solution is reconstructed +/// accurately using L2 norm (double precision). Check for different +/// sizes to check consistency +TEST(LapackeTest, DoublePrecision) +{ + std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + + vecd errors(5); + vecd times(5); + for (std::size_t i = 0; i < 5; i++) + { + vecd x(sizes[i]); + vecd b(sizes[i]); + trid_matd A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); + + auto clock_start = high_resolution_clock::now(); + LAPACKE_dgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + errors[i] = ComputeError(x, b); + times[i] = elapsed_time.count(); + + EXPECT_LE(errors[i], tol_dp); + } + + // Open the file for output as text: + std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat"); + for (std::size_t i = 0; i < 5; i++) + { + file << errors[i] << " " << times[i] << std::endl; + } + file.close(); } diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index 8765e40d..f807a268 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -3,13 +3,19 @@ #include #include +#include #include #include #include +#include #include #include using namespace tuvx; +using std::chrono::duration; +using std::chrono::duration_cast; +using std::chrono::high_resolution_clock; +using std::chrono::milliseconds; typedef TridiagonalMatrix trid_matd; typedef std::vector vecd; @@ -27,8 +33,10 @@ const float tol_sp = std::numeric_limits::epsilon(); /// sizes to check consistency TEST(TridiagSolveTest, SinglePrecision) { - std::size_t sizes[5] = { 5, 10, 1000, 100000, 10000000 }; + std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; float error = 0; + vecd errors(5); + vecd times(5); for (std::size_t i = 0; i < 5; i++) { vecf x(sizes[i]); @@ -39,10 +47,22 @@ TEST(TridiagSolveTest, SinglePrecision) FillRandom(x); b = Dot(A, x); + auto clock_start = high_resolution_clock::now(); vecf x_approx = Solve(A, b); - error = ComputeError(x, x_approx); + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + errors[i] = ComputeError(x, x_approx); + times[i] = elapsed_time.count(); + EXPECT_LE(error, tol_sp); } + // Open the file for output as text: + std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat"); + for (std::size_t i = 0; i < 5; i++) + { + file << errors[i] << " " << times[i] << std::endl; + } } /// @test Tridiagonal Solver Test for Double Precision Floats. @@ -52,8 +72,9 @@ TEST(TridiagSolveTest, SinglePrecision) /// sizes to check consistency TEST(TridiagSolveTest, DoublePrecision) { - std::size_t sizes[5] = { 5, 10, 1000, 100000, 10000000 }; - double error = 0; + std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + vecd errors(5); + vecd times(5); for (std::size_t i = 0; i < 5; i++) { vecd x(sizes[i]); @@ -64,8 +85,21 @@ TEST(TridiagSolveTest, DoublePrecision) FillRandom(x); b = Dot(A, x); + auto clock_start = high_resolution_clock::now(); vecd x_approx = Solve(A, b); - error = ComputeError(x, x_approx); - EXPECT_LE(error, tol_sp); + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + errors[i] = ComputeError(x, x_approx); + times[i] = elapsed_time.count(); + + EXPECT_LE(errors[i], tol_dp); + } + // Open the file for output as text: + std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat"); + for (std::size_t i = 0; i < 5; i++) + { + file << errors[i] << " " << times[i] << std::endl; } + file.close(); } diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c01fa6d885eb7297d01aae230b54b79d74bd60 GIT binary patch literal 20711 zcmeIac{G)O`!=k3SE{W+N@YkinP)<63K=tJ%$S)FnJXJfL}e^Q$Sh@^BbCfl<}pM_ zN#@}>_V@k`YrX5a-`~5|`{(oQ`(EFQYwvwspX>ab=W!h8ab5w+iqgAw9Ns}iMYT&- zMoNW>YNHkv)rJtlM*L(|GoT57Y&DXTmZDmx{O@_$%g0nyj8w8x7u0S&o9w-Qe!phF zz^^xF%jP*0XrySa7zaF0F<0Yre%x{9{iAn$L9B=O?b~O3wqV|P(kM{R`r4*2*1IyQ z_ZgWPFS_|BO*SqMmd=~JIeR}q^tt1zc+T~vpDWj$JFGrMUENU4wV8_QcJ`C55}d>B zIWnWi8-9L%F}K;V#u(8XH*SQ5g-z)NCp>xb@89n# zA(9A1F4KMZC#Qbt!jP@0sp(GIvmK?byn^aC1_s{x;9s{^7H-flx3{-*YP}lxz~HT> zEGGT%m|nj1RZq{dyM62ZMgt8`9zEjmTyi>k^yu6RH5HY^T-PcGtNm+?Zn$gCN1K|N z?Iro`Vd&G}A|E3XMofs0zoM_-r_WzXla`*&&dy#|R@OL&8!KX-I!EmgEOH`@TX43&8j8anu$^15zk z=RMXO|JG-lqkd}DuETsXl9E0|6*aZ}M~`~W|Lk@A-neDkwzf+bC%$GrjfjXSFZZHf zK6B=byQ}NXsV?;ke`kO8x=(iGJQc9fF0_x2ii*0MJkyltvbXw7;JtgwSFT)9QRyna znO@&$AS+wjnk47FFz7#*HkCOWx4z;}oO!#Afk@g)P1oEv;-q`?=1o68KMoF#)}YB_ zhI)E2PVOX9)xz&@+nIj+_~G)i=ZdoIRH5|3?6_+F$j{!A;^Ja*NTyCfdAMw8z}VN} zhZ1WYeZC*>h*b$vS98flaM)N{Y8Tk{evk9!_>&PD+JfbjlaouLzsTG&)m_lm*0yEi zoxs4l5GF}AHMK<1#N_0!U%p^H<<8O?RCtLUKVJR$vlFh)&CM-W(#UA2x5R~>p5CAO z(9q~8>uT5Jfqus z-Ct25ANS!QgQmLr-?0|Six*F@u&|suC9A6HI9TNy6cn_FLHzTVFE^c>62-6!V#VCQ zrmC{3s>UNt*@?^m)FKS1GsRnrCAGHoTa5D7DC(E%GS2r@w=jfgM+a#qI%@{1)q$J43i}j zGqX!lQu}FXqa!1QgoXc3_s9KY;ileq@Zig=tiCdLm+`d|Cr)&Bc4}y7;52f5HGcm1 zaeDs_yWZlk=xFR0QJ0^(OOub;l!m^2`!h3xz5OgErmVD7`{~=l!orS@4ur9zs)y_|0XLR(QsPy#oG{#9( z*bi3uY}>Q6v?PA(*KLj+8aP;9Uf#yW=A~jxX<6B>UAvOv8a{nG&CY()!J+l**YGIL z0|yRhYPN@~$}1}F-m}Nf+}z&9Wqx+nx+wPJ-(Q2(xKa1-?>KWNo#yzZ$jHdt5p^C! z;jdb@xRsSZO`2J{@$329w{Ith=$E;DX>T_uab`brrmm&s2BIO?TTidI;i(`mFE8RJ zJ$(WR$(LkUSHRA}f$MYD*N;t3PWJJs#?QZe{ye5S%b;quhztGj?j7!7T3T9kRMf5` zLd~tMkHk-e%3#Hi9!2!Z!vZ|+1D3A zLkY5D=L(VSc)kQ5qa0z~U+!u3H6v71bSgE*hfe>>ty@A&Qc6nMI1lz!yZ-WCMAEoY zPfH6oE9<4=hb1MVOf08QUtX%b7aDp+UjBg$OEkCf*6x!;Lizfd`*=H+dM`=wnGm;m zGvm0ef!AV^6tiK8*sWicRaGRjUV0(>Yq-kUlAt5PkBEDZ9Fdn}CPzj^anCf;*mma! z5ntPM=bP4r%T~NBC~&c{$((iXD{*P+>WZFvo}BDFP`SbFEQg@re9}%X0fBJh(D-;Q zSN-~G|2hpxBTKjQwT`|0D`a1%6G&G`p@yPQA|jMxMAS#?+B-X=#Lw&vATaSPt58=@ zb{9M(zP|D8QogUovAuh%yjnWCx>{YH8?rVuHgbrFXpf39h`D{vHjs#lMea1D8|{2^ z9kI82_ilD2-nKnU2n9|p4RLXCatOAsj9`Agv<%8qi`@^M0^6J*Utiy9zg>?xlyr2K zkzGQ(21{N45SZfQ<9X~-GBV^35-!dYG_&0jlX$7CL&;GXPw4f zuu1jvEDzATKgr7CD7jqs?D!KI76Z?}VfD#dnTBV_+j4z+9Lch>vXoT0%6|52mTnPq z@AaACT5`zq=g*lW{a*EM-gu|Sd*71jUPM%@=|}F(gY;&&6mrP+eXO}jjw&jTkZP4r z>K54QIXKKI!NZti5;%O>PiM+XNEgYwCNf%Ak;lRB*yo+Rerp^cFGiT582?)>7kb+$oSoW6vX%rCz<`nU9E`!dt(Mx(utx+h^SsiXZ&=VX3F5 z=jrJg6+~^((9nP_Cn6$(zqC$q?k4#ez7L|8CKw97I(+!>((JgT4-*d$kC>R}`r7K& zty{?<$EAZ`WxFLYV%hnCt-MxlDJm+esXZwu5M(kzlCmxczo2#X>iF0gHnmw(tmpFF z6f#DP$j$pdPhwBx=J}ql-9-{%d>li*bLS39X=>{DgG0P1kuKjGV=61p`xznuFcAqz zKx+%%9+JuA$Vj@w*PNZ5u|XzF*tK5WCZeE6U>%Z^l4?GDSYP}eH(fS=O!P_=fi#RuS}1pYx;;Ct zqQYBOw+97q>@7=F-aW&}qoU44lE^^FAw;p?vCTSVZZ~yA+8nv8+OxuJ6Q92S^S$Z1 zjyW-yUQn@^ewC;7%NI|4P4_~#T}7>Y%+~nWSbbU9?cI^l(I{C!8R_ZiI_V0`q0JqS zgVno+hK87VBVXk);&h%U&LU2mt1GPQ1p7TC35&S$r2eUP1Meh*2F_hoetuhxjg9dU z0&?bF2E|UYZkNV1{_HGgu*j42-yJ5a{55@Rd`XEr%64Gjbvm<#Xnt~tUWs!KJA>ye z4byNPXNC3DiS}#*HZnk`dhrchIXR?Be0g$986wF_qb_Bh8VC&J*_!?A^=!W_#;}0TDp0GA-q$ zw1BVoq!O^V(o$11wQ@+sF>9(Z65g?k%L=~b3qw1{{b$dAkY?~?5qlRXAnv)OW~L2j z$rJ%q?()5SNgs*#nI zMN3P|ci5tCq%LBd{&I!ocxw{RhbP*OYb%S79z8;Sd-Y-(5wAe_{pXMIGC)>hVj?g| z{WIY=dGo?vD?&`e{tRB`b*F0c7lr~kpM)8B-8C@Vjy3i6_P%-Z@6Cy?d2^2d44kIA z{#Nf`SEi@7^tOnJ)ja zypIIXGN#X%l$?CYXK-clPiEP0M~*Sj7@{%E79oz^=Y-9Qv@6F}j0mX-JctZu|Lz_Q zt_>&)S>37lY*b4x3Jd$GQ&Bvo_v-^h+{mK<`m;=WF&Y_KEptf<5M$ZtU^*tY_}=C*gX??mv#kbkRS1O7j?L6b@RT{h+NL8C_v$kjm)CG6b&Dl2pW(eWyhS^BPJoxUuBj?2d=8I{wCwV@uUGZ(n3yGC+>IOYoyQ~2Giv3Uw_sa(4u7Os;*SXlA=1-N3=aMt zYDy|CeMYR>{mQZ=I{NTTg%ArF_n$~|oBzq)mI*8bT#g;k`aPj5Wn@WKBJk@>MoP*_ zK|xJvY5!vzL+5Z&BpJY5AZdehE&JFMUwMOixT3mJAeR2j#yjUnb8S65&c%@BSBNAa z-Pf;QkM%n}-{pR+j6GQ?t{fyW&#FE4oU229B)7i4J~D&nTi+wtfLE_x1rq0BD9+E% zfAi)~nfttos;bzza~;l6Z*MqF6qydR?7AF9oFWj(c61^?eU6>>;9goKDf!iM@$#NI zbt*M2?a^)$VE(wcla_yd#SYPTS4MZ~*haO|YHwnC*Wd5mm1_ZjiR$o7=mztu_q~S? zC2szBQop60OpFTM$jPYsM&1`i1|NZB!2W@dJF=8^y(tzXZ>MinVWCj8$rEr1L&L$} z-#*|=)YT6#C5|XFYDiLEKKc31I&;(lNt zLZgafFe3ai3d8_*azC~O?o(!BVy;y?2k9f~fWgXX5f`jRwg~5;Lx)<`TW%(gB$?$V z6&Ek5_s4x)=6uecSw`RcASF8+@3yPE4#*V!^r?YJ3z@tb1dMbK8>Q#MBNQ$0!d7-C zV`f%XKU+OnFgjzGqOJwu%Z|>@!N_SqH_FP*qW~OseHlqfd8kN#C)(>ipKnom`|e%h zNQZV21G(PY$jV?p553sYZFhg|k}Rkqkw}!U^RR#5#a&z0cA!^fc^mz7riJi<;`WbT zf7?6*!S;akUwh_TcRKv|oZ7A~DF;-E`kj=N1UAC+f%NCkAA=DeI!K-BatoD;{#$6Gc%vXOpS z0-ABq;4Udb-pi}Jr|y>ax6x7O-$ON6XxzoV!W-XEkx&w_51+HW8qrYE)vf1xAWz$B z_t2Zx%<1pK^@!&u_czj%8(w-qXJ}&+6Bp+_{4w4!z=()Kn-rwMX0mDbBL9 zBm280v41-F!rv*erly95G)7$S>godc!m%}1RKiUysnZd7Y3znY6j@F|!KUaSNk88!-^7;kij9kFIub`+mt2UwXz-h~Q7Ci3&=0lMb(3@wjD7!a6LljSYGZK<)jvG8kf zXvk>J5QXJSx+Vf*+*AwY9=gEAix*o9dK4~S2D_e}IQ^V|cDAqh<^+CezO$OE-)q^X z&Xe;HAhJ^Ixf{;TvAoxVU3R`PYhYd%_33zXy$K{3f!#6~?9j4?Q?LU6&V1 z_FBlZXGffyzsa@uBnb-(Tg#z>0+Ms|N-HQ#`RoxlH#gTRah?k7x2e3n;pfkv2RU>* z@@?qFtQJ}~0=c@+|HKwO-;_|MW@1TB7FU#JAWVSrVM&xi!72LUPYnR1Sq`zVXUCn}FdeZv7qtF&H!Jf;49VzQPC9 z@WhEEU^OJyOVZM9?4HMuA0I!nZEUOA)vHmnEMpS4>(%R>HeGf5#V1C*ZfyMR$B)BA zVn}SP*N@Mq+_tX=9~JGeHGcnqi3}{xdhXmx%M0mkyN_@Q3cl<&ZPgrWduztizMD7G zK)hw8FrOlsL|Gj;dn=pw4Tib^Y>RK(e>uQ9YqeOjEwBVJ?A;ma_2cxGI)fAg#~V~y`$p`xmzfH*1$y@ z-B_+sa%8rF(&fv=h+O1DHc#PQHL=I&c}!%iS$=^8 z1a{=V`{-pCZlpA*n2F1R{QNDs^ui7%_V)HTZJf^79U-?GmW$I$QtcEC4xkd?!s%zv zRax0ooSlGx02tcx{IvJ%SPRMk7GOKmV^#&DlDtxngyQ1pzF0GGQ^;};0|QI&?i}L} zW{uBIt*$xLmIW(sEqh*Wx(txwONs}VkLI_^(kq!m5(Ltsr)v*Edk9l4n zZHi++C1hY&?{(?l?n}ZBUs$-6Pv0APFDNK1cBh+6|CcZ7WG)$fWrCnn0*`JYT@?B7Txi z@evOBrJ@Lx-r_#`_eEkNAM|A`LYoh7>(0yCH*e+vpqyvCH8UL0vzxlQnX~QNhlg$c zgM))S$EnoS)SQ3zoLY@VW(Yr&551ZpUlPP)HE1XD+gS)UfKE2lRmH_3#d&XMW@i&W zkdu5uIOLh9cp7pXT_moWQm2-v=}ixhH2S^0TF0*}!J@3TM7rmjZv)R2=4oN5E}#&#=er^&kd#;oT4fmZ+XAk1u@cC1A%;it}= zdCG0G)y!n>JbKjnOxUp_P;{j4Dl0pC(3)h9wT(^E^oDn(mx-;$Mdjt?oLXn6E>;d4 z{LycM>iPTk?~#!aV3FY9U}P2>S6^N14~Uy6TFNIUzh>%Gc&(bee}#ki`S?0IJ7w3K zG(pzG!Vb~X%f%hAv$bukt-YeDdEM>`RDvPk!q#2&V`G5mCI=3LLD0!9J${1y8!#D) z)uwH`CqcYXzpq>gy>n-Sdt?$+ADk4V37+ zme)Bsp`vQ1#l_c93-<<4a@BO{A4Sk)1QBj|r%u>w6&01AP?Zb}upB59iXQ|or>CX8 z&dr7V{js6J=9_5*Iph$p*)x%wr+Il*mv$v>6W+ObBQ8TstSns8)$|-XOkm64IFzEz zV{)%v>|!d|{lLHgmJN}Qt_5O)vN|XCzgB%Y5s5_uX@)|Bdj&zfq@<*N-o5U?19fF( z;-N!Vb#=jwp`E@2*t`5PTNgXXD5o&5>0Uzj6ZYxx%K<^VO0c0K+V4Qa{ zL$QVGgR2e?*MO3ew4S$f=T2OR$ju+`cJIhcO^p{kd>}w7JUkp1IqA*KB*h$h&UHo# zYS3u#gS`PP$XP)8sj0P)o133s;Avj~;RQ{j+{|ni>gsbie-NvspMG&(OXC#T6yl3Z zr6alHIN96xCk=4gi?W@rTOjwGAj`*|D=OPL-aHmHD$rMb4><|jzRzKO@2#xo&(EXx z@HOM=l-@m$LXVAo4res8KDW0sh&ZK$g{h;30PKui1-YmHb)2<_-WZ44rAzNo@%Z@o zpjf=obSo+=TZK;I2y%pV-YsN`vzQBe)>>niV|qAK-c zL^D!fl8ClwHWOh3)$Mj7nTo2?>OYTJw}Z%w-7v1BSaB+nR-&jgeprn2)5$e93F);x zDLW(k6!Uomg+?-WmmAs3GKZGV#-^ORz?ti=qe;DaumVcR4C~f-DdyDdZ13?YpYE2| z2MqM1Eb#d=nSQr2n9poM*PXRtw zUuD^QgNrFZ$_Q1~&aUZg?wT+gC(kvJZEaVI^1^&lsm^~OGftjIz36c(nh^Q8#`ln! z?~5AsC^pXlUHC6Q#SrgyCRa@Kjk|Sp4{rg2x8WQvR zEjNDm$nP{^#Jw6$PfeB8%1ZtM0GGR2*sc^^t8T3DwZoZ+uJE!YST*EdP|BljDTsMLB;T3w{9s2d*%0$==p0 ze2dpPl4tq+Layt|r-y#P;*TI=7EsYG^fW;!qZf$KqWj{3-~L}6sdnsDOW z?t}X_j&a#9Vh8;X@q%Lv!c3B+{Qr&*R=rImlLm|9ybp;wpWW8Bk?NK@fmEKx@gwon zO6p7TZI4A}xdcz0+K$jWy6$dG{W!`oChP%T`y5B~odoBwXR|C><$ zKlJe7&GA}i(F|cfeR`<;FuWSUwcDXORH51>Cnnk(?81*e;2^xBqqS94_sxI7PweFt ziD>u&Fo_5FW<#a3lq;4cHC?Yw>i{k)fX-G{JOZSkTzEiUFD)$ve!QW}fWt_&oyYeFNTFnR=NNAjJr5(t zt-exMR#w(;?}O^<>Z%oyHcR=3CuvZ+1^D<%mw%S zK6Gdo9oMzbDOU<9Td0r6;qI%#!dqb8?sJpB=jOnlh35HjGwd%lUONQzS6?p=9QiXH zKN^U9#)#_gJ>To%bN6mx_Evm_@k|rV+OO(8_*z?Yb2>rWXUO5Rs!%VU?Z@vcw=7-| zLSGdzgB~%|2(M7r`+Y9^@nKVp5`_7wZnnJvLL6K0N$xlkXjUgq0IR$NGU+*pq*8f8 z*vAxIx$?!)r(Ipz|8*Jwgh;qvbCZYuE8=$eRxx<5+?eXhgXv+U9QT!qqn6>UBidRC z3CwJ4FOP}2(H%M@E8#n_a|6|Y4KpQnfTKrW|7R%SeGNB`;(b%3Mqv{ETwBl~QZDZ8 z+qaXF-rnmyJ-Ty-=H_EiGYiik_Rs%bqa{szwg096C#Lu($wW`yB(o_#gZ_G*VePxb`foJEyuS|*+iM=g+t~2QPzxak<26}5 zOnI4%@7AT=Mn(19+43n5>VlPp z#H0HKcj~$QjL)m&WHX>W@N-5oT7xZ&E9ib;7dx*m-BjF(+o8;|=zj^}c8rGRH@du_ zkI^6@E6~DQZ4=9=ZUeg4BaA!kxyZ|8d&*C?nQSp zj(c$L-ZeVEZBXL_%e9(GP|L#dqgHhkqrYvf=BI4}yXu z7Ka~0vGDizr>CPkB4mI2>1%vN;qQbvLuT^5njv~Y+auy03lP##@*yjaCZEOcZF3Kk zu}*Nrh&YWYJ3Hs+<^8=L=b3LmNYa(2oWmjPRj_>I3Wzic=qka20JLT}orn1NB@oJh zJnIM04?VHv>(|jjMtmqo?Vc)l$Lw`+SI?I$oFUL3K8)O-2kyKsy^Y zyv&|NDo@8fNNajZ08-0!YoZFE|L}z?{&5YCm((nY~ zKXeL|gc%jlW2L5TYs=yH02M`N)UKTdU2=se{V%6-~(nuT5$}j$9@?Zos<-H4y5U9zqaJN37mRp*YUK_mSgKrfM#1%RbaF{2$8s z)a0c2%CBlv0*^lpf*?_&=T6-5&;W2B`pnGp>6JBAZ^Y2_pK9Wa7f>7 zhr7y3N=l4GG`oo;d=@VckGZIrftI>@jj1P&*l~i5@a4-FNVbO=7?cPo8rU*@1$GA3 z){|^;9tlZFUy|ewHU?7i#r{PfQ*?I&!SzWWVI>n^8aodDPP&JdE$B8*M3|kjSwn}n zF)4`u!2U&|sH?A^>?rROLHAx`_7 zH`PtVa9+=r&JfTh!zi72OX2}jl~s5Q7CWc2P{Wo4!F*?)?R_m+5kXN-TJ#98D#Sb# zT+|aM6n@Cj+q#8r486k}0;HI;ERh6NBD85rs~6Qbbr7k{nW|z`1kJh8s46$-$p2;JV7ul zA|Gqo%i{e#t}QX9iAjlx^|4~z=orTT3;YQXe0+Q)5PcwBN>Mx~(0L=OXlsjjuX(_~ zgsX?yqg3oZB|M%~96h{i=T3Tl%O_II+`PPjK|y8CQ(Y(%-*G~)LBejAp`Euw5+!ti z{ZD~d6}}t_YGP8-f&KeonA6eGdB`Bq_x?TWi4&$cL75AntjjCx1OzP_=ObfdGK8Gh zueD2W-N5F7@BrPuJM|n+zGg{>NPF<0-1OX4ZS5VtBsMm-#(#F*$Nsw^hIE}T!=7|J zt;2z(o+jDHd&=Aem*q+!1fVr~{L+JvpTzz9-(9i5@9)nSFy`ju)B*t3*PG}}PE92- zAhb$NO*rGsvqf-3*F~La3LpKYL4mXXJCWi4vX1}H1S`3x4;%THp5&XvgkrbpzOwAu zH1w6*|N37= z8r16MwT!cw@Bp;+sXI9VR!BfowDQ(@b{qlyZ&joRhqq9T*=u-~%o$#e9_lmD)cI5S zGX}Wh{?m8#n<<|E8uaUg-4}%IX!M|G9rQ5-Q9gjnK^XxmMy!Eozs$(d|~<> zeQLnMu8xjoe?%e^6BC(u=lnH5y5Zq>a~`nrqOQY*T`wvnEiG~D*LgX)bRew8#>U+1 zP(4A(Ec}tzVM<13K!(C!=6nGQ!FoIuczaJH5YPJ$i}=xLpBXC)_VA&+=@W(mWu-$|5MFW4LC!km9YbM+S=!L7>3u(q%$@?Q5s3=9lh%h7_X z<{IfExa4>rbV?@j$y2rc-+rLnUbyfU?Jl$o8GCic|3ksm2k^`#`r+egsaJ1pU~63(tOR*jbXL-8eZzyo%7 z5c-AXWdl&Gp!YBlABFD$TmWLyB-*Tq@$`fQ5&>3T6d>zp7zX;vJ>79O8}D3eOICPR zAAST$fQpeEf~Hu`3vF6XeGjMx6f@^RH6bA(Fdy{IykL>!;XHR^i2N`Ae@8e@)nk2i zK3yY|qDqgoyjcD_A&6Ul=e#{SItLFP6ab-w`H^qub|$`^a3hC3c_I~;_v%##}lBImsMyxfh&sw@;@>nR8Vc9dN`*D?9cyx?-*{M<&vv=MT>WB#rU5mq8EKiaYvy zdnvBYRx!jN=l&fRnL}Z~0Xw;N?V6EMLUQsbB=~W|COAMI&~e{&hHq%+_U&-T0k49q zoPmdyz>pC3T2Jr2 z^{<4Mu{0CNHol{DJU^}Yy?%w{|(|15#fhxK#$xg`O2itpd;^PUP~L)=>v@7D}r zYvoOj4i1J!M_bz3Dsqw;$@@`eYiiK3h5yYE2&Yw0udcRMR#6e?i_cRF?Fmd{AVyyc z&XnJr2nS{?8+Z1<%ea|p?4DnDl-7@wGh+?jL9VQ;%4cccxG4XbpQm&$&=g}zL^Bud za5`QyYI-to7``2zaPTI3C#P8es;Y8Iet5@)-y()U)eGI{Im(8Zd3YSaHPB+%5&gm& z>M2#F3*!8GF!rsj`AKNL;-uRU5OhD`Y7|4LccJACcp_n@Y{{*g-;G6pgTrPOpNE%xy#hi0}jaZnJ z#CpKf47WF|5@@UfYv>pl#Cd`;3372MgGWIa8}$U+1?#Bni~U?xHH7?wA7`)_am9n(Rm)zIbpTq(DqgKo_vb8>36!}-%a07C#O{G6dj1yAGa`m z_cpOnjAL##YG8Qy^Gqs|D8=oOr}Pi_Y2`4(7PpVs{r28IM;MWlk)h+aRKxv%@nr#h zL9|B-TrPt45Ic@Pu|tm|5YuhNPN$fL!6dL{L|tc0+z$daW;5XJureF%@yEB&x#Ps_ z&TME5{%C4q;`Dpy;+{QwNHRu7M##3vvOTfj&ro*|O3(K|f_n4j4epynq&cWk{kL-g zf115@oxAzJzr2}#tD~+p#K%G`J>!gqVD76|w~{oIB;55=CQdeUYbdL?&JHQMYfo6E zoL-@leIvD3UHMDrm(?(RbxqBKaXPh5u9_FrWvv<&?d?7~34Hl}O&hH&sU_O?@3ZG< z*i6MZ1)XWkf1FA=ZBab0MD4o7QPFYxgraM&aR$ zb7WruKanHy6NXp9?)%2X_Dw9_!$3u@b?57Y^Kav?EMkldLd{q|bEu4}>YKb+lvPYS z_yHh!Vj4hKPcJM?bm^{*xjAY(v>fYck_b5?V*}(dhiRLIF81MThu2984IN8MZu|B< zp5sWAytR~DQ6_e9US)jY^yy37)PK?h?@SQ7X0|)ePEX7k+1RYYHoN4as2B|LZ6yY+ zXDs+QXi|WEuyQ%_2ZN}yJaZ@)wIl3+_~(DzPa)}(25^vKMhG4zq$1b>AcySQRU{Mx zh;~Ghn17i$^xgaSh#d4JcKAM98G?Fh|4)i2W!0_l@^o*f(uHaGEyisyj)fP1Bj&;^ zM60=gp78?XZQay~py1Fg42g=exPHC;_qMnBaE35p>Ib?pOcSkB;Jq*}L3N&VcpkH9 z(JOiXK{e-EltQRki_v$Mv zV^Yl*emFq;@fVCpeJBAMaAF)&&{k1#!0%AwySuv5Qc~=BMb|4S<8nhoko=N3Ez>eG zN+AdWJVBjsa);Uir|Q$_Xk@33_oz^m$re^tG&OP#UZx?TeWL%07Gk_?_Qk2BoE&Z@ zra`Q0>&3k!q;QCoYFDlp!se3o1qll{8VkT9Ab{ycQ_<_!uN#!!%6avwxvx)u-233; zS5~1gZ_S#w!eSL}MN`dXXlO_|Z^)?kj2|5u@CWoRMi&7W_*uA+2E2Oo(KLWaa&F@(|LK3(>G zXh`MCmA4}vc~{{2z@5iS`Q(G(V6$$-58MlEFhXLa#@&4x^KM<`7HzB$YEkTP@3IUk zVg1DK&~zCAvnU20^3OgG!$GOH+N`t zXV`H@#`Cb5f}p{CQ@n~xM>7ak6ii4*3OlmeSX){i255)b1_TtNi?_Zv9_>1I#0AGXg)pE&W zqhm}9wjt5_T8XfjnBI;KA@@1!aYp1|_#2VsjOa!ImnlPXQ?Q%8>|ett!6Soikty9M zunTqp$})UhWo~(h3nv;_%&%d_h`L&a<&j~vpACjl|3tY9=V+~f(E1rV-MpFP^D8~O z+^Av|ceK>DSH#Z{av;F%_*P}$9zVZJm!M!zCpr2PrJc2OM5VL?l+&5r7CQ1hND3o}VEE(C?Fz zJyP8& z;-aH3caI-94#NoSjynhh^X%yLT_DPyo}HqJ0Nv1dp)>9a(eU|BMMWf2o(n+2=0xVk zS8Qk6uwes69}=YR zPoS79@tvO<8^dK-Fh`3%!wx2?llv7Tx$ZPtV8$OTay%yk(=}=u8mufV#8iGMMk2+f zWXwSeQ^dAy{^3&)yUjT783pdywF?9bZqnmqtT1#=jN;IcHg4QFX2i6v!%bjUZv@bfMzvIHkgBb1r$L-89mIi!5dOU<~GzM65=67Heo|~H+G9oN3 zshGI#25iTByE1>avvYDbp-C*(WN2y{78j?~-PuM0{zh{L>j9#Vw#=lbZ(s05rqy^j z_mIipBgCkwY#g2OceUa-$|v~*1)J*XtSl{0b8vV$wiBb8qG^>LM!fb+jJWOe9Tr>+ z6u-~Id}nz^#)I@u%XFygc)G(}y}6a+WkPKe<%O|y)21J_dfecC(2_ta(Wrm=^r=o3 z9gh`k^H-&H4EsJ`ApS~2D!C-6h650-Kx4~*Xn{3G#T#VctrHX!#NSB-_ch&<`vp)4 zIG8aFJKXx1Gp0Dr4 zD_3Z2B4k*QBG916$UbTisAq23t5?5lich5a`fd@mB8MQMy9wHlU%aBFg$Z7yT5wS` ze;U`?UdQyCw>m<6(?VMaMINO%G4b<^B%G!uqHm^fBzj7AKMymP?S54w#~J>$3r+@< zR|JKQb9f1DYD!A!5B3`2YuM1*+Mm`q3VMdd7tbM0ps0k(sOjmkw_SCsF}Jop%gITx zuk!NlBW&i>&!?_-sywju!bee*P{;$2o0-UXu!Ap|j9J&cB#aUOr0MGFnnRLkw^&Ew zz;E*m%Ce&{$X%9vm#AW3z;NuCV$+eXp#kAPtoyhb+Noi^2@L1pz z@%V#c+M0LoPM$jT7dn>SXqozypyIYdRXFuA^R+tPk5T0uD8Q&48R_Z9beEVzZ@IZ) zINlA=7cw0Dg`!go|MV`G;VeeiroN}=+3v$0-vI9xmX?B#2xATV+uI{zO0dSF!otuN zZ7@(l8Ey?ioWXtx*0BVO1M?ZI(!*0Tf`WFrUnCb4%-^Fqj?U=U ze>Il_1TI~?2*5+JD8zZr9TLmy;ox0R>GzzE$<9W#{6XHn4=U{V`DP67!2vs6zHIv? zO&u}n)WL24}t@bKWE;5EbZB^_RLn{v*8h6e$B&#=yXUJBhzw3Jj0+Ko!Racw!h1fd6+Nb{wi+ zQ#AiXLBAI-^mmvZVkmQawzd?1C$M8CjK5A=r;chvdV7c405uNof``t#si_mKS}?1K z)+Q>n#WH$@z->hs1HoeAOdQG>^|!i&4{iyNqTp!cT-1CtzZ8K-#rU-h45q(-k9hhN zBY@nHMCT|G3h>n4+#CsmgS2RH%OwC6AWstpxQLoV9mpZjL7<{{cX#7yEB;6Mf8onP z2qB-B!i);7!qngv`hOTKl#{E2+=GO0LwM)93PwVDt>U-tJ~H;>$7KS{wBi_U#{e>A zP+?oM3X(kb9wv}uFhrA@dddctBGjG6PoEA8*;D4>nw-55S0KXpCd#CNW5wOzZ=X{s z0`X)u)Va1h!T2h)@%Iuo^P1IPlMV;_0op;M&3U>Hp)@|(Nyd{$j6Vd!=}plgkMYFg zAsOC~#Zf##i3@ZCDItmd6+HUp0D>2KlqthudU~a3zJN7Ph=%v>5v;5xa1O7l-vY?& zIVz&2uP<&^AL-J+Ix)`)-3CoZfJVTU4{P$*Fb)tGX8^J06=DR};#`iV13)**1Olrr z_%)t!gUd(F_kww-)4Q7DIt2OqIv8w##+W_D>G%I;#JwGykd}78?Dvx@{l{;@8w9o=!u-xgaUAv9ZWlFJ62D;9WOm#wPml8uAd@ zp(y*5ttn2Kk)rqj>fGRjl4Leg{`pw6eYq}214L$Jq@fYD0opLx;f-h;Q zu1w9sA{7QH_qv?$a883Yum}@V)0U@2szx~rTR2^RA31RFV0ubQbKHZi%6w4y%#~&p zBYEb3n5fz#CRUgJKK4p0D(bAQwE!ZfJmUxRvCP=3NZCu08-QBa$lx>R^59totqdm_ z_$~K)+FZKi_weCEEG#z1ojY$~`sw@pSt_ph)^9uwX%Ise=fuSR^}GsU^sbdW)c)(E%x++sP=zqWx2$;7Zih*tQjTS_4k|!apy{(*x*|pFgi$S)hLemVAG%0F$4_*{^DTb(#%NUhbt*xEXmEt#2Ab|$BGz8 zQVEctr{21nh0V2nGa%c8r*JGzPfr`@=veU`#+~~u`2iCMk_P%zbDMTBQI!wd3ju2X z@=k)z!4owJek$-Z$O5wkfI#wI7%?Z2HgZHE9X-07bZpO4aP-*N#$e#?nMIHL36URB z+<>LOwztQW_`b@@3bv?O-i{{Y_H~OKt<4)RfUtdN>$J{C%WvQc9z8QMI%>&xxTLp{ z<<(B6YTE+2Bs}G+IV$SV%eJE8;!h(EoiCqTh+ruF_3PF@d7CQb2ELx8DwiTk;b9rT zXqX1k*6yM(+MYtR04}%j+2WZxZI*dvZw@i>Nl0Y3jX$}3!oT_g0RZD)n;1`#_|_XX z4`V<2FY|xCD^+tmVsUYH29u9`hKaV(KS-EGx*UDaXqluQCCacMxBtQ;f^OditOuP( z>umsd!L6(u9t&PxeAmyGBy=SYQ~M#4;GD?Bz7qb^r|*wrcH_D7$s_di-A!Se2Yz|z z1#F;Nf32Mf1VbWlyQgGjWQ4E)mi%xM0nEO2F1FM9y#k*?f0_G1yCZZ*j_3mLS;tR` zAE(~4hfS8}T>}hUF(tetvq0^aZLY8`Amz@{z@7)pKgW9?62t4)JY))_y7A8Q5(hTK{EGJ+))|-_5tzs@nN(c!3f~by7YoZx~jSw`x;5#wxFA$ zN$8h-DwR7#N7wQBvk6ZWI=;Y8;FwV*89x_1)({vCwuvgK?b2_*{YD+2A=RJMot>M* zGkLPh%k|@xxh|A`n?Q=ta}(m?8u)u`W93#~B9*~wt+O1Vd3pT))o=B8#;cu%i9-GK zm)6$3UKYMVj0Cu7VbD-hoBcbXd4zh$j;_8wvzL%sF$x|jpIpI3*z@A~$sI1$Vx8uE zpGIatUq{7MCXu;u5!#t^cC*CWV&|DQS4Kc%H|2@aNRNq()M)Ebn>bDJap8sis>KnRY^U2@+1m(G@b~eua8G9`RH=65r)t~;E0075xg@v zFfctUYb|dA)RMsDv8GWEEEs>!%yz+4QQ4OPz*8pV6&8WNf_IN_mi4(rHY_ck> zj|Y?27au6UXpv#ryRu^sEj>NrMThl{>m`uhA8YLIMjUQ*H8v_LDBuYLhY+G@7*+=E zsC-+=Sw}VC4hjVjO&bV+z{w8~Z(gD$kqV(bLq724o&X68A^EHEOl zM*!_mnRnlQm-14Pi6l&f1qKERJY{EPeV@dOup6`&n!H@J?P-I6uyDY`eMgT@)g0S6 zK(n7j6)bW;0i$4~_{u+MHM(42+B`7U)zbs6@hm20-z7dPS@#i=Uq;KmM&VFMiw z@@x7IgkR06yy;g2ehNI0@pcBzII0ha@qz#SN0)@D*~hfUE7xHPqoR_%s3?_1x_0+} E0an87WB>pF literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png new file mode 100644 index 0000000000000000000000000000000000000000..398fc0679ccc094383ff87567d88ebdbe78daba6 GIT binary patch literal 21022 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 RhZ6`_F5Qq!Bi(-ZzW_h`n=b$W literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat new file mode 100644 index 00000000..2d663fba --- /dev/null +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat @@ -0,0 +1,5 @@ +3.68869e-17 0.059231 +3.7165e-17 0.034785 +3.3136e-17 0.343963 +3.42537e-17 3.43808 +3.44041e-17 35.4666 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat new file mode 100644 index 00000000..7b04a98c --- /dev/null +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat @@ -0,0 +1,5 @@ +1.92892e-08 0.050233 +1.85722e-08 0.03209 +1.83785e-08 0.313676 +1.85299e-08 3.26166 +1.8523e-08 32.4615 diff --git a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl new file mode 100644 index 00000000..31516e7c --- /dev/null +++ b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl @@ -0,0 +1,59 @@ +using DataFrames, CSV, StatsPlots + + +f1=DataFrame(CSV.File("lapacke_single_precision.dat", delim=" ", header=false)) +f2=DataFrame(CSV.File("lapacke_double_precision.dat", delim=" ", header=false)) +f3=DataFrame(CSV.File("tuvx_single_precision.dat", delim=" ", header=false)) +f4=DataFrame(CSV.File("tuvx_double_precision.dat", delim=" ", header=false)) + + +lapack_errors_single_precision = f1[:, 1] +lapack_times_single_precision = f1[:, 2] + +tuvx_errors_single_precision = f3[:, 1] +tuvx_times_single_precision = f3[:, 2] + +lapack_errors_double_precision = f2[:, 1] +lapack_times_double_precision = f2[:, 2] + +tuvx_errors_double_precision = f4[:, 1] +tuvx_times_double_precision = f4[:, 2] + +nam = repeat([500, 1000, 10000, 100000, 1000000], outer=2) +# julia has a weird way of ordering groups in bar plots (need to make it better) +nam = [ n > 500 ? "$n" : + " $n" + for n in nam] + +data = [lapack_errors_single_precision; tuvx_errors_single_precision] +groups = repeat(["LAPACKE", "TUV-X"], inner = 5) +plot(groupedbar(nam, data, groups=groups)) +title!("Comparing Accuracy (Single Precision)") +xlabel!("System Size") +ylabel!("Relative Error") +savefig("single_precision_errors.png") + +data = [lapack_times_single_precision; tuvx_times_single_precision] +groups = repeat(["LAPACKE", "TUV-X"], inner = 5) +plot(groupedbar(nam, data, groups=groups)) +title!("Comparing Speed (Double Precision)") +xlabel!("System Size") +ylabel!("Run Time (ms)") +savefig("single_precision_times.png") + +data = [lapack_errors_double_precision; tuvx_errors_double_precision] +groups = repeat(["LAPACKE", "TUV-X"], inner = 5) +plot(groupedbar(nam, data, groups=groups)) +title!("Comparing Accuracy (Double Precision)") +xlabel!("System Size") +ylabel!("Relative Error") +savefig("double_precision_errors.png") + +data = [lapack_times_double_precision; tuvx_times_double_precision] +groups = repeat(["LAPACKE", "TUV-X"], inner = 5) +plot(groupedbar(nam, data, groups=groups)) +title!("Comparing Speed (Double Precision)") +xlabel!("System Size") +ylabel!("Run Time (ms)") +savefig("double_precision_times.png") + diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4bf1417a5a490f0591f8c347e0e9f938832e65 GIT binary patch literal 24701 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 lM~auEuJ}I!e#Zb)1{Q&TJyrF+{tJTD+i(B? literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6bfbab8b496e04aa245a49ee850184321ef320 GIT binary patch literal 20928 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 literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat new file mode 100644 index 00000000..623af233 --- /dev/null +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat @@ -0,0 +1,5 @@ +3.21499e-17 0.011642 +3.34579e-17 0.022342 +3.50134e-17 0.366204 +3.48084e-17 3.8547 +3.44588e-17 31.3497 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat new file mode 100644 index 00000000..aac2ef50 --- /dev/null +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat @@ -0,0 +1,5 @@ +1.8298e-08 0.012343 +1.67409e-08 0.022292 +1.81911e-08 0.254255 +1.84027e-08 2.64913 +1.84169e-08 24.2951 From c74f3f2ed16460fc017ef2986560522ab28bc6d6 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri Date: Tue, 18 Jun 2024 10:03:27 -0600 Subject: [PATCH 04/51] run each tridiagonal solver test multiple times and take average of the metrics being recorded --- CMakeLists.txt | 1 - benchmark/CMakeLists.txt | 12 -- cmake/benchmark_util.cmake | 17 -- cmake/dependencies.cmake | 10 +- cmake/test_util.cmake | 90 +++++---- .../tuvx/linear_algebra/linear_algebra.inl | 179 ++++++++++-------- test/unit/linear_algebra/test_lapacke.cpp | 118 ++++++------ .../test_tridiagonal_solver.cpp | 79 ++++---- .../double_precision_errors.png | Bin 20711 -> 20623 bytes .../double_precision_times.png | Bin 21022 -> 21189 bytes .../lapacke_double_precision.dat | 10 +- .../lapacke_single_precision.dat | 10 +- .../tridiagonal_solver/plot_analysis.jl | 21 +- .../tridiagonal_solver/scatter.png | Bin 0 -> 20701 bytes .../single_precision_errors.png | Bin 24701 -> 24556 bytes .../single_precision_times.png | Bin 20928 -> 21128 bytes .../tuvx_double_precision.dat | 10 +- .../tuvx_single_precision.dat | 10 +- 18 files changed, 301 insertions(+), 266 deletions(-) delete mode 100644 benchmark/CMakeLists.txt delete mode 100644 cmake/benchmark_util.cmake create mode 100644 tool/numerical_analysis/tridiagonal_solver/scatter.png diff --git a/CMakeLists.txt b/CMakeLists.txt index db2d537b..8d090616 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,7 +155,6 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) enable_testing() add_subdirectory(test) - add_subdirectory(benchmark) endif() # ############################################################################## diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt deleted file mode 100644 index f90b063a..00000000 --- a/benchmark/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -# ############################################################################## -# Benchmark utilities - -include(benchmark_utils) - -# ############################################################################## -# tests - -create_standard_cxx_benchmark(NAME tridiagonal_solver SOURCES - benchmark_tridiagonal_solver.cpp) - -# ############################################################################## diff --git a/cmake/benchmark_util.cmake b/cmake/benchmark_util.cmake deleted file mode 100644 index be3f30da..00000000 --- a/cmake/benchmark_util.cmake +++ /dev/null @@ -1,17 +0,0 @@ -function(create_standard_cxx_benchmark) - set(prefix BENCHMARK) - set(optionalValues SKIP_MEMCHECK) - - include(CMakeParseArguments) - cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" - "${multiValues}" ${ARGN}) - - add_executable(benchmark_${BENCHMARK_NAME} ${BENCHMARK_SOURCES}) - target_include_directories(benchmark_${BENCHMARK_NAME} - PUBLIC ${LAPACK_INCLUDE_DIRS}) - target_link_libraries(benchmark_${BENCHMARK_NAME} - PUBLIC LAPACK::LAPACK musica::tuvx benchmark::benchmark) - - # add_tuvx_test(${BENCHMARK_NAME} benchmark_${BENCHMARK_NAME} "" - # ${BENCHMARK_WORKING_DIRECTORY} ${BENCHMARK_SKIP_MEMCHECK}) -endfunction(create_standard_cxx_benchmark) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6aa14bb9..b491e5db 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -83,15 +83,7 @@ if(TUVX_ENABLE_TESTS) OFF CACHE BOOL "" FORCE) - # google benchmark - - FetchContent_Declare( - googlebenchmark - GIT_REPOSITORY https://github.com/google/benchmark.git - GIT_TAG main) # need main for benchmark::benchmark - - FetchContent_MakeAvailable(googletest googlebenchmark) - + FetchContent_MakeAvailable(googletest) # don't run clang-tidy on google test set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "") set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index 9a9950bc..06e057c7 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -1,21 +1,22 @@ -################################################################################ +# ############################################################################## # Utility functions for creating tests if(TUVX_ENABLE_MEMCHECK) find_program(MEMORYCHECK_COMMAND "valgrind") endif() -################################################################################ +# ############################################################################## # impose that one test runs after another so that we can safely test in parallel function(add_test_dependency run_second run_first) - # add dependency between two tests - # https://stackoverflow.com/a/66931930/5217293 - set_tests_properties(${run_first} PROPERTIES FIXTURES_SETUP f_${run_first}) - set_tests_properties(${run_second} PROPERTIES FIXTURES_REQUIRED f_${run_first}) + # add dependency between two tests + # https://stackoverflow.com/a/66931930/5217293 + set_tests_properties(${run_first} PROPERTIES FIXTURES_SETUP f_${run_first}) + set_tests_properties(${run_second} PROPERTIES FIXTURES_REQUIRED + f_${run_first}) endfunction(add_test_dependency) -################################################################################ +# ############################################################################## # build and add a standard test (one linked to the tuvx library) function(create_standard_test) @@ -23,10 +24,13 @@ function(create_standard_test) set(singleValues NAME WORKING_DIRECTORY) set(multiValues SOURCES) include(CMakeParseArguments) - cmake_parse_arguments(${prefix} " " "${singleValues}" "${multiValues}" ${ARGN}) + cmake_parse_arguments(${prefix} " " "${singleValues}" "${multiValues}" + ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) set_target_properties(test_${TEST_NAME} PROPERTIES LINKER_LANGUAGE Fortran) - target_link_libraries(test_${TEST_NAME} PUBLIC musica::tuvx tuvx_test_utils ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} GTest::gtest_main) + target_link_libraries( + test_${TEST_NAME} PUBLIC musica::tuvx tuvx_test_utils ${BLAS_LIBRARIES} + ${LAPACK_LIBRARIES} GTest::gtest_main) if(TUVX_ENABLE_OPENMP) target_link_libraries(test_${TEST_NAME} PUBLIC OpenMP::OpenMP_Fortran) endif() @@ -36,7 +40,7 @@ function(create_standard_test) add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY}) endfunction(create_standard_test) -################################################################################ +# ############################################################################## # build and add a standard test (one linked to the tuvx library) function(create_standard_cxx_test) @@ -46,13 +50,15 @@ function(create_standard_cxx_test) set(multiValues SOURCES LIBRARIES) include(CMakeParseArguments) - cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" "${multiValues}" ${ARGN}) + cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" + "${multiValues}" ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) target_include_directories(test_${TEST_NAME} PUBLIC ${LAPACK_INCLUDE_DIRS}) - target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx GTest::gtest_main) + target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx + GTest::gtest_main) message(STATUS ${OpenBLAS_INCLUDE_DIRS}) - + # link additional libraries foreach(library ${TEST_LIBRARIES}) target_link_libraries(test_${TEST_NAME} PUBLIC ${library}) @@ -62,52 +68,68 @@ function(create_standard_cxx_test) set(TEST_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") endif() - add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY} ${TEST_SKIP_MEMCHECK}) + add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY} + ${TEST_SKIP_MEMCHECK}) endfunction(create_standard_cxx_test) -################################################################################ +# ############################################################################## # Add a test function(add_tuvx_test test_name test_binary test_args working_dir) if(TUVX_ENABLE_MPI) - add_test(NAME ${test_name} + add_test( + NAME ${test_name} COMMAND mpirun -v -np 2 ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + WORKING_DIRECTORY ${working_dir}) else() - add_test(NAME ${test_name} - COMMAND ${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + add_test( + NAME ${test_name} + COMMAND ${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) endif() - set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --trace-children=yes --leak-check=full -s --gen-suppressions=all ${MEMCHECK_SUPPRESS}") + set(MEMORYCHECK_COMMAND_OPTIONS + "--error-exitcode=1 --trace-children=yes --leak-check=full -s --gen-suppressions=all ${MEMCHECK_SUPPRESS}" + ) set(memcheck "${MEMORYCHECK_COMMAND} ${MEMORYCHECK_COMMAND_OPTIONS}") separate_arguments(memcheck) - if(TUVX_ENABLE_MPI AND MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) - add_test(NAME memcheck_${test_name} - COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + if(TUVX_ENABLE_MPI + AND MEMORYCHECK_COMMAND + AND TUVX_ENABLE_MEMCHECK) + add_test( + NAME memcheck_${test_name} + COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} + ${test_args} + WORKING_DIRECTORY ${working_dir}) elseif(MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) - add_test(NAME memcheck_${test_name} - COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + add_test( + NAME memcheck_${test_name} + COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) endif() endfunction(add_tuvx_test) -################################################################################ -# Setup regression tests. Add dependencies between each regression test and its +# ############################################################################## +# Setup regression tests. Add dependencies between each regression test and its # memcheck test. Also add a dependence with any previous tests. Becuase TUV-x # outputs to the same location, concurrent runs of the standalone tool that # depend on the output must run in serial function(add_regression_test test_name command memcheck_command) - add_test(NAME ${test_name} COMMAND ${command} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test( + NAME ${test_name} + COMMAND ${command} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) if(MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) - add_test(NAME memcheck_${test_name} COMMAND ${memcheck_command} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test( + NAME memcheck_${test_name} + COMMAND ${memcheck_command} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) endif() endfunction(add_regression_test) -################################################################################ +# ############################################################################## # Link tuv-x to a test and add it to the suite as a bash script macro(add_std_test_script test_name script_path) @@ -119,4 +141,4 @@ macro(add_std_test_script test_name script_path) add_test(NAME ${test_name} COMMAND ${script_path}) endmacro(add_std_test_script) -################################################################################ +# ############################################################################## diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index 0495bb58..c3afac66 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -1,99 +1,116 @@ -namespace tuvx { +namespace tuvx +{ -template -inline TridiagonalMatrix::TridiagonalMatrix(std::size_t size) { - this->size_ = size; - this->main_diagonal_ = std::vector(size); - this->upper_diagonal_ = std::vector(size - 1); - this->lower_diagonal_ = std::vector(size - 1); -} + template + inline TridiagonalMatrix::TridiagonalMatrix(std::size_t size) + { + this->size_ = size; + this->main_diagonal_ = std::vector(size); + this->upper_diagonal_ = std::vector(size - 1); + this->lower_diagonal_ = std::vector(size - 1); + } -template -inline std::vector Dot(const TridiagonalMatrix &A, - const std::vector &x) { - std::size_t size = x.size(); - std::vector v(size); - v[0] = A.main_diagonal_[0] * x[0] + A.upper_diagonal_[0] * x[1]; + template + inline std::vector Dot(const TridiagonalMatrix &A, const std::vector &x) + { + std::size_t size = x.size(); + std::vector v(size); + v[0] = A.main_diagonal_[0] * x[0] + A.upper_diagonal_[0] * x[1]; - std::size_t i = 0; - for (i = 1; i < size - 1; i++) { - v[i] = A.main_diagonal_[i] * x[i] + A.upper_diagonal_[i] * x[i + 1] + - A.lower_diagonal_[i - 1] * x[i - 1]; + std::size_t i = 0; + for (i = 1; i < size - 1; i++) + { + v[i] = A.main_diagonal_[i] * x[i] + A.upper_diagonal_[i] * x[i + 1] + A.lower_diagonal_[i - 1] * x[i - 1]; + } + v[i] = A.main_diagonal_[i] * x[i] + A.lower_diagonal_[i - 1] * x[i - 1]; + return v; } - v[i] = A.main_diagonal_[i] * x[i] + A.lower_diagonal_[i - 1] * x[i - 1]; - return v; -} -template -inline std::vector Solve(TridiagonalMatrix A, std::vector b) { - T temp; - std::size_t N = b.size(); - std::vector x(N); - // forward pass - for (std::size_t i = 1; i < N; i++) { - temp = A.lower_diagonal_[i - 1] / A.main_diagonal_[i - 1]; - A.main_diagonal_[i] -= temp * A.upper_diagonal_[i - 1]; - b[i] -= temp * b[i - 1]; - } - // back substitution - x[N - 1] = b[N - 1] / A.main_diagonal_[N - 1]; - for (std::size_t i = N - 2;; i--) { - x[i] = (b[i] - A.upper_diagonal_[i] * x[i + 1]) / A.main_diagonal_[i]; - if (i == 0) { - break; + template + inline std::vector Solve(TridiagonalMatrix A, std::vector b) + { + T temp; + std::size_t N = b.size(); + std::vector x(N); + // forward pass + for (std::size_t i = 1; i < N; i++) + { + temp = A.lower_diagonal_[i - 1] / A.main_diagonal_[i - 1]; + A.main_diagonal_[i] -= temp * A.upper_diagonal_[i - 1]; + b[i] -= temp * b[i - 1]; } + // back substitution + x[N - 1] = b[N - 1] / A.main_diagonal_[N - 1]; + for (std::size_t i = N - 2;; i--) + { + x[i] = (b[i] - A.upper_diagonal_[i] * x[i + 1]) / A.main_diagonal_[i]; + if (i == 0) + { + break; + } + } + return x; } - return x; -} -template inline void FillRandom(std::vector &x) { - std::random_device dev; - std::mt19937 rng(dev()); - std::uniform_int_distribution dist6(1, 6); - for (std::size_t i = 0; i < x.size(); i++) { - x[i] = (T)dist6(rng) + 1; + template + inline void FillRandom(std::vector &x) + { + std::random_device dev; + std::mt19937 rng(dev()); + std::uniform_int_distribution dist6(1, 6); + for (std::size_t i = 0; i < x.size(); i++) + { + x[i] = (T)dist6(rng) + 1; + } } -} -template inline void FillRandom(TridiagonalMatrix &A) { - FillRandom(A.main_diagonal_); - FillRandom(A.lower_diagonal_); - FillRandom(A.upper_diagonal_); - // make diagonally dominant (diagonal value greater than sum of its row) - std::size_t i = 0; - A.main_diagonal_[i] += A.upper_diagonal_[i] + (T)100; - for (i = 1; i < A.size_ - 1; i++) { - A.main_diagonal_[i] += - A.lower_diagonal_[i - 1] + A.upper_diagonal_[i] + (T)100; + template + inline void FillRandom(TridiagonalMatrix &A) + { + FillRandom(A.main_diagonal_); + FillRandom(A.lower_diagonal_); + FillRandom(A.upper_diagonal_); + // make diagonally dominant (diagonal value greater than sum of its row) + std::size_t i = 0; + A.main_diagonal_[i] += A.upper_diagonal_[i] + (T)500; + for (i = 1; i < A.size_ - 1; i++) + { + A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + A.upper_diagonal_[i] + (T)500; + } + A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + (T)500; } - A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + (T)100; -} -template inline void Print(const std::vector &x) { - std::cout << std::endl; - for (std::size_t i = 0; i < x.size(); i++) { - std::cout << x.at(i) << std::endl; + template + inline void Print(const std::vector &x) + { + std::cout << std::endl; + for (std::size_t i = 0; i < x.size(); i++) + { + std::cout << x.at(i) << std::endl; + } + std::cout << std::endl; } - std::cout << std::endl; -} -template -T ComputeError(const std::vector &x, const std::vector &x_approx) { - T error = 0; - for (std::size_t i = 0; i < x.size(); i++) { - error += - (abs(x[i] - x_approx[i]) / std::max(x[i], x_approx[i])) / (T)x.size(); + template + T ComputeError(const std::vector &x, const std::vector &x_approx) + { + T error = 0; + for (std::size_t i = 0; i < x.size(); i++) + { + error += (abs(x[i] - x_approx[i]) / std::max(x[i], x_approx[i])) / (T)x.size(); + } + return error; } - return error; -} -template inline void Print(const TridiagonalMatrix &x) { - std::cout << "----" << std::endl; - Print(x.upper_diagonal_); - Print(x.main_diagonal_); - Print(x.lower_diagonal_); - std::cout << "----" << std::endl; -} + template + inline void Print(const TridiagonalMatrix &x) + { + std::cout << "----" << std::endl; + Print(x.upper_diagonal_); + Print(x.main_diagonal_); + Print(x.lower_diagonal_); + std::cout << "----" << std::endl; + } -} // namespace tuvx +} // namespace tuvx diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp index d0afedb1..5ebbf002 100644 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -28,6 +28,8 @@ typedef std::vector vecf; const double tol_dp = std::numeric_limits::epsilon(); const float tol_sp = std::numeric_limits::epsilon(); +const std::size_t number_of_runs = 100; + /// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed @@ -36,36 +38,40 @@ const float tol_sp = std::numeric_limits::epsilon(); TEST(LapackeTest, SinglePrecision) { std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; - vecf errors(5); - vecd times(5); + vecf errors(5, 0); + vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { - vecf x(sizes[i]); - vecf b(sizes[i]); - trid_matf A(sizes[i]); - - FillRandom(A); - FillRandom(x); - b = Dot(A, x); - - auto clock_start = high_resolution_clock::now(); - LAPACKE_sgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - auto clock_end = high_resolution_clock::now(); - duration elapsed_time = clock_end - clock_start; - - // to be written to a file - errors[i] = ComputeError(x, b); - times[i] = elapsed_time.count(); + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecf x(sizes[i]); + vecf b(sizes[i]); + trid_matf A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); + + auto clock_start = high_resolution_clock::now(); + LAPACKE_sgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + // to be written to a file + errors[i] += ComputeError(x, b); + times[i] += elapsed_time.count(); + } + errors[i] /= number_of_runs; + times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_sp); } @@ -87,35 +93,39 @@ TEST(LapackeTest, DoublePrecision) { std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; - vecd errors(5); - vecd times(5); + vecd errors(5, 0); + vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { - vecd x(sizes[i]); - vecd b(sizes[i]); - trid_matd A(sizes[i]); - - FillRandom(A); - FillRandom(x); - b = Dot(A, x); - - auto clock_start = high_resolution_clock::now(); - LAPACKE_dgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - auto clock_end = high_resolution_clock::now(); - duration elapsed_time = clock_end - clock_start; - - errors[i] = ComputeError(x, b); - times[i] = elapsed_time.count(); - + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecd x(sizes[i]); + vecd b(sizes[i]); + trid_matd A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); + + auto clock_start = high_resolution_clock::now(); + LAPACKE_dgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + errors[i] += ComputeError(x, b); + times[i] += elapsed_time.count(); + } + errors[i] /= number_of_runs; + times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_dp); } diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index f807a268..c4a7d21a 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,8 @@ typedef std::vector vecf; const double tol_dp = std::numeric_limits::epsilon(); const float tol_sp = std::numeric_limits::epsilon(); +const std::size_t number_of_runs = 100; + /// @test Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed @@ -35,27 +38,33 @@ TEST(TridiagSolveTest, SinglePrecision) { std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; float error = 0; - vecd errors(5); - vecd times(5); + vecd errors(5, 0); + vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { - vecf x(sizes[i]); - vecf b(sizes[i]); - trid_matf A(sizes[i]); + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecf x(sizes[i]); + vecf b(sizes[i]); + trid_matf A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); - FillRandom(A); - FillRandom(x); - b = Dot(A, x); + auto clock_start = high_resolution_clock::now(); + vecf x_approx = Solve(A, b); + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; - auto clock_start = high_resolution_clock::now(); - vecf x_approx = Solve(A, b); - auto clock_end = high_resolution_clock::now(); - duration elapsed_time = clock_end - clock_start; + errors[i] += ComputeError(x, x_approx); + times[i] += elapsed_time.count(); + } - errors[i] = ComputeError(x, x_approx); - times[i] = elapsed_time.count(); + errors[i] /= number_of_runs; + times[i] /= number_of_runs; - EXPECT_LE(error, tol_sp); + EXPECT_LE(errors[i], tol_sp); } // Open the file for output as text: std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat"); @@ -73,26 +82,30 @@ TEST(TridiagSolveTest, SinglePrecision) TEST(TridiagSolveTest, DoublePrecision) { std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; - vecd errors(5); - vecd times(5); + vecd errors(5, 0); + vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { - vecd x(sizes[i]); - vecd b(sizes[i]); - trid_matd A(sizes[i]); - - FillRandom(A); - FillRandom(x); - b = Dot(A, x); - - auto clock_start = high_resolution_clock::now(); - vecd x_approx = Solve(A, b); - auto clock_end = high_resolution_clock::now(); - duration elapsed_time = clock_end - clock_start; - - errors[i] = ComputeError(x, x_approx); - times[i] = elapsed_time.count(); - + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecd x(sizes[i]); + vecd b(sizes[i]); + trid_matd A(sizes[i]); + + FillRandom(A); + FillRandom(x); + b = Dot(A, x); + + auto clock_start = high_resolution_clock::now(); + vecd x_approx = Solve(A, b); + auto clock_end = high_resolution_clock::now(); + duration elapsed_time = clock_end - clock_start; + + times[i] += elapsed_time.count(); + errors[i] += ComputeError(x, x_approx); + } + errors[i] /= number_of_runs; + times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_dp); } // Open the file for output as text: diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png index b1c01fa6d885eb7297d01aae230b54b79d74bd60..0c79fe93f97c2b01a1941dd70a30fadeace7f5f7 100644 GIT binary patch literal 20623 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 INLL>IUwc&3asU7T literal 20711 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 E0an87WB>pF diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png index 398fc0679ccc094383ff87567d88ebdbe78daba6..91e65d29cbace5d99f7924e72d8b627e90eac873 100644 GIT binary patch literal 21189 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 H%Xj`8CtD0i literal 21022 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 RhZ6`_F5Qq!Bi(-ZzW_h`n=b$W diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat index 2d663fba..80997c5b 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat @@ -1,5 +1,5 @@ -3.68869e-17 0.059231 -3.7165e-17 0.034785 -3.3136e-17 0.343963 -3.42537e-17 3.43808 -3.44041e-17 35.4666 +3.30626e-17 0.417286 +3.28675e-17 0.0167708 +3.29103e-17 0.168244 +3.2997e-17 1.69772 +3.29721e-17 17.5553 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat index 7b04a98c..21b54045 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat @@ -1,5 +1,5 @@ -1.92892e-08 0.050233 -1.85722e-08 0.03209 -1.83785e-08 0.313676 -1.85299e-08 3.26166 -1.8523e-08 32.4615 +1.61305e-08 0.0735512 +1.63403e-08 0.031625 +1.62899e-08 0.315323 +1.62863e-08 3.16128 +1.62782e-08 19.8034 diff --git a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl index 31516e7c..a8bbbe43 100644 --- a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl +++ b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl @@ -1,6 +1,8 @@ using DataFrames, CSV, StatsPlots +sizes = [500, 1000, 10000, 100000, 1000000] + f1=DataFrame(CSV.File("lapacke_single_precision.dat", delim=" ", header=false)) f2=DataFrame(CSV.File("lapacke_double_precision.dat", delim=" ", header=false)) f3=DataFrame(CSV.File("tuvx_single_precision.dat", delim=" ", header=false)) @@ -8,10 +10,10 @@ f4=DataFrame(CSV.File("tuvx_double_precision.dat", delim=" ", header=false)) lapack_errors_single_precision = f1[:, 1] -lapack_times_single_precision = f1[:, 2] +lapack_times_single_precision = f1[:, 2] tuvx_errors_single_precision = f3[:, 1] -tuvx_times_single_precision = f3[:, 2] +tuvx_times_single_precision = f3[:, 2] lapack_errors_double_precision = f2[:, 1] lapack_times_double_precision = f2[:, 2] @@ -19,7 +21,16 @@ lapack_times_double_precision = f2[:, 2] tuvx_errors_double_precision = f4[:, 1] tuvx_times_double_precision = f4[:, 2] -nam = repeat([500, 1000, 10000, 100000, 1000000], outer=2) +#scatter plots +#scatter(lapack_times_single_precision, lapack_errors_single_precision, label="LAPACKE SINGLE PRECISION") +scatter(lapack_times_double_precision, lapack_errors_double_precision, label="LAPACKE DOUBLE PRECISION") +scatter!(tuvx_times_double_precision, tuvx_errors_double_precision, label="TUV-X SINGLE PRECISION") +#scatter!(tuvx_times_single_precision, tuvx_errors_single_precision, label="TUV-X DOUBLE PRECISION") +savefig("scatter.png") + + +# bar plots +nam = repeat(sizes, outer=2) # julia has a weird way of ordering groups in bar plots (need to make it better) nam = [ n > 500 ? "$n" : " $n" @@ -35,7 +46,7 @@ savefig("single_precision_errors.png") data = [lapack_times_single_precision; tuvx_times_single_precision] groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups)) +plot(groupedbar(nam, data, groups=groups), yaxis=:log) title!("Comparing Speed (Double Precision)") xlabel!("System Size") ylabel!("Run Time (ms)") @@ -51,7 +62,7 @@ savefig("double_precision_errors.png") data = [lapack_times_double_precision; tuvx_times_double_precision] groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups)) +plot(groupedbar(nam, data, groups=groups), yaxis=:log) title!("Comparing Speed (Double Precision)") xlabel!("System Size") ylabel!("Run Time (ms)") diff --git a/tool/numerical_analysis/tridiagonal_solver/scatter.png b/tool/numerical_analysis/tridiagonal_solver/scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..0c20bf76e008d83fcdcc308547b950ee9558d285 GIT binary patch literal 20701 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 literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png index 8d4bf1417a5a490f0591f8c347e0e9f938832e65..b4aeccf9f260ea267db17931a98ac32749e60f54 100644 GIT binary patch literal 24556 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 T#Yqg~0}8RzW=7R%bf5kg^X_Xk literal 24701 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png index 2d6bfbab8b496e04aa245a49ee850184321ef320..ea32d75efefff0af302713b08e0fe8b17689180d 100644 GIT binary patch literal 21128 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 Lx_lPt(%t_H;H2lb literal 20928 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat index 623af233..5f27d44c 100644 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat @@ -1,5 +1,5 @@ -3.21499e-17 0.011642 -3.34579e-17 0.022342 -3.50134e-17 0.366204 -3.48084e-17 3.8547 -3.44588e-17 31.3497 +3.25666e-17 0.00575997 +3.27243e-17 0.0106145 +3.30318e-17 0.108197 +3.29515e-17 1.66856 +3.29829e-17 15.1904 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat index aac2ef50..0382c116 100644 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat @@ -1,5 +1,5 @@ -1.8298e-08 0.012343 -1.67409e-08 0.022292 -1.81911e-08 0.254255 -1.84027e-08 2.64913 -1.84169e-08 24.2951 +1.61895e-08 0.00851904 +1.61348e-08 0.0169347 +1.63005e-08 0.221691 +1.62871e-08 2.28039 +1.62731e-08 14.3214 From bdcb3a00eca99e461344dc2fa9dd18df2c15873d Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho1.hsn.de.hpc.ucar.edu> Date: Tue, 18 Jun 2024 13:31:14 -0600 Subject: [PATCH 05/51] modified plots generated in numerical_analysis --- test/unit/linear_algebra/test_lapacke.cpp | 5 ++--- .../test_tridiagonal_solver.cpp | 4 ++-- .../tridiagonal_solver/double.png | Bin 0 -> 24046 bytes .../tridiagonal_solver/double_errors.png | Bin 0 -> 17057 bytes .../double_precision_errors.png | Bin 20623 -> 21053 bytes .../double_precision_times.png | Bin 21189 -> 22007 bytes .../lapacke_double_precision.dat | 10 ++++----- .../lapacke_single_precision.dat | 10 ++++----- .../tridiagonal_solver/plot_analysis.jl | 20 +++++++++--------- .../tridiagonal_solver/scatter.png | Bin 20701 -> 21935 bytes .../tridiagonal_solver/single.png | Bin 0 -> 14495 bytes .../tridiagonal_solver/single_errors.png | Bin 0 -> 16435 bytes .../single_precision_errors.png | Bin 24556 -> 25116 bytes .../single_precision_times.png | Bin 21128 -> 20515 bytes .../tuvx_double_precision.dat | 10 ++++----- .../tuvx_single_precision.dat | 10 ++++----- 16 files changed, 34 insertions(+), 35 deletions(-) create mode 100644 tool/numerical_analysis/tridiagonal_solver/double.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/double_errors.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/single.png create mode 100644 tool/numerical_analysis/tridiagonal_solver/single_errors.png diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp index 5ebbf002..01a6b15f 100644 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -37,7 +37,7 @@ const std::size_t number_of_runs = 100; /// sizes to check consistency TEST(LapackeTest, SinglePrecision) { - std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecf errors(5, 0); vecd times(5, 0); @@ -91,8 +91,7 @@ TEST(LapackeTest, SinglePrecision) /// sizes to check consistency TEST(LapackeTest, DoublePrecision) { - std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; - + std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecd errors(5, 0); vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index c4a7d21a..bd046f81 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -36,7 +36,7 @@ const std::size_t number_of_runs = 100; /// sizes to check consistency TEST(TridiagSolveTest, SinglePrecision) { - std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; float error = 0; vecd errors(5, 0); vecd times(5, 0); @@ -81,7 +81,7 @@ TEST(TridiagSolveTest, SinglePrecision) /// sizes to check consistency TEST(TridiagSolveTest, DoublePrecision) { - std::size_t sizes[5] = { 500, 1000, 10000, 100000, 1000000 }; + std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecd errors(5, 0); vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) diff --git a/tool/numerical_analysis/tridiagonal_solver/double.png b/tool/numerical_analysis/tridiagonal_solver/double.png new file mode 100644 index 0000000000000000000000000000000000000000..0da8ea9592890eaea39e95079637e423317d032e GIT binary patch literal 24046 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 P=ZUc0<6v2APCNHMAz+p{ literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/double_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_errors.png new file mode 100644 index 0000000000000000000000000000000000000000..14f0c41855cd69196b0a3f6be85e8aded418fa4d GIT binary patch literal 17057 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 SHgJo9pm0H1CY^Zw;r{?k{ive= literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png index 0c79fe93f97c2b01a1941dd70a30fadeace7f5f7..582987053c2fbcb8cad43ffb89ac7aea8fc2652b 100644 GIT binary patch literal 21053 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 literal 20623 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 INLL>IUwc&3asU7T diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png index 91e65d29cbace5d99f7924e72d8b627e90eac873..74ff3904028817a177fa4f567b920db49758efce 100644 GIT binary patch literal 22007 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 JWt~$(6996_kShQH literal 21189 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 H%Xj`8CtD0i diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat index 80997c5b..c9bdc9ec 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat @@ -1,5 +1,5 @@ -3.30626e-17 0.417286 -3.28675e-17 0.0167708 -3.29103e-17 0.168244 -3.2997e-17 1.69772 -3.29721e-17 17.5553 +3.29913e-17 0.0176367 +3.30137e-17 0.175568 +3.29986e-17 1.73411 +3.29744e-17 17.864 +3.29784e-17 188.188 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat index 21b54045..9d22993d 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat @@ -1,5 +1,5 @@ -1.61305e-08 0.0735512 -1.63403e-08 0.031625 -1.62899e-08 0.315323 -1.62863e-08 3.16128 -1.62782e-08 19.8034 +1.63141e-08 0.0319062 +1.62981e-08 0.315242 +1.63017e-08 3.15343 +1.62755e-08 18.4041 +1.63076e-08 166.735 diff --git a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl index a8bbbe43..2c9f6099 100644 --- a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl +++ b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl @@ -1,7 +1,7 @@ using DataFrames, CSV, StatsPlots -sizes = [500, 1000, 10000, 100000, 1000000] +sizes = [1000, 10000, 100000, 1000000, 10000000] f1=DataFrame(CSV.File("lapacke_single_precision.dat", delim=" ", header=false)) f2=DataFrame(CSV.File("lapacke_double_precision.dat", delim=" ", header=false)) @@ -22,11 +22,11 @@ tuvx_errors_double_precision = f4[:, 1] tuvx_times_double_precision = f4[:, 2] #scatter plots -#scatter(lapack_times_single_precision, lapack_errors_single_precision, label="LAPACKE SINGLE PRECISION") -scatter(lapack_times_double_precision, lapack_errors_double_precision, label="LAPACKE DOUBLE PRECISION") -scatter!(tuvx_times_double_precision, tuvx_errors_double_precision, label="TUV-X SINGLE PRECISION") -#scatter!(tuvx_times_single_precision, tuvx_errors_single_precision, label="TUV-X DOUBLE PRECISION") -savefig("scatter.png") +bar(string.(sizes), lapack_errors_single_precision.-tuvx_errors_single_precision) +savefig("single_errors.png") + +bar(string.(sizes), lapack_errors_double_precision.-tuvx_errors_double_precision) +savefig("double_errors.png") # bar plots @@ -40,14 +40,14 @@ data = [lapack_errors_single_precision; tuvx_errors_single_precision] groups = repeat(["LAPACKE", "TUV-X"], inner = 5) plot(groupedbar(nam, data, groups=groups)) title!("Comparing Accuracy (Single Precision)") -xlabel!("System Size") ylabel!("Relative Error") +xlabel!("System Size") savefig("single_precision_errors.png") -data = [lapack_times_single_precision; tuvx_times_single_precision] +data = [lapack_times_single_precision ./ sizes; tuvx_times_single_precision ./ sizes] groups = repeat(["LAPACKE", "TUV-X"], inner = 5) plot(groupedbar(nam, data, groups=groups), yaxis=:log) -title!("Comparing Speed (Double Precision)") +title!("Comparing Speed (Single Precision)") xlabel!("System Size") ylabel!("Run Time (ms)") savefig("single_precision_times.png") @@ -60,7 +60,7 @@ xlabel!("System Size") ylabel!("Relative Error") savefig("double_precision_errors.png") -data = [lapack_times_double_precision; tuvx_times_double_precision] +data = [lapack_times_double_precision ./ sizes; tuvx_times_double_precision ./ sizes] groups = repeat(["LAPACKE", "TUV-X"], inner = 5) plot(groupedbar(nam, data, groups=groups), yaxis=:log) title!("Comparing Speed (Double Precision)") diff --git a/tool/numerical_analysis/tridiagonal_solver/scatter.png b/tool/numerical_analysis/tridiagonal_solver/scatter.png index 0c20bf76e008d83fcdcc308547b950ee9558d285..f8bfec27f8df000155d81336abe0ea47f67c2549 100644 GIT binary patch literal 21935 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 literal 20701 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/single.png b/tool/numerical_analysis/tridiagonal_solver/single.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4d0b78dc830e98d9e3a4d48c4817fb6762f168 GIT binary patch literal 14495 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 PBs+ITSuUAy<NkjGRwhS6 literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_errors.png new file mode 100644 index 0000000000000000000000000000000000000000..843e6c7780400434e8a5ba69be116e0762922f2d GIT binary patch literal 16435 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 literal 0 HcmV?d00001 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png index b4aeccf9f260ea267db17931a98ac32749e60f54..1c39ea09b9d06ad0841fa98eb6e0a4847b965b24 100644 GIT binary patch literal 25116 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 AZvX%Q literal 24556 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 T#Yqg~0}8RzW=7R%bf5kg^X_Xk diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png index ea32d75efefff0af302713b08e0fe8b17689180d..b2e9fa432076abd8a61ddf09120470207604c27b 100644 GIT binary patch literal 20515 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 Ll1v)$#-slWEo{Q~ literal 21128 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 Lx_lPt(%t_H;H2lb diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat index 5f27d44c..edd516e8 100644 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat @@ -1,5 +1,5 @@ -3.25666e-17 0.00575997 -3.27243e-17 0.0106145 -3.30318e-17 0.108197 -3.29515e-17 1.66856 -3.29829e-17 15.1904 +3.30033e-17 0.0106112 +3.29421e-17 0.108319 +3.29942e-17 1.68017 +3.29831e-17 15.0755 +3.29797e-17 146.831 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat index 0382c116..c4b647b2 100644 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat @@ -1,5 +1,5 @@ -1.61895e-08 0.00851904 -1.61348e-08 0.0169347 -1.63005e-08 0.221691 -1.62871e-08 2.28039 -1.62731e-08 14.3214 +1.61746e-08 0.016908 +1.62785e-08 0.227215 +1.62936e-08 2.232 +1.62759e-08 16.4258 +1.63053e-08 107.242 From b1b5ff48c230f431209ed4ed403c6ac1cf8204e5 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho3.hsn.de.hpc.ucar.edu> Date: Wed, 26 Jun 2024 11:08:29 -0600 Subject: [PATCH 06/51] include the correct LAPACK package based on the compiler used --- include/tuvx/linear_algebra/banded_matrix.hpp | 21 +++++++++++++++++++ src/CMakeLists.txt | 8 ++++++- test/unit/linear_algebra/test_lapacke.cpp | 7 ++++++- tool/numerical_analysis/analysis.ipynb | 0 .../lapacke_double_precision.dat | 10 ++++----- .../lapacke_single_precision.dat | 10 ++++----- 6 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 include/tuvx/linear_algebra/banded_matrix.hpp create mode 100644 tool/numerical_analysis/analysis.ipynb diff --git a/include/tuvx/linear_algebra/banded_matrix.hpp b/include/tuvx/linear_algebra/banded_matrix.hpp new file mode 100644 index 00000000..e6d79fa2 --- /dev/null +++ b/include/tuvx/linear_algebra/banded_matrix.hpp @@ -0,0 +1,21 @@ +#include <vector> + +namespace tuvx +{ + + template<typename T> + struct BandedMatrix + { + // data fields + std::size_t size_; + std::size_t bandwidth_up_; + std::size_t bandwidth_down_; + std::vector<std::vector<T>> band; + // constructor + BandedMatrix<T>(std::size_t size, std::size_t up, std::size_t down); + }; + + template<typename T> + std::vector<T> Dot(const BandedMatrix<T>& A, const std::vector<T>&); + +} // namespace tuvx diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb4e571c..698d2a6e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,6 +22,12 @@ message(STATUS "lapack libraries: ${LAPACK_LIBRARIES}") target_link_libraries(tuvx_object PRIVATE PkgConfig::netcdff PkgConfig::netcdfc yaml-cpp::yaml-cpp) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "IntelLLVM") + target_compile_definitions(tuvx_object PUBLIC TUVX_COMPILE_WITH_INTEL) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_compile_definitions(tuvx_object PUBLIC TUVX_COMPILE_WITH_GCC) +endif() + if(BLAS_LIBRARIES) target_link_libraries(tuvx_object PRIVATE ${BLAS_LIBRARIES}) else() @@ -44,7 +50,7 @@ set_target_properties( VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) -target_link_libraries(tuvx PRIVATE tuvx_object) +target_link_libraries(tuvx PUBLIC tuvx_object) message( STATUS diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp index 01a6b15f..c24d1211 100644 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -9,10 +9,15 @@ #include <cstring> #include <ctime> #include <fstream> -#include <lapacke.h> #include <limits> #include <vector> +#ifdef TUVX_COMPILE_WITH_INTEL + #include <mkl_lapacke.h> +#elif TUVX_COMPILE_WITH_GCC + #include <lapacke.h> +#endif + using namespace tuvx; using std::chrono::duration; using std::chrono::duration_cast; diff --git a/tool/numerical_analysis/analysis.ipynb b/tool/numerical_analysis/analysis.ipynb new file mode 100644 index 00000000..e69de29b diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat index c9bdc9ec..1a5f7f9b 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat @@ -1,5 +1,5 @@ -3.29913e-17 0.0176367 -3.30137e-17 0.175568 -3.29986e-17 1.73411 -3.29744e-17 17.864 -3.29784e-17 188.188 +0 0.0312956 +0 0.229959 +0 2.2255 +0 22.7488 +0 240.375 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat index 9d22993d..28e881b1 100644 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat +++ b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat @@ -1,5 +1,5 @@ -1.63141e-08 0.0319062 -1.62981e-08 0.315242 -1.63017e-08 3.15343 -1.62755e-08 18.4041 -1.63076e-08 166.735 +0 3.46066 +0 0.295798 +0 3.97411 +0 25.0105 +0 238.504 From dee5d7bd0453a83f49c4185dfe2f300b3ec7d3a6 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Wed, 26 Jun 2024 13:18:46 -0600 Subject: [PATCH 07/51] Apply suggestions from code review formatting changes Co-authored-by: Kyle Shores <kyle.shores44@gmail.com> --- CMakeLists.txt | 19 +++++++++---------- cmake/dependencies.cmake | 4 ++-- cmake/test_util.cmake | 10 +++++----- src/CMakeLists.txt | 4 ++-- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d090616..076cce66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# ############################################################################## +################################################################################ # Preamble cmake_minimum_required(VERSION 3.17) @@ -36,7 +36,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -# ############################################################################## +################################################################################ # Projet wide setup options include(CMakeDependentOption) @@ -94,12 +94,12 @@ if(TUVX_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -# ############################################################################## +################################################################################ # Dependencies include(cmake/dependencies.cmake) -# ############################################################################## +################################################################################ # TUV-x targets add_subdirectory(src) @@ -115,8 +115,7 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(tuv-x PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp - ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) +target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp) target_include_directories( tuv-x PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> @@ -126,14 +125,14 @@ if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -# ############################################################################## +################################################################################ # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -# ############################################################################## +################################################################################ # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -157,7 +156,7 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) add_subdirectory(test) endif() -# ############################################################################## +################################################################################ # Packaging # only include packaging if we are the top level project being built @@ -165,4 +164,4 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -# ############################################################################## +################################################################################ diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index b491e5db..d94537c0 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -89,5 +89,5 @@ if(TUVX_ENABLE_TESTS) set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() -# ############################################################################## -# ############################################################################## +################################################################################ +################################################################################ diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index 06e057c7..d228637f 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -1,11 +1,11 @@ -# ############################################################################## +################################################################################ # Utility functions for creating tests if(TUVX_ENABLE_MEMCHECK) find_program(MEMORYCHECK_COMMAND "valgrind") endif() -# ############################################################################## +################################################################################ # impose that one test runs after another so that we can safely test in parallel function(add_test_dependency run_second run_first) @@ -40,7 +40,7 @@ function(create_standard_test) add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY}) endfunction(create_standard_test) -# ############################################################################## +################################################################################ # build and add a standard test (one linked to the tuvx library) function(create_standard_cxx_test) @@ -108,7 +108,7 @@ function(add_tuvx_test test_name test_binary test_args working_dir) endif() endfunction(add_tuvx_test) -# ############################################################################## +################################################################################ # Setup regression tests. Add dependencies between each regression test and its # memcheck test. Also add a dependence with any previous tests. Becuase TUV-x # outputs to the same location, concurrent runs of the standalone tool that @@ -129,7 +129,7 @@ function(add_regression_test test_name command memcheck_command) endfunction(add_regression_test) -# ############################################################################## +################################################################################ # Link tuv-x to a test and add it to the suite as a bash script macro(add_std_test_script test_name script_path) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 698d2a6e..b8184cc1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -# ############################################################################## +################################################################################ # Photo-decomp tool source # object library @@ -104,4 +104,4 @@ add_subdirectory(quantum_yields) add_subdirectory(radiative_transfer) add_subdirectory(spectral_weights) add_subdirectory(util) -# ############################################################################## +################################################################################ From 830184d9d021a60fd5758b0d44c3c52a004c35bc Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho3.hsn.de.hpc.ucar.edu> Date: Wed, 26 Jun 2024 16:56:42 -0600 Subject: [PATCH 08/51] seperated tests and benchmark (used google benchmark) --- CMakeLists.txt | 21 ++-- benchmark/CMakeLists.txt | 13 +++ benchmark/benchmark_tridiagonal_solver.cpp | 108 ++++++++++++++++++ cmake/dependencies.cmake | 18 ++- include/tuvx/linear_algebra/banded_matrix.hpp | 21 ---- .../tuvx/linear_algebra/linear_algebra.inl | 7 +- test/unit/linear_algebra/test_lapacke.cpp | 38 +----- .../test_tridiagonal_solver.cpp | 37 +----- tool/numerical_analysis/analysis.ipynb | 0 .../tridiagonal_solver/double.png | Bin 24046 -> 0 bytes .../tridiagonal_solver/double_errors.png | Bin 17057 -> 0 bytes .../double_precision_errors.png | Bin 21053 -> 0 bytes .../double_precision_times.png | Bin 22007 -> 0 bytes .../lapacke_double_precision.dat | 5 - .../lapacke_single_precision.dat | 5 - .../tridiagonal_solver/plot_analysis.jl | 70 ------------ .../tridiagonal_solver/scatter.png | Bin 21935 -> 0 bytes .../tridiagonal_solver/single.png | Bin 14495 -> 0 bytes .../tridiagonal_solver/single_errors.png | Bin 16435 -> 0 bytes .../single_precision_errors.png | Bin 25116 -> 0 bytes .../single_precision_times.png | Bin 20515 -> 0 bytes .../tuvx_double_precision.dat | 5 - .../tuvx_single_precision.dat | 5 - 23 files changed, 155 insertions(+), 198 deletions(-) create mode 100644 benchmark/CMakeLists.txt create mode 100644 benchmark/benchmark_tridiagonal_solver.cpp delete mode 100644 include/tuvx/linear_algebra/banded_matrix.hpp delete mode 100644 tool/numerical_analysis/analysis.ipynb delete mode 100644 tool/numerical_analysis/tridiagonal_solver/double.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/double_errors.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/double_precision_times.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat delete mode 100644 tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat delete mode 100644 tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl delete mode 100644 tool/numerical_analysis/tridiagonal_solver/scatter.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/single.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/single_errors.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/single_precision_times.png delete mode 100644 tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat delete mode 100644 tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat diff --git a/CMakeLists.txt b/CMakeLists.txt index 076cce66..0fb44a64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -################################################################################ +# ############################################################################## # Preamble cmake_minimum_required(VERSION 3.17) @@ -36,7 +36,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -################################################################################ +# ############################################################################## # Projet wide setup options include(CMakeDependentOption) @@ -94,12 +94,12 @@ if(TUVX_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -################################################################################ +# ############################################################################## # Dependencies include(cmake/dependencies.cmake) -################################################################################ +# ############################################################################## # TUV-x targets add_subdirectory(src) @@ -125,14 +125,14 @@ if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -################################################################################ +# ############################################################################## # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -################################################################################ +# ############################################################################## # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -156,7 +156,7 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) add_subdirectory(test) endif() -################################################################################ +# ############################################################################## # Packaging # only include packaging if we are the top level project being built @@ -164,4 +164,9 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -################################################################################ +# ############################################################################## + +# benchmarking +add_subdirectory(benchmark) +# +# ############################################################################## diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt new file mode 100644 index 00000000..e906b6cb --- /dev/null +++ b/benchmark/CMakeLists.txt @@ -0,0 +1,13 @@ +add_library(tuvx_benchmark_utils OBJECT) + +target_compile_features(tuvx_benchmark_utils PUBLIC cxx_std_11) + +# link benchmark library to sources in this file +target_sources(tuvx_benchmark_utils PUBLIC benchmark_tridiagonal_solver.cpp) +target_link_libraries(tuvx_benchmark_utils PUBLIC musica::tuvx LAPACK::LAPACK + benchmark::benchmark) +target_include_directories(tuvx_benchmark_utils PUBLIC ${LAPACK_INCLUDE_DIRS}) + +add_executable(benchmark_tridiagonal_solver benchmark_tridiagonal_solver.cpp) +target_link_libraries(benchmark_tridiagonal_solver + PUBLIC LAPACK::LAPACK benchmark::benchmark musica::tuvx) diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp new file mode 100644 index 00000000..d4da4103 --- /dev/null +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -0,0 +1,108 @@ +#include "mkl_lapacke.h" + +#include <tuvx/linear_algebra/linear_algebra.hpp> + +#include <benchmark/benchmark.h> + +#include <mkl_lapack.h> + +using namespace tuvx; +typedef TridiagonalMatrix<double> trid_matd; +typedef std::vector<double> vecd; + +typedef TridiagonalMatrix<float> trid_matf; +typedef std::vector<float> vecf; + +const std::size_t system_size = 1000; + +static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) +{ + vecf x(system_size); + vecf b(system_size); + trid_matf A(system_size); + + FillRandom<float>(A); + FillRandom<float>(x); + b = Dot<float>(A, x); + + // Perform setup here + for (auto _ : state) + { + LAPACKE_sgtsv( + LAPACK_ROW_MAJOR, + system_size, + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + } +} + +static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) +{ + vecd x(system_size); + vecd b(system_size); + trid_matd A(system_size); + + FillRandom<double>(A); + FillRandom<double>(x); + b = Dot<double>(A, x); + + // Perform setup here + for (auto _ : state) + { + LAPACKE_dgtsv( + LAPACK_ROW_MAJOR, + system_size, + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + } +} + +static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) +{ + vecd x(system_size); + vecd b(system_size); + trid_matd A(system_size); + vecd x_approx(system_size); + FillRandom<double>(A); + FillRandom<double>(x); + b = Dot<double>(A, x); + + // Perform setup here + for (auto _ : state) + { + x_approx = Solve<double>(A, b); + } +} + +static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) +{ + vecf x(system_size); + vecf b(system_size); + trid_matf A(system_size); + vecf x_approx(system_size); + FillRandom<float>(A); + FillRandom<float>(x); + b = Dot<float>(A, x); + + // Perform setup here + for (auto _ : state) + { + x_approx = Solve<float>(A, b); + } +} +// Register the function as a benchmark +BENCHMARK(BM_LAPACKE_DOUBLE_PRECISISON); +BENCHMARK(BM_LAPACKE_SINGLE_PRECISISON); +BENCHMARK(BM_TUVX_DOUBLE_PRECISISON); +BENCHMARK(BM_TUVX_SINGLE_PRECISISON); + +// Run the benchmark +BENCHMARK_MAIN(); diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d94537c0..0d6ead8c 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -68,7 +68,7 @@ if(TUVX_BUILD_DOCS) endif() # ############################################################################## -# google test +# google test and benchmark if(TUVX_ENABLE_TESTS) FetchContent_Declare( @@ -76,6 +76,11 @@ if(TUVX_ENABLE_TESTS) GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG be03d00f5f0cc3a997d1a368bee8a1fe93651f48) + FetchContent_Declare( + googlebenchmark + GIT_REPOSITORY https://github.com/google/benchmark.git + GIT_TAG main) # need main for benchmark::benchmark + set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) @@ -84,10 +89,17 @@ if(TUVX_ENABLE_TESTS) CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) + + set(BENCHMARK_DOWNLOAD_DEPENDENCIES ON) + set(BENCHMARK_ENABLE_GTEST_TESTS OFF) + set(BENCHMARK_ENABLE_ASSEMBLY_TESTS OFF) + set(BENCHMARK_ENABLE_TESTING OFF) + FetchContent_MakeAvailable(googlebenchmark) + # don't run clang-tidy on google test set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "") set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() -################################################################################ -################################################################################ +# ############################################################################## +# ############################################################################## diff --git a/include/tuvx/linear_algebra/banded_matrix.hpp b/include/tuvx/linear_algebra/banded_matrix.hpp deleted file mode 100644 index e6d79fa2..00000000 --- a/include/tuvx/linear_algebra/banded_matrix.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#include <vector> - -namespace tuvx -{ - - template<typename T> - struct BandedMatrix - { - // data fields - std::size_t size_; - std::size_t bandwidth_up_; - std::size_t bandwidth_down_; - std::vector<std::vector<T>> band; - // constructor - BandedMatrix<T>(std::size_t size, std::size_t up, std::size_t down); - }; - - template<typename T> - std::vector<T> Dot(const BandedMatrix<T>& A, const std::vector<T>&); - -} // namespace tuvx diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index c3afac66..3d67353e 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -32,7 +32,6 @@ namespace tuvx { T temp; std::size_t N = b.size(); - std::vector<T> x(N); // forward pass for (std::size_t i = 1; i < N; i++) { @@ -41,16 +40,16 @@ namespace tuvx b[i] -= temp * b[i - 1]; } // back substitution - x[N - 1] = b[N - 1] / A.main_diagonal_[N - 1]; + b[N - 1] = b[N - 1] / A.main_diagonal_[N - 1]; for (std::size_t i = N - 2;; i--) { - x[i] = (b[i] - A.upper_diagonal_[i] * x[i + 1]) / A.main_diagonal_[i]; + b[i] = (b[i] - A.upper_diagonal_[i] * b[i + 1]) / A.main_diagonal_[i]; if (i == 0) { break; } } - return x; + return b; } template<typename T> diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp index c24d1211..135474ef 100644 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ b/test/unit/linear_algebra/test_lapacke.cpp @@ -3,12 +3,9 @@ #include <gtest/gtest.h> #include <cfloat> -#include <chrono> #include <cstddef> #include <cstdlib> #include <cstring> -#include <ctime> -#include <fstream> #include <limits> #include <vector> @@ -19,10 +16,6 @@ #endif using namespace tuvx; -using std::chrono::duration; -using std::chrono::duration_cast; -using std::chrono::high_resolution_clock; -using std::chrono::milliseconds; typedef TridiagonalMatrix<double> trid_matd; typedef std::vector<double> vecd; @@ -34,6 +27,7 @@ const double tol_dp = std::numeric_limits<double>::epsilon(); const float tol_sp = std::numeric_limits<float>::epsilon(); const std::size_t number_of_runs = 100; +const std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; /// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, @@ -42,9 +36,7 @@ const std::size_t number_of_runs = 100; /// sizes to check consistency TEST(LapackeTest, SinglePrecision) { - std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecf errors(5, 0); - vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { @@ -58,7 +50,6 @@ TEST(LapackeTest, SinglePrecision) FillRandom<float>(x); b = Dot<float>(A, x); - auto clock_start = high_resolution_clock::now(); LAPACKE_sgtsv( LAPACK_ROW_MAJOR, sizes[i], @@ -68,25 +59,13 @@ TEST(LapackeTest, SinglePrecision) A.upper_diagonal_.data(), b.data(), 1); - auto clock_end = high_resolution_clock::now(); - duration<double, std::milli> elapsed_time = clock_end - clock_start; // to be written to a file errors[i] += ComputeError<float>(x, b); - times[i] += elapsed_time.count(); } errors[i] /= number_of_runs; - times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_sp); } - - // Open the file for output as text: - std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat"); - for (std::size_t i = 0; i < 5; i++) - { - file << errors[i] << " " << times[i] << std::endl; - } - file.close(); } /// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. @@ -96,7 +75,6 @@ TEST(LapackeTest, SinglePrecision) /// sizes to check consistency TEST(LapackeTest, DoublePrecision) { - std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecd errors(5, 0); vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) @@ -111,7 +89,6 @@ TEST(LapackeTest, DoublePrecision) FillRandom<double>(x); b = Dot<double>(A, x); - auto clock_start = high_resolution_clock::now(); LAPACKE_dgtsv( LAPACK_ROW_MAJOR, sizes[i], @@ -122,22 +99,9 @@ TEST(LapackeTest, DoublePrecision) b.data(), 1); - auto clock_end = high_resolution_clock::now(); - duration<double, std::milli> elapsed_time = clock_end - clock_start; - errors[i] += ComputeError<double>(x, b); - times[i] += elapsed_time.count(); } errors[i] /= number_of_runs; - times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_dp); } - - // Open the file for output as text: - std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat"); - for (std::size_t i = 0; i < 5; i++) - { - file << errors[i] << " " << times[i] << std::endl; - } - file.close(); } diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index bd046f81..cc9c578d 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -3,20 +3,12 @@ #include <gtest/gtest.h> #include <cfloat> -#include <chrono> #include <cstddef> #include <cstdlib> -#include <ctime> -#include <fstream> -#include <iterator> #include <limits> #include <vector> using namespace tuvx; -using std::chrono::duration; -using std::chrono::duration_cast; -using std::chrono::high_resolution_clock; -using std::chrono::milliseconds; typedef TridiagonalMatrix<double> trid_matd; typedef std::vector<double> vecd; @@ -29,6 +21,8 @@ const float tol_sp = std::numeric_limits<float>::epsilon(); const std::size_t number_of_runs = 100; +std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; + /// @test Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed @@ -36,10 +30,8 @@ const std::size_t number_of_runs = 100; /// sizes to check consistency TEST(TridiagSolveTest, SinglePrecision) { - std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; float error = 0; vecd errors(5, 0); - vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { for (std::size_t j = 0; j < number_of_runs; j++) @@ -52,26 +44,15 @@ TEST(TridiagSolveTest, SinglePrecision) FillRandom<float>(x); b = Dot<float>(A, x); - auto clock_start = high_resolution_clock::now(); vecf x_approx = Solve<float>(A, b); - auto clock_end = high_resolution_clock::now(); - duration<double, std::milli> elapsed_time = clock_end - clock_start; errors[i] += ComputeError<float>(x, x_approx); - times[i] += elapsed_time.count(); } errors[i] /= number_of_runs; - times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_sp); } - // Open the file for output as text: - std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat"); - for (std::size_t i = 0; i < 5; i++) - { - file << errors[i] << " " << times[i] << std::endl; - } } /// @test Tridiagonal Solver Test for Double Precision Floats. @@ -81,9 +62,7 @@ TEST(TridiagSolveTest, SinglePrecision) /// sizes to check consistency TEST(TridiagSolveTest, DoublePrecision) { - std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; vecd errors(5, 0); - vecd times(5, 0); for (std::size_t i = 0; i < 5; i++) { for (std::size_t j = 0; j < number_of_runs; j++) @@ -96,23 +75,11 @@ TEST(TridiagSolveTest, DoublePrecision) FillRandom<double>(x); b = Dot<double>(A, x); - auto clock_start = high_resolution_clock::now(); vecd x_approx = Solve<double>(A, b); - auto clock_end = high_resolution_clock::now(); - duration<double, std::milli> elapsed_time = clock_end - clock_start; - times[i] += elapsed_time.count(); errors[i] += ComputeError<double>(x, x_approx); } errors[i] /= number_of_runs; - times[i] /= number_of_runs; EXPECT_LE(errors[i], tol_dp); } - // Open the file for output as text: - std::ofstream file("../tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat"); - for (std::size_t i = 0; i < 5; i++) - { - file << errors[i] << " " << times[i] << std::endl; - } - file.close(); } diff --git a/tool/numerical_analysis/analysis.ipynb b/tool/numerical_analysis/analysis.ipynb deleted file mode 100644 index e69de29b..00000000 diff --git a/tool/numerical_analysis/tridiagonal_solver/double.png b/tool/numerical_analysis/tridiagonal_solver/double.png deleted file mode 100644 index 0da8ea9592890eaea39e95079637e423317d032e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24046 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 P=ZUc0<6v2APCNHMAz+p{ diff --git a/tool/numerical_analysis/tridiagonal_solver/double_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_errors.png deleted file mode 100644 index 14f0c41855cd69196b0a3f6be85e8aded418fa4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17057 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 SHgJo9pm0H1CY^Zw;r{?k{ive= diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_errors.png deleted file mode 100644 index 582987053c2fbcb8cad43ffb89ac7aea8fc2652b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21053 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/double_precision_times.png deleted file mode 100644 index 74ff3904028817a177fa4f567b920db49758efce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22007 zcmeFZcR1Gn|30jxE2*SNRA?YOBP--evZ;^|SrI}qvKvOFk`UP=BQx2%s3atNW@Yc} z?RQ>%?(gxtzsL8F`?&AF?mvFl`#AJ=xvtlEj>qGCoagy?Jylh{w1<M8f{cu8kDRRZ z6*97|nq*{KUJ<t9o%L%^Yw-`cfx;zevQ5%|QN;=VWMoWaa?(<2_ru12o9G;@DBn4q zPn;?yXudkmMyvKIk;z`b?0H?{e#31q{-(>k*zw|w{fo<nQ{P%?oWDGZ+8>*!Nk+q< zB<1AiWbLq86wDerFTDSNmDJ>->*pa$%Sn6tw&L!I$?=p2`gFL6s5Fo4-?)ee?H){O zyHB4!UH9+BqgRqLk&~z@EBih8jG@^8lehHor!QU<+fTHYd+(c_nOU+rU*qZF@tjez zghlYM*IRMtg(UT4wcqdPwX)6Bt*xysEiLDpl*5G2+^P;99yWE;iZkPTYf&A1=HAfH z)MagMojhLr<@<M8^{j-L7=!wEa$*jXYG1uu=*dUZ*VfiV?hUrKwcXwP^MYP*<!=S! zZVC#sLOaF?fByr_((HjVB6TS#DRr@z%+1a39s20+-|*$>fn^Js8o}H3(o9s1?*>0V z-nol;=e}b`3TLgls>78I95}FZr+3<o!k-c1V%*%y#!4IRZf<TKuim|TH=0~m-I{CF z?H<{eVOWtjn;aW!XksE{-Sep`h-Y(gUwZVjXB5OIK0XRH-7~Ybk_U)qEn1^uSa$5( ziSx6vvL+ADF0*P#<q*SPy?RAOMfEBmz{tRWnvQOGe4LYt@Y>(MysXS^?QezT=Gtt1 zoI>{RZ~Lk{Itry8lW%?aAonyaEv@}{>)%R$)|{N2$2<2~wtmpp)$M9XP^pcSEH!UQ zn;&bLZGOE^`M6(oh+x(4-|Id+C93x;+uI8qX9wr*Vq&w+Texo&WZ90?GhgtsXwRzr z^2KBEThg2N?{9~my+dFQ3=C9>I443n&7X>vbiK_Qq3&s3yJ*$np`oFk9@W`gVPWB= z<z+$BU*|6>QS92)mTi6w^WRnMtS+#tq{*K8v3&o)fS_e(FcshZ>7KPUmq`U26bB#0 zXYORDN?gygW@i3UQIU|96`-xFp+QSeuce)uq`PO4Fyhb|B50oHY3pmfG~L@-HZwD` zzPi|ueuI%Q^5e&k`#Sqdo0^X?I~cxCNm<)io!Z4LDk^&Y`t?m$YR30&>nl&CV*&yK z+AY6(KNK%pxjj-JCnqN-AtAB4ICbc$bZ5{PgTG6E|0Hizm)earPjuu~{rE9HF;QqY z7C&7m!NtXO;zaD-Ki}fx<AtociX3O-y}Z0iOC`nW<p`DEzvo%^67B7CLPND{Bg8$+ z+?6FUB&;kfTGy|)wY8l(c~U3eCJxKZxav(wNlB-fnwgoIqGGkrAs#xfyEZm6i;LHU zM}yzKU7i_GaCUZ9P^iMX(<!u1&C9#r|K0D_ty}w!onzzSS)7}DCs<Wg#dz-iO(Ubm ztlJG?VPPLWe5kIjmU%%xKlxi*MMXuwfU;bt*a^QChJ=Jfy39QF_O3|2mR{e`z;M>W z)Y5VzXW$48%|*hly?dMM>U!T`1@1c{{K^$qdzgVCIU!+abTlL|&~CCbe|&tLMJZ$s z2iBiVjERX+2;x4)%IYH>bM{WV?eH(D5lc%aCnsrXX&D(WKflWf%HcXUZUnkDwq=^= zmAKqCG(12>b<@IPEywZl2jeQ*49#;!-(NX2H`dqFi`tqF{S5EOx#PUPGXH`>$Zher zLnp<lQ>S`+doeWz8Lj2zv4#~dJ2%D3c^xJ@>zbSG9UO*AID~|RL`2$}o14FVlhJ>M z1$2m8=l)Fp)97e@j6TiYjZ!7dyOB|Urb#V<d2(_RLvHZb*?r5iuYIQ!-i&wT@?buX zA2;~^in+5%OhiQF`0?XBJXXJ=q!21%tmKrHOKb+@Z{3Rb^z@93WL)>uYASYKwCpaq zp{jb**tjWPiD9z-$<wEoH6?8F*S@`AP>GbN`T6rKKfifnqMxttzCvzeW8>ocf6G39 z{#;h}NbD(QX?l7(D@(xD)s=@QT_aWNu3n&g+~QPsOH<RG=9KID`n?#khWdI8xYPWo zx?T3+GX`JYUrn%|>|FliD_Jtdm*Qh4@<eI}I|s+eGv~j3Uqc!(*HfMO{0^zS0s@^S zu41`A$J;V@F(V9)cb7_PE1jfH)y{pXAB@4pdiywVqrkRzlKH5(QvlV>Z-;KBh;whn z0)K{!4Gj+3B-H2J(e|8g`1WlO(WO&#Zmoi+bPe(6yGEh&BKOsSBfW^*yO=Q$64pHr z($cuK+kXC>M2zgLt*)w?ou402cED1VT%S9@Y*g{`XcK2aiR&sgF~{<^);jgi@86j` z?mIe8v}JmSx?q?K9Ht_O16<lUY%Wt-R^1YUf`QuJ_L@CzzPq<S+J8cZZT!WJ5|_3g zKc1x;8X4IRR=*7y-yfflaDZ4;Tuk#LaB}}gM9}kuySBFdv=QeV>+9=Zi-{dOc5K(K zT^61{e#pm+AEBFgnSqU&<1x8kx9EP|*RP)I0$g0FdhY9it1@xU9+!NNW#{A!o-J=` z5|ofASs75Z^L-U#zB`=zMsb2t=vn6li-pA>2zH0Pkk@umQufD}sIr9#+<skld)%Zp z!VViizlM>|h~Sz%DpD2@aL|+Tga;i1Lnci?#0hLcK?e>dkGb(SepXiR)bq~F*|!^5 zI60rMinUf(kFU&+Q7A+uCd!_q&Mzp?C?%7mC6qZ0H>YZQP`SFUhuAWl=HQr}o@Vl( zq~q-&t+I%7ZAFfmet!Fz`+r4Wun?s8*u!wv*3M2GJ270$p*dYIJvo_!)@Ot~$7OkD zczF232VSQIQ>>M7=Mf>#)YR0sZ`&foov&QIiWt^b=wL;Z&9(g9ZzH0eiO5v-hRf&4 zllyB+7*ktW*(Yz_yup^z(xTV)w(Q@#cdxy@{aABqA(khGq@khVZSMBy@bK`6h^~E- zYg9Bec8FfJ606Ut`UVERx<%=5Pqk&TGM{8(>KUvFegFP_g)gInwe^SW>{C+|Wk@>v zi3qUe<>khFZ5>H<Oj#d3{AzCA7)gl4B`yrtohaxqGBorL3aV&+Cx>L3i&)Uw+KSt< zDp{6cqRJ~Qymx_==4`o@v67KBj~$zwno=Pg7O^?0&3fw8*I&O>Pf~N~<h=@yK?v~k zs}p-{y}7aO@#^%|c(#CRj2^aUcQM;~N9YG9CbDH{ro_c%W86GEJg|eF9}^Fus*jS| zw!pFE`WP3M<1p1VCz)+hdyJo-pZNXh0oGPC^~ciy4aDeQn9deGcT$i*R1Xum_r)M1 zHI++fSJD-F51afV{c^AIlf$DEJv}!K3_ju<-@kuH)b{Y${#LO$_R>D0Y)jgW+j5$k znuYcg1m<q{P4U&+cnL&%?>*`?@FNh5?MA+hF=jIMl5ads5;^m4dluy|x&sINLqePo zMloV8D<cUOo=H-9cRJ1%kWY3MuZ}b%T)uqyccBBT$9-q#YZ@B$q5=ejzCDzb@k*ig zm@eP~*Y)`p52{O-Dw2|g*1LKvLm7Ft>x)Z^tzxmpvjhs=X_wC3X=!#$(k;xgV_b&# z_!lCY^S3i6PkOAb1{Jt(N-)1e#<bYA9?#?vCgB>wm6DhkRXWC_lc%aQJIqpST6f%& zIzzMicXCt!IWw~nVsz(7z110eMxO;f2YdUp#KfD)zw_^TZxp0U5Hdf0JaY8th+1_` z4Kj17Mcc>LR!vVc3nEa9kG8Ud*-&kyO61_+;ON*G0|Ns`nA2Nc{jI&@4%p#-RDB~O zm3OR-jpMw%z0Wh<Uz%p-+C@Qe+@m@|JaqN)obyDul(6xSgK@LEu2g)K7xtaFbn#+c z0#JYll~e13i~Hy^eflulU%y^F?)Smd<YySOM_xg}$I`@uk5rHQwYIk-j@Flxa~4$8 za=XMOkw@!r>*d>=VwS#e;m<%-5T(id-hKOqN*uaNTs>YL6L+$99}Nr$04y>!Gb?eL zfA;3rrmUdr^JMbqoE-Z<-(Do&&LL902@I^;R4_6+seS3V-!H?|@ka*f3fFPi#Rk($ z(b~C|rxlIAJlXH@%AZw5qv5shj<gdg-W0oc?_wq=Cl`FLC^UbV|CY7NsfDTT?wT4d zLBaWjiH^=6SSf?YvSW9uF$h_nyZMPM=NI<cmoFzzpO(`nrlqC1uFUC2nwgreO}THL z@c8x1mBH!c0(L6Jz&3Kqo@0#3UN2tMT+?&?8qWRO(LnqD%G_<@cPw{70fAOCBo+-} z&7=TN&#zeZw`xL~KIoSt%i$7#0$w6>U-Y3Bvg}k%<fMLT`soAKo6N?>Au8faMoC>A zog;K~iN7wsA}1xikp`^ya4J6YW=_k;Uk&bBTl1Fl>g(%|Clud#HuYt)toa?^A@Mio zTRuI1{(P(@Jv21b_o&z#Z4;zT5B`=Zb0GiDKhs;bY^ezmRFIXuKR4`GzY@fKLtaH? zbFM*!W-n{KMC5p1(l;cq$NyfXE2GJ@Tw16l9#c_MQ<qJ=Y0J6O0c3B}eQ{F>^~FF$ zcT-c-`pQ^32RplI<iw93KTceF`Q)oX$PYmy3yZMua3vM{<}Xdj*Y4TaxVX3s^X!tp zdeuLTGCDfC^M{s}mTkFF-FkbHw!og2Yw5a8MFV!UqE(F-vRGxYt(DjtezUB^`kta9 zv}fI(ohD^gMki<I%z>Xje|DP9`MjRsDd%zrq>(;eS6^?idt`$mmww&AX}V{N_Ukuq zNYNc-MM7NMT^@zn%F4^Z9zdQ-gD-Qg>le&rUB7jU#dW2>@<1G8E08KaSvrgSJdYtM z0JsOT?8Mv1@<40Pe0`_dv(0U71)Se*3FlsXew6vk@835rTzEWLzH9rVLWimPg<pv` z>s%ipyR8Ihh`DbRmDL7d6CNO<CfUUdc#GE_dI42oN#Kb1_wVH#%95lGl|)DPikaw1 zUB0}3Rc0m9?%utt!&Hq)>KuNub8{mNsD>=xHK`)y<g4u1DwV8}irq5T^LbmG`HmYp zhYug7Pza=o!NCq)n@4H~h>&LlOm!G-yp8Fm_+4|*Y2`!1o;`ck0gmzp?%uuIKjq#q zJ5;M6FOT@4q@>i{M%g@E7aPQRy>Al1(0LKlOUhqZmrae=3SJx_n&$FNlFJfqcjjf3 zNnX@<*01aSGIgZ8C-wnTiZ@czF6O6CpU#bCul)G>^{WS!XS%}7V!KLdizbEZiQ7D6 zp8V4mBC~@89(7hJg;qHffxtJweU8q~zVw1W8XMJ4Qe*RTA`Y_npDxM`i3p?UYCe~* zqa2AH?^l{@mKNgh;a%r%((BR-`amR7Y%740RGs{p+-^5R4z(LwkNbVEuI5DXk(H&U zqQWC78A(M=L!)k|b`a%gj=7?g)E4G`+^70xJ_`#=*7TiCjc8R8#{a4Jcg~t9Cs$c$ z5*iy7^<cv&I^kM(GdafW>eU9o%$S(tPF_>RYQI&~HT{xuo>AE>PTp8h6;V)8NoSE8 z9~!!}sCV&rU5DEdwHwSRp0{uPjKrLzarVraXzdDY#9hqlg<mzSddob43_^vhHZT>Y zKSagE(r*;zVAacyHJqCLx#v|<LGdraXTNnd=QdY)+_;*g0CN&C8Q3QI`T0nzsVn@d z4<A01!lno4CZ=0DS&wf^8&G$@Tu*IJ&2cRa<&92(?dioJXBU@q#TqJhraML2RbD5X z$?a)tZ~qB`VQ#qY%$YNtGf4{PS^Nk3`>|D5CNBIjX-ZO`o9pWMW#+y<e=YM?O_#<c zJw3gVg9A2>_Vx>6CJ(*#>=_K%y?eKR)xg=aXO%((^gFI+??F-F=;(;TT7!zPee1)h z(Z%r&17Qvhh2F%xvS;reC>wu!et5GWw$#h(o7kmYi7T;RK7C>m5?VycZSoKof4x>> z9s;Pyt6%1^>ws>F%i;a|@2)NVy_%qmI(!NkkD{>3LP2)V*-wiX_c5r|wD|7-xxe`W zN>)9$<x|W?Z6A%Tl1~K6k8E=qSMFtEDCf=ca5kEfjA_|rt$@0$Jbe3v@dfQP)k|^1 zR-PCl>)n7+k?tGI>5~4(DAn@h`S|&-_Hyu?J*&YUSWsBlkY0zg9w2TYriBRPt(bu@ z(9qBz?KClWY@exf-13BI@AhG-KlJR}-0`dhC@3!~47)D?;@d`s(i}K&!oN~SM`ySz zSoY+{4<Bx>9?0mj|LJ?o#^?;?1%<Ahv}Wt~Zq`|)t+>PF_kTdyn3@KMglPHev8p3P z>>wuxhHwFp$KbN6M5t-K*bt)0xl1HW=<2TPH<_JtTMMQluD)~|r}CI@SX-Wb@%;JA zBO*i|L)H89>7^U=fOW3tOn)&Ezt>7`R*SFE(bKP>WJi7a;ZVY+1B$Q#%S7s@M!yT} zJYL}=VQ+ptRv3TFt7TI8`V?c*7At<+Vbwi*Ufk)(ImN>A(X%7hDqYUR1F%wE-2JqF zC8(*38xlLqUsnyFS{{7!tIKsx?>r+N9o-R8+hG!mk#NyhdOy)rvK+a-;jx<z?u7cO zhr}^q>z<DICFQJG)tZXb5{D^Wz_|m|)FEf@h`O%WYMI`?Ju)^H3M3nGGxiM<6QMW4 zkd(F%9FK-Sa9W;;tAG5=;}u|3#;hzs#BQ|lPlYdbRGRI%EkxPH$=?&><7MULx2?2y zj9*#r87{s3`OyxF(rpChfq{X!phQj1V`nXb)!2>2ZkGD1v2*e8Tw{B;^IE=-XEN>% zl`=Ss=TDy8+<l6A*HPu-(N=mvi*LY%z=GzjCaG!3sgp@jW`L2g6&2^i#jmAm*<qd} zH<k>`z4icF9wcl(Dry_mbdq}4ddXe_A<uT?ii^wIXj3xM%8spD7Gnrb%U?FuSM&X& zx?2DrRD%W9<qguE4SBNo&YlHda*s$P0^v*;9HOH7RAN5Sp6&4pnBbV0{WyvV_qD&? zD4WH<e=8pMbqnOsxu8@$@yN;3?A~BCv(?K}D5VXEPu{;DLFPbULA|4zp{b~yhfHlo zYjghmgPfd&LwYV5K&+rtbn~qB8{(Dbw9bf&i!aEN7Ze%-5yr;yJ1>j_Q&xQW@=N=C zYe&Z+TH23{OC46FyS8t=aG`w1Zd#q9`)AIcUGSCM(9E%T8yd>6_>s4LUqfBpU5o>u zG+2mTd-jB%G4u)yq!C-1M`~44RP-SB0`d<ZWK|3XDFb-0_Opt$-^S6OMTv6H9-6dY z2|+4(`S~^Y5JnXU>DU>A?S&l8fE>W}cgHSWx@3;MVrI4hw1Ua@dG-wC2-}Urc`d!a zvT|~BH`f=tV`E~@T6UTm8eVX|rC#hpVivl)CHeUHn3*5$m0+SGfRwD#NOn5fn}2U; zc;GoOl`HBA3yX354y4q8v*G_VGLLlGONk#sfvXakrpoPKX&N~M&}Y?=Gl3El)u5=$ z()2qye?>*b*50;{nVBPU>sz*wdjRNFROl7mzq_%vtmisUlNx2cERAT5N$Icj_hpoH zLuHkhmj~u7^zB=aZNb5GS_z|e9&^_`@fn=r&!0c23C<U~U=-gLpMO;xrK>N4E4x6r zUTDvi`)b2XpT~Z!m6<S>xwNz-;kv?hB&y-pFFFC!Ux2c$X5e%v65492s}GV7E=@@- zfx*C#`a847VH7(l6H`*ugt^<n%{YZ9HA#Kvtww>}Cb1ik3eo0Waesa+g<AIAKQeKb z-e8T##>TdpjeqAufz@X(V}19oe)($}dV2YE+kP7xn?Bum7XL~>#CO)7&sEvx78V9| zdtBC6>?WrTK>=corSxjX&gHEDy5)OPI7CKS+_|%plFqvS`~HQbt7!lt9Fz|S2L>)W z+hl;Tq4{PLid+C({`4agU~K=f9Zhw0m+5xMjeO_Zzkk2F%6m~^VYSW8bsk*#bLr!6 zvBrpp`2A%2hlUnc=FM}o<mD-f-+6;zx;&@u$y8lin_l1)92$DB#U$=T70M*fh}TAY zz~VU{3R$EeuJBJ{$eTFd`aXH^`RM3aArd}Pw#ltqe3XBBdVZC-I>)(YGfKGJUtO30 z!1CI|0H*1>zQE6-qM}ESwkjwn6a>kstEm;aEMEc7)SL7GH?5|jfkhbnP1n?PI7;d< zHt+(tY?Rs;FJ24`3d+T0Ag`+z(t*P5E_K&C?uY8Bp1I`8l`C0US*_+ds9NsbyH`_F zlN`~nA}9AAr611_X3phrpC?L^vQ{nmAy2B~K~?;Gd;$Ujrq}#HD2$`%Kq)ajGn3@D zs}$H5r2WXq2%r{t(NwMMD|zou^7A*ex3^bSjbRZlFE4{av{kc}l$4Asrj5HYQWGkK z1*&uXIta->{r&Ie^7QWB{Y&D3!opI(aTppld^D~~THgoK7a%#{&6``G`BJroK-aBw zM;Ep?egFB>vNP{4LS)<6p<T@BdZmNMD4Of*u>r4WK3A7J`5L7(BBde%35p+(NAhC) z-TC*x0m}exRa8{8wdI3l5EJWYYz&wv35|%*)zzKs>A}t&X5vI4hpcsV_)<tvP*7;7 z`JFqd(-)+;gSrbHc(}RKQc|kFeTxVE%%zo;SfXtQdK6pl<x6G3qhhy@0vzVrJv+_D zwltPr3U0^F))uP~bz^E)E#ht&K&8BbLTXBiR*psGMA5?B$W`ED%MDPi*wZFPMyBTG zLS~JLuB!{33V{?96xj913^cFP6BCDj1ajDh&Mz!zXet0R+1T(oXvYrIVjX>R)4F~8 zeQ|NIzyH-HA7e?4>?2>I$Xh?tnHMroF^h;?zjm#qu`#QtXsy(pzVOmgx8yUGtk6>q zEws>$L~~x2$%--x+P>MsgxV(pdm~OE==JN@28M<JgcD<9+FDwohTkYB_uaAM$G=#D zlX0)ekZ@69p%hc2lN*Zl8Y66ZqR7%w<jB9cJ^0NV4Ov-2@oZRoeN$6v`_Qq*FfT6| zkQ*+~M<+#yUi!GR;pt_IXzAm<FOS?pHabXw`Nm08Qd8Tm>djH|zUQNs2JSO9KIJ?Z zg)2vzCn3T@|01{bkgkekuWfcjCE%1LtVpD=<n|L$lb~|)5LHlf9gS^kX<5{Jp0#`y zLyO&(o1Go^=is*U;a40UTLTgxW<wjBbJ84be1CPWkN>H(4GI!e&ET{^N!`DH|I62} zdl)6cHatjQy|5`FD*91!Htx!8RB8f(f+KMakX`oe-D}wpUju{yCdJ&qz^3oZQ%1L? zXkbggzoD6ds%=}hn(60kA$y=_CqU2x4GGBx+&%Oio5!#0rh7g^6`JbE#q`QzT-grN z($I(q3-=EWQg{-Pj6})Kw4gdfC6%UIEdTgdON#?wG*HuxEK@&C&ImzsjYtVsXm7nk zLk>s>SYPavKlYN5&0je>!O0Kw63B6lU5Bh98{p%N;WsKGB_*Y4c4w!~)vH%mG>`jH zBJSX#!PI7L;5G~m3|g7b(Rn@f^-Wm3usA;-7ye*<eH}&qLeJ;NI7U;#>?blZ)fesK zocAzb)6>?LPZJVMe2<AEpbkw=>ejg0Bg9Z2IFP^C%+AGi6x2BYqkQCKYep<E0TRwg zU2Fwvz~?Vsl&($|A|7NqP@d-EGEVPCoOu^p;Wksr3esBpqmdlK|9tGRZDi+*FNaE* zT3Do5Uu2z#m_~7fUCOOja!ydt4p|y98%2vbisv!xx?78fpvvsrdqmi2&UB$99g*Oq zhp?#VF$tF?#9`{E?>>AWQI7~)Ji0}#rS6-cOW4`j`)%@7*$~SU8jd2uA+Fuf(ZLoV zUCI2d54h*e#FGS!4@qqq`gs)6(4=q`c;Lf=W@;7|7GRJNbNl}MxjG+_=J5)-w_(c+ z*gXhk@yW^Bnwr63VTx0{h^LF=ZRK5OvZ0e=`k}WNRul!vo}{OzCq{pOEWyqFv#YDC zy85{;Jq~;1@L{<MUL?Kv6S^q*av=JQC)AbN%{HDUBXhB4-&IytM!a_I8rVn3ua?VC z_MdQC7<UAph!En6HCS0$DPIv3bE5kI@yHPpc)oe_rZvtQ>9%qj{5PqB#fswCxpSx1 z5D+{z1qKGB>q!q10uvV}X_Fs5eguKTDDEUMAtArB4H6%)w1Bwa5;BhO5s`YFSw+S7 zTmLf}4kWK;j3<eIKeM`pEUM&+etI3L;=i8hRm>zLA<<P;#UUmZx>vLlikW({MqOQ- zdURA&6pI5LMuFmj_rXJlu1VVWrCiTMjZ&?f$wun~;vj}M&GNVOz8x+09HUfT`bmst zS5j}z_r&Nuw{x6l<KlXuP?@4y6q%8vIr{7deaEao#y+q>S2^7(xEbAt2$AO;`-X?V z?=9|*x#+W4Ffp{6Bu7C_OxhbY|8u_w%J=!Xx#3iM0y7jesELeUg=A3>kW<{OG~#<I zT~>U^Bcy!vv%0P>H}z8_L$g9=D?1e1`d5d7?C5JNzC8QLIkgrMu@vlk+tpNX*=CT3 zFgrV&f7sB}^!q~ZTAr2h$jkro0zj0=HE$uMu<YNj7FnpD=9SNp(Gm{5ArBh1!dto2 z6rLe(_Ed@b4j39-uifsj*gO#Tm+@~dqv5Sv8ft1^B)HhvRGoOJq4Z1qJ>&sY1znlv z^yz4oKYe{D3-5=D!UJ#xYXcz)5c?!6YtWlF-@be~=ez(#U~sS*>OQy^MDROpALC+T zh`njUIM~|NN|7>9?%?#jsA7_n8IBxTt7MH#xl#Cr>LXG?R1}k#m>B5k1FXu80|)A0 zIABqu_P|oV=ERVR+K=t|dva`)LWxJpn>b$5W2Wt7WZ7Q-erkj|MB+W-_aHqtIp>xZ z9XYwDyqno|6jn5XBYQr|-<I2QG%mjx+4|1#uV}^v{{0^K?l@}4&TR8T-{>3@a2`pg zx#7p|oR6r;q81$Q--iUzi1knaaj`yh&Q(+R5`m1&Y>(8xpWZTCdj6<tYJTtFGCxWE z^zq|uGNo4z5Qt<;!Y&d5(^_*%ezc6auTt)Z7aG+0UX54m)z?xTqw*k|zRQ-H$jO)y zC@^IB!L8=kTN)agbBct~tzjp&lO<|vr0ASh&7h6Y%@z-`BP<Zi+YrL_O5JK|vp`K^ zgE1ZKYuR@`95W@oQp@UkK~3=C^9skp(jHnsF`yN<*})q1u`WnHsD*LqmcI)Gb3LeH z;^GGS`lyc_vC!9-(hK1?d3l~m6I*cc0Lo1V2>sBm00rIMH!%;}wmpV?iYzrZ(Gf)T zIx<oc6f$r+<q=_Pz|y$5xN&Dv2!z7BPjptEiD3RVA!y&3j01#==M<AUCn}r1Tl4U& zQEz`Bgfc1Yoa2?-R9KOJQAWzh$Uq1-<hUd)4da0vi~mt!>zhb#85tRXb<mE$VH?ri z0)w)!u#hzaWDg`(Xx&=|zGbMt|A>f<5h^tBI|WYjNdN-i-ytL*D2+@^h=cnk$^x-M z9EDsp(h(|X{;hoc1TIgFog>u6Z<v0Tmn&91+?en1z5^>QIa947iwR$+(iWL{Df!*T zgLg<Kj$ab`RFR&NG7hE<1l{_0X01lLZfbhEN|l|RUFlNaZlWy0JGix}uHvyje=?mH zCxKiQxr0a=7^D)a*M5FyFkDD?$Q_|28K_wR62^xT;^Xb7y4EvmCA14{-=AlS@`R-X zf`rRYmPb^huPRg`Z=GFzzC`}_OhzH=q<CI!g$J30)}@z6{z6b*T(oNYH~_=R)@|Ep z*kNz@K41fA=cT`ZdxZ>?uOngEDeUxouFP{cBohmYD+o1nr1Xzqdk);xTYeK84on8f z%U=~>gbE7Sr&ymed5Fr?dT0s^8WPEA-v#@Qkhv6r91%45LLh$s?svjrqWvp*F91#u zkDl)3%OqlJ?@`e#v!+pik1OvRTUvssj{8>vJ+!0boSU<SZ6?=s>E%%|AW)Gz?E;=N za{eqJ!s{xK&UX_Cs+C1|nFw1((~yb~`D(MkxjlTiMY7?MZy8D{)V^*@z23pW!PxK8 z7cYXnIeWX_gH$IV;30~ltZpcEclVRc0t&}zz|{m%)ni<sijvA2Jv~Vto~b*Ll3)P9 z8SFVKI``?}HiN&C`nD+8j?nKQBN7~;x|hqmnCF~Weybzb?9&(1f~B{nxOcP!Oi4#a zN5kG24=QKpRs2Sh6+Ea=OF%Wv5X9~}N>4wEl?DleNGRt;KEr*j_WP^ED~JF1mar8F zefJ@5aFnrTv@?`a1l3EZtcHWzN_1a+s_hqGdE5B6L@mmUvfP>x>%|0V9ZMzp6!=gn zDJcv<`pUO$JNH8H)GM%k%5}TDWF2*9#q+}ra2)xaxOD8?{SQ))$tlajB;6&1gdE_H z$qLEHI8##w;c=q7G_r=6bIM{LePG!sV=}T)WwwKZ{r#pkNANXN>{zN6;qZz;AC!@n zR&!kiQI3rIjq5PL3;v(Lj1tkjF2)n)B~Th5257l;hWq-;QspvvPoKUG1@_8&wF?(w zF|ro?sJ{|IMBKJ55Vnww(mp&NWjFNXR`WI**OH<X*}1`pH>IWSO{;6CjY2g!VG4-y zMZ(PI`JH$7LT@psk%)7Se9Y3<t~p=~%$rj%DKxpeO*J*?wA)%+m%w1oow53pbdQ;I z^fwuX-?B`*bmII?e?>i%m(+V0AAbvBU^%SMS&C{aStA!@3Fzse@~jVaFY6!*KPWIB zct*3^Ei66teNrLw52KlQrK3|{zQKGYDf;j4aamb&+O=N(9b!qtvylTq+c%fL$(4XL zstp&*HLJnq$MRb6W^}W*v57eaDFxK@8YtDrj~=;!VdmiA$e989!XU}KJR%n<;W%T2 zl#Tonvn>+=vL^V<9|*;QLPFQ-T-MEp1u4j)CQ+J0%N4%c_XS`pLd?OkuN!70l8x*T z>az+Ua)!f);}Q}8*?qZqI5@OF+<X}ON3s{BAg7;f$>xUhiY*d5NO(Km9lJ2_59*EB z#d7X&QBD8-qnYylu+z%E1@axLW4Km`_ZJC}HTDy>&)uB|#hZ<Hrb<>{N{HK!2ZQ8c zjdUqX%|xjQ@&mpDCP6_#cpn4=)M#F8P9ag9Cot0l)-!4aoBAy0ooEfHQh^-4--9t5 zG_lHCK5Wfz4GsQOAF-+~$I6`6*@TU+1la~hq&akG6Fxj}+}Vw-4(F-1e%id3%iGx0 zbAn(eDCihWkr+@?vH@PfZFNFOMWvP$T_AcR(yJ%$*uI_Q6a+&GoVq6T(aZWJ6&YEV zJlnw^12zlq6<G`&R!MgQC&^Q3(#f%)v1j2yYQsMr9nMHlS;{aqpl%?cmHYR(vPy1! zAmwf=V{>zq<3A;o6cjQuGh=<l>_&}l-*#M?8v%yo*2;Q9l9lrfEA|oz;uI^GzPi;G zy+Zpt<E<GW&h2LRvbG{gKggvZ5U>|6+`W5-`6M%QFKWC_hV7^spii7&WgTizkv!!A zG8x+#FCpkySZk;qbaO3lJSN{m4p}bkhM1GpGf@HwOl+!f(n8?Ar$Ec8dDF_u%ESa7 zyPlz;T<Gaei#OPLc|Rm3n&P&`Q*Ez9M>B6qq7l0}g4773pk-Il`_b!5hpbHxl0{kW zCwL|tm^~K6JC(MQ9w5u^d3>Na2B8>C{8z3s0s?Cjx!vF^FJJb<i?~j{hrYkRpKYDZ zX^04=O5MPq&)qbe;y-&1Y^~6>zfm0|!&dqVss}TQW`=)T=PRs3!0m|>8j1T!sO7&v z*ngndfBUH$i@z#fx|DD|^A@q!dHn77ff@Pt&!4E-9a<GSv-Nu1t)q18#YIIfV2&Br z4F91rPB<=)`xUilqxfJ+Sy`X|-mTX7PRNM$`r6s?zv~??ieooGw@NOV97k|4dkZ=# zEp5`d_#*Tkre>xB7Iw3G23s3XV)WBpJPk>E{u^%l4|@Cm{8RPoECavE&x6y(?E#h9 z;^k(0NVrq=WPtpjoy{(@h9};)kGf3HT-N2@ci>U(=VQ!dWQl^?|Hn_TA!HBC&OFZ| zqLeMKZG;V{v$J#QEv+Ze>;tobQqJ!#BDZepxy93N@+IpW-|w^R!%8}gnvY-Th*{)v z$|=dK<{z2E^y%E<FZLe!A1C;qr~LotJAXTLWo2da+&A4|szhmoMTi`9=gysFi^IV4 z`wl+l6%lbnjzvC~Q&6~i|2^zPhTonqBND%O@xsyUC~A>s>-S8vqM~ksY~kkSF5TQ% zHHmc1vFa`Xj`;HB3;6G@yt{_jIp8lg5SNY~J=&6T9h#eY2C57)#vhW-9{AA9r%%D# zD}ui9EED>96qR@*s!2AsMDRmU?tN&vu<xzy?FWmqN#AOflv-LIiu9#B6SD&R&<-4f zlmvB=-I9*<_l;e|8#jK3lw4YC<~~b$<Iq5m$~kw?D6>Oz8EWh|0Ag`i_vL{@Zxz28 zcHkpw%8pbZIu-#R=Kg}G1gLNVoX6fFIru6-^pGWny=LO%;!={81tw(m;HAvOfB>oj zq1ytNLg@mHI9Tk5qb0?hBtXq2FvH&E@d`{knAuOC&J$(9>71kn`@vVrh0UwVd`ij` zq!twcjN&e4ux<qf1)wZFUd_zd5D6<jTglG5#=P510NO@`20=xS(1x?3AON3ufC%b? zjf#NWcHinGW+RDhiW4R?S}%QEz8TzH245+(@*tJL%?Su_EOaL-JFOq-1lzlJk)Ql3 zjgI?0;iBBNtM1pYo@9MoxJ%+>{e4Rm(AKI4fnp+a$@QUb!0-%)E6#fV`Wr57wQhEN zFoJDg8MrRxa8Y#_X<-G_FGa41lDJIm0R#EZFcIh%O~5J8u9mG1;0sm(bM)Y(!Fh%Q zeq6zaN5ygX$Xr%dk*{Buxtrrd_v23zJc+#pc4LsTkX<U=ALHGncSV_s!2B03Tma#E z2Z-(F%}=gRi^Xx=^WstG2%vISSEot=)Vkm*x^&5V=q%=IT1JivtlI>zB$Qr+j{Z_9 z9L?p5%}e-<cqto-ogFr`w~>*3;vXoM>Bzc$@6WeA|MkWYLCB(&ijIygsLFY67^nQ~ zO0sGPd65n*<w&&`X`7$_9`r?ZJp($KuS#&~_xR2*!GmlJhi|PCKGzdD!*m2PRP6*# zn@ICxN_8KpvfkKLhOz>vSw60Qv>SzN-p$XC;AEf?qQo5T+uR=g^l2rQD)tH{-5HdW zr!>|blv+x#lC2+l;aHuUo4ap?dHCeLSSvzA9*6I56B`rWW0aN|h|17jP|~Tf*Hl(I zZmi|2v4as9z`%O#W8^;A7tHR`Z}WPxv#2q<fptx>Cb^td;Z1svi5A(kZr3npY;v*~ zkRb{`fZ-7o9LT|tmthyKsks9KDtL4h0XOal9_-o1ao;$BnZf+>=kj;2DddTp!XO6{ zLowSlK3_r6p-5ugOx@DspP#0|x|9DHi_yEd{UPd~%00+>^giuZ#x5}bk$%F%NiJeJ z#ld%SEvy?~EOhVgNKj!s7QcgRT91j)^h8rDBh5Keqgm#h;#fuLYu#d}uQ&qP#)<9G zPIV0j8E)U6=4DpOc;fvYbce(LJ?~7Uddr|r#f8j*>4c*lD4&Xmg==hK(V2hG<iB>s zW8Sl8bFjW3c>vO~adY3=z3-?fNUI9NS<IiB!g6$7R1^~{YXSlriQM!A+2-TxTl@3p zVDcS&f<3{=_X9p5D!KwfAB7&Q4O~`@iTjyPa&gtb(3iV_MUfcrTAb))<%Ip{IRlE1 zNbu?)Cws6WEthm%ODp8<+i*$u2&%H*Cy-|$UjcCrrrVK@9^d~9HrADe4lDPi-kpB3 zMtANg5g<~Cz?cd#mF~z9Q0z6%CvXn6i;n4a2oun5NQQ69@>iv`d-u`{n8J|nauy`= z`KExK(XuCDjA{rteHAnWoTjL0p~Qe8sJi!ubib(u88To>NkGn=)ETpxw7U!hcVlBC zf|F%*LPEl`P{goLi~~|jm}KClCr_Rv@ziB{;luNfvGfH@RW&r4!5zY`4!z{Q<$vP9 zc2ds-+6v$$_?>H|x4}R<3hSvujbs0@GlYiDcGKe+5vTW+!K6IineV^ZjNhjfmqp6p zdms^$Q071pP!xKhb}JJ2w{Lzt<~?_A4KoUz>{^=6<@>uxP-Fh-Yo>roBjl~S4h{%n z+1MAFI={0?7s)7iia7{uMR>St-<Ms0fB$tU;l@DmBw3j}fHY%40o$YDL4ltOF!B7< zm)%&izNaNO7eT8+SV5WmrK(CnPcL${9wnpW?SDBaV5h#kygbs<E@p_Tc&(k?h3zf* z<MA|zf^)fuJ5d^JA|!AeC9%<Vf|HX|5!m?SM|et{;Yw3uS6?AV+%9Pc^A=^ZxxE*~ zij42EVx!8}C|_aH8o84|epix+3sgZ!0sIdawM#<6@^}SZ`o?j;M%`rG<oy{Hs`ieK z+E5`LCZ;G5^{{{?e*G682VeZ;0~iIzn4TI>8sL4!GF!;br;<SE`P9?8s*L;hLy*5* z!!TGInf_ye^bz?p1ZZz~B|B~dTSqo};42eJa~JA%xytdMpl3iufA}!8jz;;b_{Ng= zPd?m0Gs+tL>=G70l_CSGvEA(7qUs`)A(=I5h~cAVJNCZVO7=kO0_w{D{_|>4R75ho zR3}bcU=Os}9V&1;rjG?vGkwXC3XUvTlb5jtZqmv0#wDG?kr;Ufq=eD^f}M(#4{p=v zYtw`vLbOX`fQJrbNkm_eXuL+>ss8tzzq@j}oEJ3ZK&c=OaqcR$$G30aHejga*6I1b z-g4WRN{Do$KVu+`2}MSN-j~M{-NHsj*2s#91#4al7Zn;+FvT>w#PrLg$qCrm3tzyG zswzjzf47X^agZPP{&UM-npg?h3(dPnL9+yw*#7OisGfs7{otA)y<mJ)R1XlwaX*r7 zm}H6ZCX2+^vC3%VLDr*)XoR!5N$B6o5){7#6U=fIS_-Di_o1zV{m#EHbj4;q4-dcL z=!l`HRd4yXwVDJ7hrQYg>^PX;p@L+$KujPjHET3iWAR6I8UOB`%Y4%{i104idk`%K zNPoF{H4`x(EiWr;v$g8KneYvXrmPk=_3PJ9AMB%d!L3S~g_xmP1MC$VLfG%%t7NqY z7YVR$BHRWB2M_o3@WNKIZQC~Dca*Xhh$IY7Dm+wci}rgUT><;REHyWR>K;J}X`O+V zwi)~Gg7;p;<ixY|xX~zftL?oADv0FJ$y>22V4zeE5vc6wC`7Ra=I?~e^G|J3xE^<` zE>OwoB`apIh<Ut1xqS{~0UX{)tYg?kT!P5R=d-(7D`CiUu(LCcJZs*p$aZjLb#=B2 z>6I)3*9GE*bHjx3GAFH%^l`9{UD`Vkunv6HjfJTI6!P3%=vVM4m$-=JmQ}yycQnHg zKNvkt-V5drNT{6at)MyW;^}|e#b4;rG^p<Y`MB&RAS|+t;{6`5{bx5}1|DcVRM_^v zH{gG^;s5#he@5W{{RnJ!Ta~Ua3<T*#NV>bB{DS$}_xbab30eeA#xLk4)g2fd<krr4 zu5AD*lA0P!GHQuD6mDosgpUf645<STUgr0y_K2HSjmHTPU%wh;XmU0;HSHk~dP?2_ zZb-no30+~wjvXGa5RkM?5elc%BL1a#fD5#9g}-^TFx`6rzG5wS($B&81S2Ilf8!qk zFoUuEu08Nn8gLbfl7atLHOyWx3(+4u2$L{&=0qZ^6wJdwu5g~!0TAZv{G`QYrxX>P zLsS<ND})sWZ6}D*^4$^uLeUqz>nmbqUi8I&MO4{Ip!0e^an^+w;>=k-J{UAIA^D$z zyaAXq)|7mR*$AvQUWgzYzE^<|;Fp0JJVpf!2KXbuEr&?jb>8>&Z9#<1fsSsU%i~Y? zYKX3A(F2BF*S-7RFB^28bMe?kEvMJ^hS5(`pJ{zP<^K0m?6@4i!ii(?>Q|UumkR2C zwoMdwse{E|b&T(f%Y3F4_la%rX6`pyV)O&=+h2>=1<d;2B_u5BPB{g?_A?)3`8DuI zkHuxpWak8tA$HNcx77dYaXI6xJ4fh?TMFT^IChZY@amhS+l>stedj`ldc)~Mpsx_W z4+Q88X+&)O?0ubvq!NMd935+n6fa9c)d?#w>fYf7G!md4MQ?N65b~?d=7#G+e~j$O znd#{z)lGhy)sHz0WOj$$lPg+^lt#MCzs2-0bj8oj?_AG9Iaivg?7FuM-X$-6^hAwZ zMGqCcOq&}Sz;jdGrJL@Xn6^aZGCL3WhLE>De0U{MQ(K$+@nh0&WbE@du0}pq<)lSJ z;BV*$5+ngRv|}~=9Y`6c^o=9*FP=OB^k(ruV^>pkbqX@h)`vHteSiWmYf5T@^ANZ7 z;I9D|ht&FrU^@UL#0&{>SmssP0Q7d#athn@KY`7AvD;k|5J1a<8QEECo|Vva9nc<d z78G21I#2Ez;y=I*7+tI$V(%s+d60Y@{8!aKexOw}H#gUWqxAk?bS;+E*OSOjgTECH ziA=CNLB|K@(AM^r%ZQEz-XuZ6Y~-iT8ML0_@<vBS=0}@+Cdd>CPoF(=LPH1Ens%1y z=k<PY_qR<==SG`ISTV9~*#Vm~A|Rj<J~5QGIj9|a0ADd^uwR1Gv{=S2gzy^zV<||> z9Owv3_&da1Bw@ZYXY{M^N9?eP{{F@c!%I0IK$hU|P`ps_=EBPUx4P-czlLyhK|<~7 zocT{zLMA{Upkkkfgu^5T<1+k+t(S!f%)sO591nrp2tBtQ%xiZTl+lR;-Kxy%L{Qa< z<HupKZbQ0-BQ43=E3oqCPq*nFDQq@+L9;KkC}vUB0yo3kg<hNw1MpxxdH!5LNC-Ho z(Cgc#p7vKuVN#<kdc(Cv`1xo1zWU%UaW4iu%qK__K93oJ<Hx+KNJM)nXAj9TiH=+x zb$V`2?Q`cQ2c=6tw{B5lT%0jz1GuBOBpqkoq1_JNAfSpYRrWwAXxV^DkPyxa3KqL8 z^Kq5h3_L?U4PFOa=i2&u+?CVanSZ;t@7QtM%nU$P=`Ek9wuD9N2b^u^jvX+h!VVEY z`|ayj#Dy1hXUe*}NzKX_)vPu5%~d^^UeVqH;0H`6v)kX_|Bi(PiB?8%N-^11O-4o& zKzc3!%EYj+BN9W&g8+V@%TQf`*uaFg&7joR*6x6o<cempmoHxeN@lsBGQ&!Qc?n<u zGS)j!bj&I%D?_3>3<U|_2WQ09U0|0S7}$ieBRni@W3hCzt_;p9G`iZ2)Su$z{ngod zj+^^sMVtC0lsB{`V+&%SI%j}(vH8h&?nK0NpREzff*qw1B_B*j|7m>2-c1+)g^<AT z5^c;VlW#|>vCl6qF3!xvF#Lq$U9Jkx8n7@klNSm@p^?Gx6AA)JXN2;3@7^plrI|Cc z?ql7hrEu&Z9Aj$Rh-kaR_Qs67IL!a8u~Fdo@keh^fd%Gt1F6C8f`y#52DEBX7qjEH zH6$OI-G+vS@SZ|wEkq9uT&DKr%cys8v%_AQuB-N1!D!e=*(-DeL_MrdS|v9>Z-wrO zmOrEd7|CWooHyGlwNzJCTZ@*RXcL+I0U%LqUSqmJRE}Wd-~hTwhoH|7&ly@j4e17< zHB2<VKae^;Hdc76hTcmb6NWP?quqGXVoeCB6n1w+piZXePoJI<6ht&Lp&JCog+0S2 zKTJOuc-sa?q%8k##D_k4Fr9pq{s95+Vq^Vb&fu-abz!-{)?Loq4b=rJab)MhNQ3w4 zz?FpWMjyX?k@nIDpOYsg3|ALe!WD3`8;D~!=>Y%F!+#@ljYxcymS(A|d#s$76afi@ zs6Z%_vyc?{C{Oswf*m?>;>2MuD0zYS99&xEykIisXJ%ek8c~*`t8WbB+<)g*Hw(rI z6or650D}jhE4ndI-Q1*OK_3J9oU#8X%TaGb*3J<q7(~}HIsv@&AzL7Ep!2PkS5aR- z+SBtQTA9juK}Xuy+H&&nn9$wAwnG}8D~GI;Wj~?yZxF#>)dKzUR%7J3I5}ZUMafa> zURqcv7P%Yd#r%&SXCTS{NlOO3h9Ck{nK2znTSSo9#WhtQR|Pi<otK~NNs_%-ISlg# zZ4zsGZYC3WrZ6w>*B%o%t>Cn{MJL1J4^v@XwSuBzV_h9d(k$l%JRkSsM-D{Ls(-(I z`*u#)PW55eLi18M`a-?*`}+Fk=I2MQB-x=|hR95alyrv=s5R1p#9ktn9`-sc>2_|_ zM?zdYoa&0I>iKkD$G?3$xFSXE%+NwtTC>S}@R2q81jf^>9Ub%I;|CFW=)CG08t_a5 zS}wf|gNvnZ>vUd-P=@FXGes+7?uQR~PV?;Lytrdg=LJqK7+4eF%h$U%%X4}=$y2Wq zE_#s>O!^cC73&kb9r(y19L38K3724fI;=5l=z8KxQzdUTy5qpAj$C6d=S3O={fAWp zt$dtk1qg0zY%JNS*-Vz1003lZU_jg!svnFVuwTRU!q!X-G^mx}yZ5UaK<EeQCcsPQ zMbe{DaM5|8rPJVAD!c*@&rib}EqY#Z{qGmvYWUC*C$JFk%n4BFxAoyq)#P*o!<aOr z^^iyfjn!`>MW3{y{Hb0C1zpq8!IL#w*Ef)K>V`uk-8Wt_Uod6<ZB6ok@jge3d!ZQ` z)Ga<e*g{#JqF370-5p5_xe-wXPF^p4SlggQnJyzdn9dy&wf$aR{`gLykI(KGU0T;7 zc_LL!;A%smI(~C2DnwZYg%cj{;^Odhj0dz@+S)!}`@p=z9D#N%L&I3rWkdL-Zkd=| zVr+=5fHwj~GRYu9?BPC~^YJ_r+NR_5tkZRileCskypDhqXdPkC$mC6t@jT>jDJLgU z^a#BYSC^?u)_~q|E4?lC>Ts~nxX4Uyc4<lq_JXe^9EqY9`Sp7)u^q&ZlhhfkhXT_S z@Fs|g?2>lt4l4{9n(jJO2=Cprf5G0&PqP0&?SR|OxXS!vubST5#<)GBf5r}M5oGqS z%!@5SkK%hZ`KmUn?GMj09i)i6@*WNCgzXltIWrZ?`pjs=0@LeXNnlntK_`+%YBewA z;suF<Q?oe>95?v-Ynm>cq^=yW$=A{Kw|n|BTU+SRPv`8-;<HCq@&<i!Y31Us<g9y8 zwY#-vCwNV`cX-8S@!hy5@$A$EecummA9Hekf^SPnc}J3=NA^Y{8{w%TTqJvZVj{*2 z{rzt$jnHOB5h!Wj`8Kf92wX7|0d5#+2mhaS4y$2rou#>XmBy_qU~6biO+OfSKRkc) z&Yc_C>z%mJnd)jqDEof0YS}hTcBc`LkR)N_4r+6f6tqAOn3ty~(nPD3Nn9YFY(siN zgBNt9wucOX8gJy|aCXw*UYo*d0YBO9=A{phscC-wLY2`+?09W$Z7{A%N;ULp3TXEO zq#NYWO}#+XtOCXdHxR##ARAZz<O#v)gp8zQDWWV|mkA>78!kYerVdy4?ej%irXtdL z<=_7sQ(t)2%@&Wp0U<S#{t%5!^b8Dz1qEo|13nbZ^mv8O;vp?{KR}XmoIcI$aqj+f z6q?ZySF?)D27F}^43ct6;X#Ezcka6;n#9nrTb%f*wss24KSdy#YS5tq)9Ef|EKnT9 zu;rAcv7TOcfykT-G`UmMmB_6GW*}OCMfLU##OmFiL_FgLZFX@CdnYU}aKN=%54N_m zvj~<zb)h4;E!<y7JSab$Z%t1s`axl@UY_-5v__&kp|v#+u1)!lT1#PAoD-lA`S|#p zXPTa$Pc3k=77Bxk1=nGN&v7UMSF&vo{b8cLO^e4xz<Xt#{_VX|_B}Idi7-GwxIW$1 zS8kh|15njON=Cl1YW?uJtIG|3RMZJ5GQ}r2K@AU%j;^3YP1DK8>1TjCvSv`ffe6(| z(-E;~<vn!hP<!g!2^)xuI3miHI*IN%&SE_C0CgUeG`Hn}AfV4W%M8kLJR1dIjtdRy zV0y6jNULrQZh-mOS#7YsXx)WxovR4t26|@kC<R`Kc32SY`X4Rf$WvBTeTDum_~BGl zsU`@RO*9J$qXM2P-Ry$wGm*Xj;K6<v6mStx34IUqd(pC-I`uXrL>aad=!&R;;iHTj zU}k0p;=+QMtdHA0q5Xwd5#lOZyb;7vTEO<JSQyxx245N~X1l4b-|%p<u{~MvhVKqX zK}aEewLP1ogX^r2P%bbc_-%zZoM@Or&wIiEX8xYF^%4dR7K93WA1)4#dw1_1MkCX2 zYq-OtIT(elKh@XU;AsXZN#L4`V|b~^Vh*Ps(hzXsKu^yH(617Q%HZCDod(Fg5$+=( zf_A$&6mnpXFL+TdLt6!6G0oNV(noWkfxdo*!PjRX9RVL3bcr_kop^W<X3@4h+SLae z!ghrExAiw)#%|J+9InLRi6r(T^~R`z&?_GM?-TciUPkwBW;^7bQMzG8_Gw=|ZQA+W zxs4Q8`Y-+pj#4}uA{!NYnceb2>#!|tv}xGK>U{+@Ez)-t>=be?N-X`**56|6aVR$+ zh<N1L<>zVwmk%D#7F28Zdt~sCcza4BY;9_DZ{z;AjW324-w$;*l#2-EpUYod2=jJ^ zOAGMqb?p!XCAm%{8p;?LoPp(_PD3<(dyb!H%kI(5`3MPDEnQvZL+fj6Mtp}iQtC`Y zLPNn)(opOuj<UOX^L*Tu>zuUj)qd#cxL{~kR-9g+1XCZ(@qUvgODk0)InD<rN;uL8 z(P)YRPaRuF%F+P=(n3&cZz(CgKq8cpAzwdoA5<ZHfQ5yt;SODLN=k84R>%x6scUk+ z(cv~pQ*~>Azs$|r`V}{lVA%8&`u)&;2oMXXsVw)$Rump7??a95C>?BxO2xW*XyK5M z*npe&*Xe4uXGv*kC757XZ*V&A^3U_A<`6(oUcz9+p^*}t|GwlwrO^uN{}F?mH+yz6 zx;&6X3yDstn>aS!i4%`?cUkhig>sRiF@`nv)~Aqxo*pILK{~qNz`%>FN_eUO8$0{x z)D+w~T(c7KFkD4PKdc?%I7qQlmZ6o(9+;Gyd+oU2Nfwrp=IbiRZ#Gk1;stDeva~$9 z&#9bd`q7c;_tiiS_AS{Z_ty$5W!Kma&XrF@M>7Y?8w=2*r_);E+W5so%6IQ(C@1** ztDWK)8V)HtIjw+KzZ+NH%f`V`zIzl{{=3V)5h4}z3bJZ5D`^2pC1g4~wxZ&HaDC7J z!#~_-G4gzTeWRBZgKBPNwpkotpMpV8M`zqt^akHavUmaxkfxv6_VSoGJvB9v>I(oN z6f(3rp^YZK!33%+0Q1Q26DFVV5ENzQm$E016CN=UUY~^ivJU6wpIG`AGSRB&hp1`2 zPj-LDE7z@LE$B4Ivpbghe0ZQYgw|kYf$o~kvZ<f;2d<6}54VC1P*i+gTDmDI+!*w# z(un@WEyVw+;>BY=Uq?qrlTuQOTvu~6Ib{f>7It)28fUig^V5;(?iuIY_F#8U_y!7k zv^Z6yI0zq^vovw9GRsErm|b>R;lTB<2j*mFpAmwOQQ1UKk5P(BhkG%<xNTwqUeJf< z&rflgWVS({aXi=MLmt&ILb51Nw9g}w7SC`7dwF~B+_`hvMdFJxuYXS+8yPpRu(0f9 zHEZi>52quN$o8_Y-(||&ykBS();@^I0t5&1K#YFHL?~h~GBzHlV03>@g@@14$h|%( z*SCHxTzLrSeCyV&keF)!{QY8Z*V$R@_Z>C0Mm!b64#v^fCq0S!cv2kzA;}Hi(0~<< zSpf9`n{9;H?y#8ki<##M14BbQVPAXs^0>!dMhQh_fb|F3_O`a@Ht?z%Am6@ydU*}G z=g;>0WYyb)ESL9u;xx|f*s=AYD%%$^V-?|1TTzryk}Ja}Zq=ZZz*-4)m$&yNR2%3A zF)=ZL4;98iwr6mlu1^+DQ4wLIL^#LGWu|}E#mit27pAAtnKF#}4_W|BgR-x`v<;np zM*UQp7|na;3{(dnl0gRM5)UH4$qZ69n)o#?UzU1pq@~q<&qP04%kf-<?8&60q>oyu z{tQPX-HtGO+~Wh&Cdh~45^7)=t8{vc|H;#|KEU>PE|q_1r~=jYh=XMOWTe#^U1tg! z!<z~;Etpg^w!zWH>N<x(H_FhIiQRwbu34^^7x}XoEF>y;WN!GceyIVOHB4WuJB5{~ z#y%3VvEg>icM*@B>j5jM_2K50pQRTr2WX|r5bE;ZussvC?jb{9X?wx~Yxq{>>z{6A zqIYKRv2%$HBg3)P=fA(xNCu#Q=3{*q%-7b3WJ52?0L2K8KD1fz2s@Ik{aZL`8Azqz zqXL40OpJ}O{E%tg(A=V~uD&!3mx=I^m-2CCUoquCelR)HGvk?gSAfDu0^QJ1sA7E3 zW?+0gi+4FQ6(MBfQgYKX>EmIhhwy9?Cc;+tm(QO|6VCAOyeKV=?f153aA+YiEDVo< zxS^qugOHrul%&QE%QGHuqsR9SgfJfRgjyU)vln|L6Rpsx8VdXBtE$ZLh%-o4JdsDq zHYu-N0`GY7vYNR$humwZ`z4E4*bc(Av)8-ah%cjU9C)to1ttbGIUb-A8rlJwisZA@ zkz9VM`d;n0hYR@94R$={N{H&IG-wr(-(5F(nLI#DkA&3MU-5XQn;!Xt6UhgQ9O{_$ z-I=49Qc4O6JVL~zYr+vr9zjs49z;*J|ISZYpN=w<S#1X=A5^uvvSQ6fBp92RNV+V2 zK!Ne$0~K??+qZH;K*xA0)ve6@qN1>xTkygo_b=xE?(22|PFmPhzjJ3|EZ9@}I80s* zWAn8)sz`D^C@=J3pcl2i?e2b}4mX|#m+$_1B<19mo1;urTYI+J7rM@*A4lNCedgv0 zaYHLbBMPM8csvm6)G1G8g7N{vcD}dcLy_*s7#Xe1%`Xsor}!4%f6o67<5f`08B)%y zEc_N+bBosJqNI78$dSGII$aG7SFc@Tr6L4-qh$H&bBK$!YK-nAnfq?q#%(=Y$sg+j zSD>N&2}<UD`*Jloq2wheCccu7t7bwVc}aRUR!kz=^y&gpn7|RFEGM^X_iiLH&^n>e z<Fu`cJ*l2OdD3Go4C9#$VgL3FDC&uciKr6euE<e+fe-<j&`va5D;29qQBLmdASa$} z!r@<umQ92mIFnXZRv^#cxDl?%f>I>p*L?sivuv%nEBS?mW459?BU4kg12%AvU@u5Q zj78@l9+bEOI}Ji}();(M9(93Bgiir^D{Y))nWSu}pkSD$K4dM7G{0OW_betwgCnSl z)C<@!@{R-I3F(PU?w6UU4jw%C>k=?N6!^c7=9-%|p2b+4?SNJ4ZLTSRJ!r<fb=$7} z5^ih4f`UyI72cC=4Gs680L?w38Wbx7!dKeZya&5O=L}jx09kCsrKr&O5!NL_elzK& z$zd{`TP`l0rUD@~w@}NVH+p15B>FR2DzF{{<Ojf(iT9Fv#T8i&_*U%RvuD6s*nKq@ z_!rM4fsq=ZGWf3T%D8=Do#`6d`IcPV0I6pO7%yH{PPjK(SWQPsp4nDCU;{|<cAacm zONwcGPfa$c@xDHT$DiT79U9Fbn~vNuMc8ux03I@eh6{*Byh1{UVwlL%X|@x|x}@Qy zwnWN7B<*rry>rcX$AeAb`vMTxZ)!ZYgPcruOOWuthD>d>XOvek+%Lj%6SVAu!PC{x JWt~$(6996_kShQH diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat deleted file mode 100644 index 1a5f7f9b..00000000 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_double_precision.dat +++ /dev/null @@ -1,5 +0,0 @@ -0 0.0312956 -0 0.229959 -0 2.2255 -0 22.7488 -0 240.375 diff --git a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat deleted file mode 100644 index 28e881b1..00000000 --- a/tool/numerical_analysis/tridiagonal_solver/lapacke_single_precision.dat +++ /dev/null @@ -1,5 +0,0 @@ -0 3.46066 -0 0.295798 -0 3.97411 -0 25.0105 -0 238.504 diff --git a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl b/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl deleted file mode 100644 index 2c9f6099..00000000 --- a/tool/numerical_analysis/tridiagonal_solver/plot_analysis.jl +++ /dev/null @@ -1,70 +0,0 @@ -using DataFrames, CSV, StatsPlots - - -sizes = [1000, 10000, 100000, 1000000, 10000000] - -f1=DataFrame(CSV.File("lapacke_single_precision.dat", delim=" ", header=false)) -f2=DataFrame(CSV.File("lapacke_double_precision.dat", delim=" ", header=false)) -f3=DataFrame(CSV.File("tuvx_single_precision.dat", delim=" ", header=false)) -f4=DataFrame(CSV.File("tuvx_double_precision.dat", delim=" ", header=false)) - - -lapack_errors_single_precision = f1[:, 1] -lapack_times_single_precision = f1[:, 2] - -tuvx_errors_single_precision = f3[:, 1] -tuvx_times_single_precision = f3[:, 2] - -lapack_errors_double_precision = f2[:, 1] -lapack_times_double_precision = f2[:, 2] - -tuvx_errors_double_precision = f4[:, 1] -tuvx_times_double_precision = f4[:, 2] - -#scatter plots -bar(string.(sizes), lapack_errors_single_precision.-tuvx_errors_single_precision) -savefig("single_errors.png") - -bar(string.(sizes), lapack_errors_double_precision.-tuvx_errors_double_precision) -savefig("double_errors.png") - - -# bar plots -nam = repeat(sizes, outer=2) -# julia has a weird way of ordering groups in bar plots (need to make it better) -nam = [ n > 500 ? "$n" : - " $n" - for n in nam] - -data = [lapack_errors_single_precision; tuvx_errors_single_precision] -groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups)) -title!("Comparing Accuracy (Single Precision)") -ylabel!("Relative Error") -xlabel!("System Size") -savefig("single_precision_errors.png") - -data = [lapack_times_single_precision ./ sizes; tuvx_times_single_precision ./ sizes] -groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups), yaxis=:log) -title!("Comparing Speed (Single Precision)") -xlabel!("System Size") -ylabel!("Run Time (ms)") -savefig("single_precision_times.png") - -data = [lapack_errors_double_precision; tuvx_errors_double_precision] -groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups)) -title!("Comparing Accuracy (Double Precision)") -xlabel!("System Size") -ylabel!("Relative Error") -savefig("double_precision_errors.png") - -data = [lapack_times_double_precision ./ sizes; tuvx_times_double_precision ./ sizes] -groups = repeat(["LAPACKE", "TUV-X"], inner = 5) -plot(groupedbar(nam, data, groups=groups), yaxis=:log) -title!("Comparing Speed (Double Precision)") -xlabel!("System Size") -ylabel!("Run Time (ms)") -savefig("double_precision_times.png") - diff --git a/tool/numerical_analysis/tridiagonal_solver/scatter.png b/tool/numerical_analysis/tridiagonal_solver/scatter.png deleted file mode 100644 index f8bfec27f8df000155d81336abe0ea47f67c2549..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21935 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/single.png b/tool/numerical_analysis/tridiagonal_solver/single.png deleted file mode 100644 index 3d4d0b78dc830e98d9e3a4d48c4817fb6762f168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14495 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 PBs+ITSuUAy<NkjGRwhS6 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_errors.png deleted file mode 100644 index 843e6c7780400434e8a5ba69be116e0762922f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16435 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 diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_errors.png deleted file mode 100644 index 1c39ea09b9d06ad0841fa98eb6e0a4847b965b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25116 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 AZvX%Q diff --git a/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png b/tool/numerical_analysis/tridiagonal_solver/single_precision_times.png deleted file mode 100644 index b2e9fa432076abd8a61ddf09120470207604c27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20515 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 Ll1v)$#-slWEo{Q~ diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat deleted file mode 100644 index edd516e8..00000000 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_double_precision.dat +++ /dev/null @@ -1,5 +0,0 @@ -3.30033e-17 0.0106112 -3.29421e-17 0.108319 -3.29942e-17 1.68017 -3.29831e-17 15.0755 -3.29797e-17 146.831 diff --git a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat b/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat deleted file mode 100644 index c4b647b2..00000000 --- a/tool/numerical_analysis/tridiagonal_solver/tuvx_single_precision.dat +++ /dev/null @@ -1,5 +0,0 @@ -1.61746e-08 0.016908 -1.62785e-08 0.227215 -1.62936e-08 2.232 -1.62759e-08 16.4258 -1.63053e-08 107.242 From 5e63955fb5f4baacc128b995c6bd50c24fe34e26 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Fri, 28 Jun 2024 11:21:23 -0600 Subject: [PATCH 09/51] benchmarking code changes --- benchmark/CMakeLists.txt | 14 ++--- benchmark/benchmark_tridiagonal_solver.cpp | 57 +++++++++++-------- .../tuvx/linear_algebra/linear_algebra.hpp | 8 +-- .../tuvx/linear_algebra/linear_algebra.inl | 21 ++++--- .../test_tridiagonal_solver.cpp | 10 ++-- 5 files changed, 57 insertions(+), 53 deletions(-) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index e906b6cb..0271f936 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -1,13 +1,7 @@ -add_library(tuvx_benchmark_utils OBJECT) - -target_compile_features(tuvx_benchmark_utils PUBLIC cxx_std_11) - -# link benchmark library to sources in this file -target_sources(tuvx_benchmark_utils PUBLIC benchmark_tridiagonal_solver.cpp) -target_link_libraries(tuvx_benchmark_utils PUBLIC musica::tuvx LAPACK::LAPACK - benchmark::benchmark) -target_include_directories(tuvx_benchmark_utils PUBLIC ${LAPACK_INCLUDE_DIRS}) - add_executable(benchmark_tridiagonal_solver benchmark_tridiagonal_solver.cpp) +target_include_directories( + benchmark_tridiagonal_solver PUBLIC ${OpenBLAS_INCLUDE_DIRS} + ${LAPACK_INCLUDE_DIRS}) + target_link_libraries(benchmark_tridiagonal_solver PUBLIC LAPACK::LAPACK benchmark::benchmark musica::tuvx) diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index d4da4103..f17a89bb 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -1,10 +1,13 @@ -#include "mkl_lapacke.h" #include <tuvx/linear_algebra/linear_algebra.hpp> #include <benchmark/benchmark.h> -#include <mkl_lapack.h> +#ifdef TUVX_COMPILE_WITH_INTEL + #include <mkl_lapacke.h> +#elif TUVX_COMPILE_WITH_GCC + #include <lapacke.h> +#endif using namespace tuvx; typedef TridiagonalMatrix<double> trid_matd; @@ -13,7 +16,9 @@ typedef std::vector<double> vecd; typedef TridiagonalMatrix<float> trid_matf; typedef std::vector<float> vecf; -const std::size_t system_size = 1000; +const std::size_t system_size = 1e6; + +const bool diagonally_dominant = false; static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) { @@ -21,13 +26,14 @@ static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) vecf b(system_size); trid_matf A(system_size); - FillRandom<float>(A); - FillRandom<float>(x); - b = Dot<float>(A, x); - - // Perform setup here for (auto _ : state) { + state.PauseTiming(); + FillRandom<float>(A, diagonally_dominant); + FillRandom<float>(x); + b = Dot<float>(A, x); + state.ResumeTiming(); + LAPACKE_sgtsv( LAPACK_ROW_MAJOR, system_size, @@ -46,13 +52,13 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) vecd b(system_size); trid_matd A(system_size); - FillRandom<double>(A); - FillRandom<double>(x); - b = Dot<double>(A, x); - - // Perform setup here for (auto _ : state) { + state.PauseTiming(); + FillRandom<double>(A, diagonally_dominant); + FillRandom<double>(x); + b = Dot<double>(A, x); + state.ResumeTiming(); LAPACKE_dgtsv( LAPACK_ROW_MAJOR, system_size, @@ -70,15 +76,14 @@ static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) vecd x(system_size); vecd b(system_size); trid_matd A(system_size); - vecd x_approx(system_size); - FillRandom<double>(A); - FillRandom<double>(x); - b = Dot<double>(A, x); - // Perform setup here for (auto _ : state) { - x_approx = Solve<double>(A, b); + state.PauseTiming(); + FillRandom<double>(A, diagonally_dominant); + FillRandom<double>(x); + state.ResumeTiming(); + Solve<double>(A, b); } } @@ -87,18 +92,20 @@ static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) vecf x(system_size); vecf b(system_size); trid_matf A(system_size); - vecf x_approx(system_size); - FillRandom<float>(A); - FillRandom<float>(x); - b = Dot<float>(A, x); // Perform setup here for (auto _ : state) { - x_approx = Solve<float>(A, b); + state.PauseTiming(); + FillRandom<float>(A, diagonally_dominant); + FillRandom<float>(x); + b = Dot<float>(A, x); + state.ResumeTiming(); + Solve<float>(A, b); } } -// Register the function as a benchmark + +// Registering benchmarks BENCHMARK(BM_LAPACKE_DOUBLE_PRECISISON); BENCHMARK(BM_LAPACKE_SINGLE_PRECISISON); BENCHMARK(BM_TUVX_DOUBLE_PRECISISON); diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 33bfd888..7c93d108 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -37,7 +37,7 @@ namespace tuvx /// @brief Fills a matrix with uniformly distributed random values. /// @param A tridiagonal matrix to allocate and fill template<typename T> - void FillRandom(TridiagonalMatrix<T> &A); + void FillRandom(TridiagonalMatrix<T> &A, bool diagonally_dominant = false); /// @fn print vector function /// @brief displays the data stored inside a std::vector @@ -53,12 +53,12 @@ namespace tuvx void Print(const TridiagonalMatrix<T> &A); /// @fn Tridiagonal Linear System Solver - /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b) + /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b). + /// store solution in b. /// @param A tridiagonal coeffcient matrix /// @param b right hand side vector of the tridiagonal system. - /// @returns x solution that solves A x = b. template<typename T> - std::vector<T> Solve(TridiagonalMatrix<T> A, std::vector<T> b); + void Solve(TridiagonalMatrix<T> &A, std::vector<T> &b); /// @fn Tridiagonal Matrix - vector dot product /// @brief Specialized dot product function for tridiagonal matrices. diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index 3d67353e..ce75196e 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -28,7 +28,7 @@ namespace tuvx } template<typename T> - inline std::vector<T> Solve(TridiagonalMatrix<T> A, std::vector<T> b) + inline void Solve(TridiagonalMatrix<T> &A, std::vector<T> &b) { T temp; std::size_t N = b.size(); @@ -49,7 +49,6 @@ namespace tuvx break; } } - return b; } template<typename T> @@ -65,19 +64,23 @@ namespace tuvx } template<typename T> - inline void FillRandom(TridiagonalMatrix<T> &A) + inline void FillRandom(TridiagonalMatrix<T> &A, bool diagonally_dominant) { FillRandom<T>(A.main_diagonal_); FillRandom<T>(A.lower_diagonal_); FillRandom<T>(A.upper_diagonal_); - // make diagonally dominant (diagonal value greater than sum of its row) - std::size_t i = 0; - A.main_diagonal_[i] += A.upper_diagonal_[i] + (T)500; - for (i = 1; i < A.size_ - 1; i++) + + if (diagonally_dominant) { - A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + A.upper_diagonal_[i] + (T)500; + // make diagonally dominant (diagonal value greater than sum of its row) + std::size_t i = 0; + A.main_diagonal_[i] += A.upper_diagonal_[i]; + for (i = 1; i < A.size_ - 1; i++) + { + A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + A.upper_diagonal_[i]; + } + A.main_diagonal_[i] += A.lower_diagonal_[i - 1]; } - A.main_diagonal_[i] += A.lower_diagonal_[i - 1] + (T)500; } template<typename T> diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index cc9c578d..12838b0e 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -19,7 +19,7 @@ typedef std::vector<float> vecf; const double tol_dp = std::numeric_limits<double>::epsilon(); const float tol_sp = std::numeric_limits<float>::epsilon(); -const std::size_t number_of_runs = 100; +const std::size_t number_of_runs = 20; std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; @@ -44,9 +44,9 @@ TEST(TridiagSolveTest, SinglePrecision) FillRandom<float>(x); b = Dot<float>(A, x); - vecf x_approx = Solve<float>(A, b); + Solve<float>(A, b); - errors[i] += ComputeError<float>(x, x_approx); + errors[i] += ComputeError<float>(x, b); } errors[i] /= number_of_runs; @@ -75,9 +75,9 @@ TEST(TridiagSolveTest, DoublePrecision) FillRandom<double>(x); b = Dot<double>(A, x); - vecd x_approx = Solve<double>(A, b); + Solve<double>(A, b); - errors[i] += ComputeError<double>(x, x_approx); + errors[i] += ComputeError<double>(x, b); } errors[i] /= number_of_runs; EXPECT_LE(errors[i], tol_dp); From 3cbb75af1e9c2d9e9524aa0622cf8665869e4ebb Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Fri, 28 Jun 2024 14:20:46 -0600 Subject: [PATCH 10/51] only use diagonally dominant matrices for unit test --- benchmark/benchmark_tridiagonal_solver.cpp | 5 +- .../tuvx/linear_algebra/linear_algebra.inl | 5 +- test/unit/linear_algebra/CMakeLists.txt | 1 - test/unit/linear_algebra/test_lapacke.cpp | 107 ------------------ .../test_tridiagonal_solver.cpp | 88 +++++++++++++- 5 files changed, 93 insertions(+), 113 deletions(-) delete mode 100644 test/unit/linear_algebra/test_lapacke.cpp diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index f17a89bb..e1ea6e3f 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -52,6 +52,7 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) vecd b(system_size); trid_matd A(system_size); + // Perform setup here for (auto _ : state) { state.PauseTiming(); @@ -76,6 +77,7 @@ static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) vecd x(system_size); vecd b(system_size); trid_matd A(system_size); + vecd x_approx(system_size); for (auto _ : state) { @@ -92,6 +94,7 @@ static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) vecf x(system_size); vecf b(system_size); trid_matf A(system_size); + vecf x_approx(system_size); // Perform setup here for (auto _ : state) @@ -105,7 +108,7 @@ static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) } } -// Registering benchmarks +// Register the function as a benchmark BENCHMARK(BM_LAPACKE_DOUBLE_PRECISISON); BENCHMARK(BM_LAPACKE_SINGLE_PRECISISON); BENCHMARK(BM_TUVX_DOUBLE_PRECISISON); diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index ce75196e..52cf6085 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -56,10 +56,11 @@ namespace tuvx { std::random_device dev; std::mt19937 rng(dev()); - std::uniform_int_distribution<std::mt19937::result_type> dist6(1, 6); + // sample from normal distribution + std::normal_distribution<double> distribution(5.0, 1.0); for (std::size_t i = 0; i < x.size(); i++) { - x[i] = (T)dist6(rng) + 1; + x[i] = (T)distribution(rng); } } diff --git a/test/unit/linear_algebra/CMakeLists.txt b/test/unit/linear_algebra/CMakeLists.txt index df88a27f..436ce7a6 100644 --- a/test/unit/linear_algebra/CMakeLists.txt +++ b/test/unit/linear_algebra/CMakeLists.txt @@ -9,6 +9,5 @@ include(test_util) create_standard_cxx_test(NAME tridiagonal_solver SOURCES test_tridiagonal_solver.cpp) create_standard_cxx_test(NAME error_function SOURCES test_error_function.cpp) -create_standard_cxx_test(NAME lapacke SOURCES test_lapacke.cpp) # ############################################################################## diff --git a/test/unit/linear_algebra/test_lapacke.cpp b/test/unit/linear_algebra/test_lapacke.cpp deleted file mode 100644 index 135474ef..00000000 --- a/test/unit/linear_algebra/test_lapacke.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include <tuvx/linear_algebra/linear_algebra.hpp> - -#include <gtest/gtest.h> - -#include <cfloat> -#include <cstddef> -#include <cstdlib> -#include <cstring> -#include <limits> -#include <vector> - -#ifdef TUVX_COMPILE_WITH_INTEL - #include <mkl_lapacke.h> -#elif TUVX_COMPILE_WITH_GCC - #include <lapacke.h> -#endif - -using namespace tuvx; - -typedef TridiagonalMatrix<double> trid_matd; -typedef std::vector<double> vecd; - -typedef TridiagonalMatrix<float> trid_matf; -typedef std::vector<float> vecf; - -const double tol_dp = std::numeric_limits<double>::epsilon(); -const float tol_sp = std::numeric_limits<float>::epsilon(); - -const std::size_t number_of_runs = 100; -const std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; - -/// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. -/// @brief Generate random tridiagonal matrix $A$ and vector $x$, -/// compute $b=A \cdot x$, and check if solution is reconstructed -/// accurately using L2 norm (single precision). Check for different -/// sizes to check consistency -TEST(LapackeTest, SinglePrecision) -{ - vecf errors(5, 0); - - for (std::size_t i = 0; i < 5; i++) - { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecf x(sizes[i]); - vecf b(sizes[i]); - trid_matf A(sizes[i]); - - FillRandom<float>(A); - FillRandom<float>(x); - b = Dot<float>(A, x); - - LAPACKE_sgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - // to be written to a file - errors[i] += ComputeError<float>(x, b); - } - errors[i] /= number_of_runs; - EXPECT_LE(errors[i], tol_sp); - } -} - -/// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. -/// @brief Generate random tridiagonal matrix $A$ and vector $x$, -/// compute $b=A \cdot x$, and check if solution is reconstructed -/// accurately using L2 norm (double precision). Check for different -/// sizes to check consistency -TEST(LapackeTest, DoublePrecision) -{ - vecd errors(5, 0); - vecd times(5, 0); - for (std::size_t i = 0; i < 5; i++) - { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecd x(sizes[i]); - vecd b(sizes[i]); - trid_matd A(sizes[i]); - - FillRandom<double>(A); - FillRandom<double>(x); - b = Dot<double>(A, x); - - LAPACKE_dgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - errors[i] += ComputeError<double>(x, b); - } - errors[i] /= number_of_runs; - EXPECT_LE(errors[i], tol_dp); - } -} diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index 12838b0e..d3993562 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -8,6 +8,12 @@ #include <limits> #include <vector> +#ifdef TUVX_COMPILE_WITH_INTEL + #include <mkl_lapacke.h> +#elif TUVX_COMPILE_WITH_GCC + #include <lapacke.h> +#endif + using namespace tuvx; typedef TridiagonalMatrix<double> trid_matd; @@ -20,6 +26,7 @@ const double tol_dp = std::numeric_limits<double>::epsilon(); const float tol_sp = std::numeric_limits<float>::epsilon(); const std::size_t number_of_runs = 20; +const bool diagonally_dominant = true; std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; @@ -40,7 +47,7 @@ TEST(TridiagSolveTest, SinglePrecision) vecf b(sizes[i]); trid_matf A(sizes[i]); - FillRandom<float>(A); + FillRandom<float>(A, diagonally_dominant); FillRandom<float>(x); b = Dot<float>(A, x); @@ -71,7 +78,7 @@ TEST(TridiagSolveTest, DoublePrecision) vecd b(sizes[i]); trid_matd A(sizes[i]); - FillRandom<double>(A); + FillRandom<double>(A, diagonally_dominant); FillRandom<double>(x); b = Dot<double>(A, x); @@ -83,3 +90,80 @@ TEST(TridiagSolveTest, DoublePrecision) EXPECT_LE(errors[i], tol_dp); } } + +/// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. +/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// compute $b=A \cdot x$, and check if solution is reconstructed +/// accurately using L2 norm (single precision). Check for different +/// sizes to check consistency +TEST(LapackeTest, SinglePrecision) +{ + vecf errors(5, 0); + + for (std::size_t i = 0; i < 5; i++) + { + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecf x(sizes[i]); + vecf b(sizes[i]); + trid_matf A(sizes[i]); + + FillRandom<float>(A, diagonally_dominant); + FillRandom<float>(x); + b = Dot<float>(A, x); + + LAPACKE_sgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + + // to be written to a file + errors[i] += ComputeError<float>(x, b); + } + errors[i] /= number_of_runs; + EXPECT_LE(errors[i], tol_sp); + } +} + +/// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. +/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// compute $b=A \cdot x$, and check if solution is reconstructed +/// accurately using L2 norm (double precision). Check for different +/// sizes to check consistency +TEST(LapackeTest, DoublePrecision) +{ + vecd errors(5, 0); + vecd times(5, 0); + for (std::size_t i = 0; i < 5; i++) + { + for (std::size_t j = 0; j < number_of_runs; j++) + { + vecd x(sizes[i]); + vecd b(sizes[i]); + trid_matd A(sizes[i]); + + FillRandom<double>(A, diagonally_dominant); + FillRandom<double>(x); + b = Dot<double>(A, x); + + LAPACKE_dgtsv( + LAPACK_ROW_MAJOR, + sizes[i], + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); + + errors[i] += ComputeError<double>(x, b); + } + errors[i] /= number_of_runs; + EXPECT_LE(errors[i], tol_dp); + } +} From 3acc6e4392a5aac14d5f450c35772a03fe85e2f6 Mon Sep 17 00:00:00 2001 From: Jian Sun <sunjian@ucar.edu> Date: Fri, 28 Jun 2024 16:26:48 -0600 Subject: [PATCH 11/51] update docker files to use lapacke for tridiagonal tests --- docker/Dockerfile | 1 + docker/Dockerfile.coverage | 1 + docker/Dockerfile.memcheck | 1 + docker/Dockerfile.mpi | 1 + docker/Dockerfile.mpi.memcheck | 1 + 5 files changed, 5 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 85874c0a..e631ff53 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,6 +29,7 @@ RUN mkdir /build \ && cmake -D CMAKE_BUILD_TYPE=release \ -D TUVX_INSTALL_INCLUDE_DIR=/usr/local/include \ -D TUVX_INSTALL_MOD_DIR=/usr/local/include \ + -D LAPACK_LIBRARIES=-llapacke \ /tuv-x \ && make install -j 8 diff --git a/docker/Dockerfile.coverage b/docker/Dockerfile.coverage index e06e0a9e..d030cb4d 100644 --- a/docker/Dockerfile.coverage +++ b/docker/Dockerfile.coverage @@ -26,6 +26,7 @@ RUN mkdir /build \ && cd /build \ && cmake -D TUVX_ENABLE_COVERAGE:BOOL=TRUE \ -D CMAKE_BUILD_TYPE=COVERAGE \ + -D LAPACK_LIBRARIES=-llapacke \ /tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck index 3c640d0e..51044d75 100644 --- a/docker/Dockerfile.memcheck +++ b/docker/Dockerfile.memcheck @@ -27,6 +27,7 @@ RUN mkdir /build \ && cmake \ -DTUVX_ENABLE_MEMCHECK:BOOL=TRUE \ -DCMAKE_BUILD_TYPE=DEBUG \ + -D LAPACK_LIBRARIES=-llapacke \ /tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.mpi b/docker/Dockerfile.mpi index a891c312..c5cfed99 100644 --- a/docker/Dockerfile.mpi +++ b/docker/Dockerfile.mpi @@ -42,6 +42,7 @@ RUN mkdir build \ -D CMAKE_CXX_COMPILER=/usr/lib64/openmpi/bin/mpicxx \ -D TUVX_ENABLE_OPENMP:BOOL=TRUE \ -D TUVX_ENABLE_MPI:BOOL=TRUE \ + -D LAPACK_LIBRARIES=-llapacke \ ../tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.mpi.memcheck b/docker/Dockerfile.mpi.memcheck index 7e04de53..e91bbed1 100644 --- a/docker/Dockerfile.mpi.memcheck +++ b/docker/Dockerfile.mpi.memcheck @@ -43,6 +43,7 @@ RUN mkdir build \ -D TUVX_ENABLE_OPENMP:BOOL=TRUE \ -D TUVX_ENABLE_MPI:BOOL=TRUE \ -D TUVX_ENABLE_MEMCHECK:BOOL=TRUE \ + -D LAPACK_LIBRARIES=-llapacke \ ../tuv-x \ && make -j 8 From e035ad93dced0ffb038c51e38c058451ef4ec530 Mon Sep 17 00:00:00 2001 From: Jian Sun <sjsprecious@gmail.com> Date: Fri, 28 Jun 2024 17:21:43 -0600 Subject: [PATCH 12/51] Update ubuntu.yml with lapacke --- .github/workflows/ubuntu.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index f01589f7..dbd24355 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -29,8 +29,8 @@ jobs: - name: Run Cmake run: cmake -S . -B build - name: Build - run: cmake --build build --parallel + run: cmake -D LAPACK_LIBRARIES=-llapacke --build build --parallel - name: Run tests run: | cd build - ctest --rerun-failed --output-on-failure . --verbose \ No newline at end of file + ctest --rerun-failed --output-on-failure . --verbose From cc3403b4df5875b38b3ddb183987e1782efdeee8 Mon Sep 17 00:00:00 2001 From: Jian Sun <sjsprecious@gmail.com> Date: Fri, 28 Jun 2024 17:27:54 -0600 Subject: [PATCH 13/51] maybe this will work? --- .github/workflows/ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index dbd24355..c5321483 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -29,7 +29,7 @@ jobs: - name: Run Cmake run: cmake -S . -B build - name: Build - run: cmake -D LAPACK_LIBRARIES=-llapacke --build build --parallel + run: cmake -D LAPACK_LIBRARIES=-llapacke --build build --parallel . - name: Run tests run: | cd build From 6433ed04339b271221b1aa67332a8f18fa52a35d Mon Sep 17 00:00:00 2001 From: Jian Sun <sjsprecious@gmail.com> Date: Fri, 28 Jun 2024 17:29:52 -0600 Subject: [PATCH 14/51] revert changes to ubuntu.yml --- .github/workflows/ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index c5321483..fa8b14b1 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -29,7 +29,7 @@ jobs: - name: Run Cmake run: cmake -S . -B build - name: Build - run: cmake -D LAPACK_LIBRARIES=-llapacke --build build --parallel . + run: cmake --build build --parallel - name: Run tests run: | cd build From 004a55dcdbfb68f6eba5ff1bf88281dee418f4a4 Mon Sep 17 00:00:00 2001 From: Jian Sun <sjsprecious@gmail.com> Date: Fri, 28 Jun 2024 23:36:05 -0600 Subject: [PATCH 15/51] Update Dockerfile for CI test --- docker/Dockerfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e631ff53..24229c33 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,14 +23,15 @@ RUN pip3 install numpy scipy ENV LD_LIBRARY_PATH=/usr/local/lib64 # build the tuv-x tool -COPY . /tuv-x/ -RUN mkdir /build \ - && cd /build \ +COPY . /tuv-x +RUN cd /tuv-x + && mkdir build \ + && cd build \ && cmake -D CMAKE_BUILD_TYPE=release \ -D TUVX_INSTALL_INCLUDE_DIR=/usr/local/include \ -D TUVX_INSTALL_MOD_DIR=/usr/local/include \ -D LAPACK_LIBRARIES=-llapacke \ - /tuv-x \ + .. \ && make install -j 8 WORKDIR /build From 7e7f02b8525618a1bdbd786d07aa7ef17a81859d Mon Sep 17 00:00:00 2001 From: Jian Sun <sunjian@ucar.edu> Date: Fri, 28 Jun 2024 23:38:27 -0600 Subject: [PATCH 16/51] add missing new line --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 24229c33..940b791a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -24,7 +24,7 @@ ENV LD_LIBRARY_PATH=/usr/local/lib64 # build the tuv-x tool COPY . /tuv-x -RUN cd /tuv-x +RUN cd /tuv-x \ && mkdir build \ && cd build \ && cmake -D CMAKE_BUILD_TYPE=release \ From ec88760499569198da5c6cb4590fa2d7969acc86 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 09:16:45 -0500 Subject: [PATCH 17/51] allowing benchmark folder to be copied by dockerg --- .dockerignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 69a3598b..5641c612 100644 --- a/.dockerignore +++ b/.dockerignore @@ -13,4 +13,5 @@ !packaging/ !test/ !tool/ -!CMakeLists.txt \ No newline at end of file +!CMakeLists.txt +!benchmark \ No newline at end of file From 63f1e8c880a7b59189adc9ffd006ca467d575148 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Mon, 1 Jul 2024 08:20:59 -0600 Subject: [PATCH 18/51] Update cmake/test_util.cmake minor formatting change Co-authored-by: Kyle Shores <kyle.shores44@gmail.com> --- cmake/test_util.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index d228637f..fcd217e9 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -141,4 +141,4 @@ macro(add_std_test_script test_name script_path) add_test(NAME ${test_name} COMMAND ${script_path}) endmacro(add_std_test_script) -# ############################################################################## +################################################################################ From 7c7c4edf8b65daccd4d20e94aad15940805caf7d Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 09:37:31 -0500 Subject: [PATCH 19/51] adding lapacke to ubuntu workflow --- .github/workflows/ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index fa8b14b1..bef2b4dd 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -24,7 +24,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y libnetcdf-dev netcdf-bin libnetcdff-dev liblapack-dev + sudo apt-get install -y libnetcdf-dev netcdf-bin libnetcdff-dev liblapack-dev liblacpacke-dev sudo apt-get install -y python3-numpy python3-scipy - name: Run Cmake run: cmake -S . -B build From feb883fcb280141589f236274da31ce6ff37e410 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 09:38:57 -0500 Subject: [PATCH 20/51] spelling --- .github/workflows/ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index bef2b4dd..a568d486 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -24,7 +24,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y libnetcdf-dev netcdf-bin libnetcdff-dev liblapack-dev liblacpacke-dev + sudo apt-get install -y libnetcdf-dev netcdf-bin libnetcdff-dev liblapack-dev liblapacke-dev sudo apt-get install -y python3-numpy python3-scipy - name: Run Cmake run: cmake -S . -B build From ab61424ae5f877a6d07f3e3c779eadebe8bd8c7e Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 09:48:19 -0500 Subject: [PATCH 21/51] serial build --- .github/workflows/docker.yml | 9 +++++++-- .github/workflows/ubuntu.yml | 11 ++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 15d7a717..de4873c7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,6 +1,11 @@ name: Docker -on: [push, pull_request] +on: + push: + branches: + - main + pull_request: + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref || github.run_id }} @@ -8,9 +13,9 @@ concurrency: jobs: docker-build-and-test: - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name name: Build and Test - ${{ matrix.dockerfile }} runs-on: ubuntu-latest + continue-on-error: true strategy: fail-fast: false matrix: diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index a568d486..8f7db69d 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -1,6 +1,11 @@ name: Ubuntu -on: [ push, pull_request ] +on: + push: + branches: + - main + pull_request: + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -9,7 +14,7 @@ concurrency: jobs: gcc: runs-on: ubuntu-24.04 - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + continue-on-error: true strategy: matrix: gcc_version: [12, 13, 14] @@ -29,7 +34,7 @@ jobs: - name: Run Cmake run: cmake -S . -B build - name: Build - run: cmake --build build --parallel + run: cmake --build build - name: Run tests run: | cd build From 6fc797380b27332eb242f272ff733f36ceb9eb97 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 10:04:05 -0500 Subject: [PATCH 22/51] undoing cmake formatting changes --- CMakeLists.txt | 18 +++++++++--------- cmake/dependencies.cmake | 17 ++++++++--------- cmake/test_util.cmake | 4 ++-- test/unit/linear_algebra/CMakeLists.txt | 6 +++--- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85301249..1dbc3f7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# ############################################################################## +################################################################################ # Preamble cmake_minimum_required(VERSION 3.17) @@ -37,7 +37,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -# ############################################################################## +################################################################################ # Projet wide setup options include(CMakeDependentOption) @@ -95,12 +95,12 @@ if(TUVX_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -# ############################################################################## +################################################################################ # Dependencies include(cmake/dependencies.cmake) -# ############################################################################## +################################################################################ # TUV-x targets add_subdirectory(src) @@ -130,14 +130,14 @@ if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -# ############################################################################## +################################################################################ # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -# ############################################################################## +################################################################################ # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -161,7 +161,7 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) add_subdirectory(test) endif() -# ############################################################################## +################################################################################ # Packaging # only include packaging if we are the top level project being built @@ -169,9 +169,9 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -# ############################################################################## +################################################################################ # benchmarking add_subdirectory(benchmark) # -# ############################################################################## +################################################################################ diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 0d6ead8c..d3a495a2 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,13 +1,13 @@ find_package(PkgConfig REQUIRED) include(FetchContent) -# ############################################################################## +################################################################################ # LAPACK find_package(BLAS) find_package(LAPACK) -# ############################################################################## +################################################################################ # Memory check if(TUVX_ENABLE_MEMCHECK) @@ -27,7 +27,7 @@ if(TUVX_ENABLE_MEMCHECK) endif() endif() -# ############################################################################## +################################################################################ # OpenMP if(TUVX_ENABLE_OPENMP) @@ -40,7 +40,7 @@ if(TUVX_ENABLE_OPENMP) endif() endif() -# ############################################################################## +################################################################################ # NetCDF library find_package(PkgConfig REQUIRED) @@ -48,7 +48,7 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(netcdff IMPORTED_TARGET REQUIRED netcdf-fortran) pkg_check_modules(netcdfc IMPORTED_TARGET REQUIRED netcdf) -# ############################################################################## +################################################################################ # yaml-cpp FetchContent_Declare( @@ -59,7 +59,7 @@ FetchContent_Declare( ${FETCHCONTENT_QUIET}) FetchContent_MakeAvailable(yaml-cpp) -# ############################################################################## +################################################################################ # Docs if(TUVX_BUILD_DOCS) @@ -67,7 +67,7 @@ if(TUVX_BUILD_DOCS) find_package(Sphinx REQUIRED) endif() -# ############################################################################## +################################################################################ # google test and benchmark if(TUVX_ENABLE_TESTS) @@ -101,5 +101,4 @@ if(TUVX_ENABLE_TESTS) set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() -# ############################################################################## -# ############################################################################## +################################################################################ \ No newline at end of file diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index fcd217e9..a75650aa 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -16,7 +16,7 @@ function(add_test_dependency run_second run_first) f_${run_first}) endfunction(add_test_dependency) -# ############################################################################## +################################################################################ # build and add a standard test (one linked to the tuvx library) function(create_standard_test) @@ -72,7 +72,7 @@ function(create_standard_cxx_test) ${TEST_SKIP_MEMCHECK}) endfunction(create_standard_cxx_test) -# ############################################################################## +################################################################################ # Add a test function(add_tuvx_test test_name test_binary test_args working_dir) diff --git a/test/unit/linear_algebra/CMakeLists.txt b/test/unit/linear_algebra/CMakeLists.txt index 436ce7a6..bde82ed8 100644 --- a/test/unit/linear_algebra/CMakeLists.txt +++ b/test/unit/linear_algebra/CMakeLists.txt @@ -1,13 +1,13 @@ -# ############################################################################## +################################################################################ # Test utilities include(test_util) -# ############################################################################## +################################################################################ # tests create_standard_cxx_test(NAME tridiagonal_solver SOURCES test_tridiagonal_solver.cpp) create_standard_cxx_test(NAME error_function SOURCES test_error_function.cpp) -# ############################################################################## +################################################################################ From 783b494f58365e0f1267fcd118bdb1dfa2af3743 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 10:56:16 -0500 Subject: [PATCH 23/51] using find lapacke from other open source libraries --- README.md | 2 + benchmark/CMakeLists.txt | 7 +- cmake/FindLAPACKE.cmake | 421 +++++++++++++++++++++++++++++++++ cmake/dependencies.cmake | 1 + cmake/test_util.cmake | 10 +- docker/Dockerfile | 15 +- docker/Dockerfile.coverage | 15 +- docker/Dockerfile.docs | 14 +- docker/Dockerfile.memcheck | 15 +- docker/Dockerfile.mpi | 15 +- docker/Dockerfile.mpi.memcheck | 15 +- 11 files changed, 478 insertions(+), 52 deletions(-) create mode 100644 cmake/FindLAPACKE.cmake diff --git a/README.md b/README.md index 217a79d7..620c62a2 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ <img src="docs/source/_static/logo.svg" width="300"> </h1><br> +![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&layout=compact) + Tropospheric ultraviolet-extended (TUV-x): A photolysis rate calculator [![License](https://img.shields.io/github/license/NCAR/tuv-x.svg)](https://github.com/NCAR/tuv-x/blob/main/LICENSE) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 0271f936..97c1247a 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -4,4 +4,9 @@ target_include_directories( ${LAPACK_INCLUDE_DIRS}) target_link_libraries(benchmark_tridiagonal_solver - PUBLIC LAPACK::LAPACK benchmark::benchmark musica::tuvx) + PUBLIC + LAPACK::LAPACK + ${LAPACKE_LIBRARIES} + benchmark::benchmark + musica::tuvx +) diff --git a/cmake/FindLAPACKE.cmake b/cmake/FindLAPACKE.cmake new file mode 100644 index 00000000..a53891eb --- /dev/null +++ b/cmake/FindLAPACKE.cmake @@ -0,0 +1,421 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2016 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find LAPACKE include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(LAPACKE +# [REQUIRED] # Fail with error if lapacke is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# LAPACKE depends on the following libraries: +# - LAPACK +# +# This module finds headers and lapacke library. +# Results are reported in variables: +# LAPACKE_FOUND - True if headers and requested libraries were found +# LAPACKE_LINKER_FLAGS - list of required linker flags (excluding -l and -L) +# LAPACKE_INCLUDE_DIRS - lapacke include directories +# LAPACKE_LIBRARY_DIRS - Link directories for lapacke libraries +# LAPACKE_LIBRARIES - lapacke component libraries to be linked +# LAPACKE_INCLUDE_DIRS_DEP - lapacke + dependencies include directories +# LAPACKE_LIBRARY_DIRS_DEP - lapacke + dependencies link directories +# LAPACKE_LIBRARIES_DEP - lapacke libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DLAPACKE_DIR=path/to/lapacke): +# LAPACKE_DIR - Where to find the base directory of lapacke +# LAPACKE_INCDIR - Where to find the header files +# LAPACKE_LIBDIR - Where to find the library files +# The module can also look for the following environment variables if paths +# are not given as cmake variable: LAPACKE_DIR, LAPACKE_INCDIR, LAPACKE_LIBDIR +# +# If the static version of the LAPACKE libraries is required, please add the +# following in your CMakeLists.txt before calling find_package(LAPACKE): +# set(LAPACKE_STATIC TRUE) +# +# LAPACKE could be directly embedded in LAPACK library (ex: Intel MKL) so that +# we test a lapacke function with the lapack libraries found and set LAPACKE +# variables to LAPACK ones if test is successful. To skip this feature and +# look for a stand alone lapacke, please add the following in your +# CMakeLists.txt before to call find_package(LAPACKE): +# set(LAPACKE_STANDALONE TRUE) + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013-2016 Florent Pruvost +# +# This file is part of a computer program whose purpose is to process +# Matrices Over Runtime Systems @ Exascale (MORSE). More information +# can be found on the following website: http://www.inria.fr/en/teams/morse. +# +# This software is governed by the CeCILL-C license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-C +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-C license and that you accept its terms. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= + +if (NOT LAPACKE_FOUND) + set(LAPACKE_DIR "" CACHE PATH "Installation directory of LAPACKE library") + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "A cache variable, namely LAPACKE_DIR, has been set to specify the install directory of LAPACKE") + endif() +endif() + +# LAPACKE depends on LAPACK anyway, try to find it +if (NOT LAPACK_FOUND) + if(LAPACKE_FIND_REQUIRED) + find_package(LAPACKEXT REQUIRED) + else() + find_package(LAPACKEXT) + endif() +endif() + +# LAPACKE depends on LAPACK +if (LAPACK_FOUND) + + if (NOT LAPACKE_STANDALONE) + # check if a lapacke function exists in the LAPACK lib + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES "${LAPACK_LINKER_FLAGS};${LAPACK_LIBRARIES}") + unset(LAPACKE_WORKS CACHE) + check_function_exists(LAPACKE_dgeqrf LAPACKE_WORKS) + mark_as_advanced(LAPACKE_WORKS) + set(CMAKE_REQUIRED_LIBRARIES) + + if(LAPACKE_WORKS) + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke: test with lapack succeeds") + endif() + # test succeeds: LAPACKE is in LAPACK + set(LAPACKE_LIBRARIES "${LAPACK_LIBRARIES}") + set(LAPACKE_LIBRARIES_DEP "${LAPACK_LIBRARIES}") + if (LAPACK_LIBRARY_DIRS) + set(LAPACKE_LIBRARY_DIRS "${LAPACK_LIBRARY_DIRS}") + endif() + if(LAPACK_INCLUDE_DIRS) + set(LAPACKE_INCLUDE_DIRS "${LAPACK_INCLUDE_DIRS}") + set(LAPACKE_INCLUDE_DIRS_DEP "${LAPACK_INCLUDE_DIRS}") + endif() + if (LAPACK_LINKER_FLAGS) + set(LAPACKE_LINKER_FLAGS "${LAPACK_LINKER_FLAGS}") + endif() + endif() + endif (NOT LAPACKE_STANDALONE) + + if (LAPACKE_STANDALONE OR NOT LAPACKE_WORKS) + + if(NOT LAPACKE_WORKS AND NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke : test with lapack fails") + endif() + # test fails: try to find LAPACKE lib exterior to LAPACK + + # Try to find LAPACKE lib + ####################### + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + set(ENV_LAPACKE_DIR "$ENV{LAPACKE_DIR}") + set(ENV_LAPACKE_INCDIR "$ENV{LAPACKE_INCDIR}") + if(ENV_LAPACKE_INCDIR) + list(APPEND _inc_env "${ENV_LAPACKE_INCDIR}") + elseif(ENV_LAPACKE_DIR) + list(APPEND _inc_env "${ENV_LAPACKE_DIR}") + list(APPEND _inc_env "${ENV_LAPACKE_DIR}/include") + list(APPEND _inc_env "${ENV_LAPACKE_DIR}/include/lapacke") + else() + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the lapacke header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(LAPACKE_INCDIR) + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${LAPACKE_INCDIR}) + else() + if(LAPACKE_DIR) + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${LAPACKE_DIR} + PATH_SUFFIXES "include" "include/lapacke") + else() + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(LAPACKE_lapacke.h_DIRS) + + # If found, add path to cmake variable + # ------------------------------------ + if (LAPACKE_lapacke.h_DIRS) + set(LAPACKE_INCLUDE_DIRS "${LAPACKE_lapacke.h_DIRS}") + else () + set(LAPACKE_INCLUDE_DIRS "LAPACKE_INCLUDE_DIRS-NOTFOUND") + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke -- lapacke.h not found") + endif() + endif() + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + set(ENV_LAPACKE_LIBDIR "$ENV{LAPACKE_LIBDIR}") + if(ENV_LAPACKE_LIBDIR) + list(APPEND _lib_env "${ENV_LAPACKE_LIBDIR}") + elseif(ENV_LAPACKE_DIR) + list(APPEND _lib_env "${ENV_LAPACKE_DIR}") + list(APPEND _lib_env "${ENV_LAPACKE_DIR}/lib") + else() + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the lapacke lib in the given paths + # ---------------------------------------------- + + # name of the lapacke library + set(LAPACKE_lapacke_NAMES "lapacke") + if(LAPACKE_STATIC) + if(WIN32) + set(LAPACKE_lapacke_NAMES "liblapacke.lib") + endif() + + if(UNIX) + set(LAPACKE_lapacke_NAMES "liblapacke.a") + endif() + endif() + + # call cmake macro to find the lib path + if(LAPACKE_LIBDIR) + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES ${LAPACKE_lapacke_NAMES} + HINTS ${LAPACKE_LIBDIR}) + else() + if(LAPACKE_DIR) + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES ${LAPACKE_lapacke_NAMES} + HINTS ${LAPACKE_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES ${LAPACKE_lapacke_NAMES} + HINTS ${_lib_env}) + endif() + endif() + mark_as_advanced(LAPACKE_lapacke_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (LAPACKE_lapacke_LIBRARY) + get_filename_component(lapacke_lib_path "${LAPACKE_lapacke_LIBRARY}" PATH) + # set cmake variables + set(LAPACKE_LIBRARIES "${LAPACKE_lapacke_LIBRARY}") + set(LAPACKE_LIBRARY_DIRS "${lapacke_lib_path}") + else () + set(LAPACKE_LIBRARIES "LAPACKE_LIBRARIES-NOTFOUND") + set(LAPACKE_LIBRARY_DIRS "LAPACKE_LIBRARY_DIRS-NOTFOUND") + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke -- lib lapacke not found") + endif() + endif () + + # check a function to validate the find + if(LAPACKE_LIBRARIES) + + set(REQUIRED_LDFLAGS) + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # LAPACKE + if (LAPACKE_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${LAPACKE_INCLUDE_DIRS}") + endif() + if (LAPACKE_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${LAPACKE_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${LAPACKE_LIBRARIES}") + # LAPACK + if (LAPACK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${LAPACK_INCLUDE_DIRS}") + endif() + if (LAPACK_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${LAPACK_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${LAPACK_LIBRARIES}") + if (LAPACK_LINKER_FLAGS) + list(APPEND REQUIRED_LDFLAGS "${LAPACK_LINKER_FLAGS}") + endif() + # Fortran + if (CMAKE_C_COMPILER_ID MATCHES "GNU") + find_library( + FORTRAN_gfortran_LIBRARY + NAMES gfortran + HINTS ${_lib_env} + ) + mark_as_advanced(FORTRAN_gfortran_LIBRARY) + if (FORTRAN_gfortran_LIBRARY) + list(APPEND REQUIRED_LIBS "${FORTRAN_gfortran_LIBRARY}") + endif() + elseif (CMAKE_C_COMPILER_ID MATCHES "Intel") + find_library( + FORTRAN_ifcore_LIBRARY + NAMES ifcore + HINTS ${_lib_env} + ) + mark_as_advanced(FORTRAN_ifcore_LIBRARY) + if (FORTRAN_ifcore_LIBRARY) + list(APPEND REQUIRED_LIBS "${FORTRAN_ifcore_LIBRARY}") + endif() + endif() + # m + find_library(M_LIBRARY NAMES m HINTS ${_lib_env}) + mark_as_advanced(M_LIBRARY) + if(M_LIBRARY) + list(APPEND REQUIRED_LIBS "-lm") + endif() + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}") + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + + # test link + unset(LAPACKE_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(LAPACKE_dgeqrf LAPACKE_WORKS) + mark_as_advanced(LAPACKE_WORKS) + + if(LAPACKE_WORKS) + # save link with dependencies + set(LAPACKE_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(LAPACKE_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(LAPACKE_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + set(LAPACKE_LINKER_FLAGS "${REQUIRED_LDFLAGS}") + list(REMOVE_DUPLICATES LAPACKE_LIBRARY_DIRS_DEP) + list(REMOVE_DUPLICATES LAPACKE_INCLUDE_DIRS_DEP) + list(REMOVE_DUPLICATES LAPACKE_LINKER_FLAGS) + else() + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke: test of LAPACKE_dgeqrf with lapacke and lapack libraries fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(LAPACKE_LIBRARIES) + + endif (LAPACKE_STANDALONE OR NOT LAPACKE_WORKS) + +else(LAPACK_FOUND) + + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "LAPACKE requires LAPACK but LAPACK has not been found." + "Please look for LAPACK first.") + endif() + +endif(LAPACK_FOUND) + +if (LAPACKE_LIBRARIES) + list(GET LAPACKE_LIBRARIES 0 first_lib) + get_filename_component(first_lib_path "${first_lib}" PATH) + if (${first_lib_path} MATCHES "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)") + string(REGEX REPLACE "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)" "" not_cached_dir "${first_lib_path}") + set(LAPACKE_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of LAPACKE library" FORCE) + else() + set(LAPACKE_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of LAPACKE library" FORCE) + endif() +endif() +mark_as_advanced(LAPACKE_DIR) +mark_as_advanced(LAPACKE_DIR_FOUND) + +# check that LAPACKE has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LAPACKE DEFAULT_MSG + LAPACKE_LIBRARIES + LAPACKE_WORKS) \ No newline at end of file diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d3a495a2..2017d46b 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -6,6 +6,7 @@ include(FetchContent) find_package(BLAS) find_package(LAPACK) +find_package(LAPACKE) ################################################################################ # Memory check diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index a75650aa..a816bd19 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -54,10 +54,12 @@ function(create_standard_cxx_test) "${multiValues}" ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) - target_include_directories(test_${TEST_NAME} PUBLIC ${LAPACK_INCLUDE_DIRS}) - target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx - GTest::gtest_main) - message(STATUS ${OpenBLAS_INCLUDE_DIRS}) + target_link_libraries(test_${TEST_NAME} PUBLIC + LAPACK::LAPACK + ${LAPACKE_LIBRARIES} + musica::tuvx + GTest::gtest_main + ) # link additional libraries foreach(library ${TEST_LIBRARIES}) diff --git a/docker/Dockerfile b/docker/Dockerfile index 940b791a..5dd38fc7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,19 +2,19 @@ FROM fedora:37 RUN dnf -y update \ && dnf -y install \ - gcc-fortran \ - gcc-c++ \ + cmake \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ - valgrind \ + make \ + netcdf-fortran-devel \ python3 \ python3-pip \ - lapack-devel \ + valgrind \ yaml-cpp-devel \ && dnf clean all @@ -30,7 +30,6 @@ RUN cd /tuv-x \ && cmake -D CMAKE_BUILD_TYPE=release \ -D TUVX_INSTALL_INCLUDE_DIR=/usr/local/include \ -D TUVX_INSTALL_MOD_DIR=/usr/local/include \ - -D LAPACK_LIBRARIES=-llapacke \ .. \ && make install -j 8 diff --git a/docker/Dockerfile.coverage b/docker/Dockerfile.coverage index d030cb4d..8f5363cb 100644 --- a/docker/Dockerfile.coverage +++ b/docker/Dockerfile.coverage @@ -2,19 +2,19 @@ FROM fedora:37 RUN dnf -y update \ && dnf -y install \ - gcc-fortran \ - gcc-c++ \ + cmake \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ - valgrind \ + make \ + netcdf-fortran-devel \ python3 \ python3-pip \ - lapack-devel \ + valgrind \ yaml-cpp-devel \ && dnf clean all @@ -26,7 +26,6 @@ RUN mkdir /build \ && cd /build \ && cmake -D TUVX_ENABLE_COVERAGE:BOOL=TRUE \ -D CMAKE_BUILD_TYPE=COVERAGE \ - -D LAPACK_LIBRARIES=-llapacke \ /tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.docs b/docker/Dockerfile.docs index 2c82b0a6..3fdb9147 100644 --- a/docker/Dockerfile.docs +++ b/docker/Dockerfile.docs @@ -2,20 +2,20 @@ FROM fedora:37 RUN dnf -y update \ && dnf -y install \ + cmake \ doxygen \ - gcc-fortran \ - gcc-c++ \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ - valgrind \ + make \ + netcdf-fortran-devel \ python3 \ python3-pip \ - lapack-devel \ + valgrind \ yaml-cpp-devel \ && dnf clean all diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck index 51044d75..8a2127ca 100644 --- a/docker/Dockerfile.memcheck +++ b/docker/Dockerfile.memcheck @@ -2,19 +2,19 @@ FROM fedora:37 RUN dnf -y update \ && dnf -y install \ - gcc-fortran \ - gcc-c++ \ + cmake \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ - valgrind \ + make \ + netcdf-fortran-devel \ python3 \ python3-pip \ - lapack-devel \ + valgrind \ yaml-cpp-devel \ && dnf clean all @@ -27,7 +27,6 @@ RUN mkdir /build \ && cmake \ -DTUVX_ENABLE_MEMCHECK:BOOL=TRUE \ -DCMAKE_BUILD_TYPE=DEBUG \ - -D LAPACK_LIBRARIES=-llapacke \ /tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.mpi b/docker/Dockerfile.mpi index c5cfed99..7f3a382a 100644 --- a/docker/Dockerfile.mpi +++ b/docker/Dockerfile.mpi @@ -10,20 +10,20 @@ USER test_user WORKDIR /home/test_user RUN sudo dnf -y install \ - openmpi-devel \ - gcc-fortran \ - gcc-c++ \ + cmake \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ + make \ + netcdf-fortran-devel \ + openmpi-devel \ python3 \ python3-pip \ valgrind-openmpi \ - lapack-devel \ yaml-cpp-devel \ && sudo dnf clean all @@ -42,7 +42,6 @@ RUN mkdir build \ -D CMAKE_CXX_COMPILER=/usr/lib64/openmpi/bin/mpicxx \ -D TUVX_ENABLE_OPENMP:BOOL=TRUE \ -D TUVX_ENABLE_MPI:BOOL=TRUE \ - -D LAPACK_LIBRARIES=-llapacke \ ../tuv-x \ && make -j 8 diff --git a/docker/Dockerfile.mpi.memcheck b/docker/Dockerfile.mpi.memcheck index e91bbed1..88e0c44b 100644 --- a/docker/Dockerfile.mpi.memcheck +++ b/docker/Dockerfile.mpi.memcheck @@ -10,20 +10,20 @@ USER test_user WORKDIR /home/test_user RUN sudo dnf -y install \ - openmpi-devel \ - gcc-fortran \ - gcc-c++ \ + cmake \ gcc \ + gcc-c++ \ + gcc-fortran \ gdb \ git \ - netcdf-fortran-devel \ - cmake \ - make \ + lapack-devel \ lcov \ + make \ + netcdf-fortran-devel \ + openmpi-devel \ python3 \ python3-pip \ valgrind-openmpi \ - lapack-devel \ yaml-cpp-devel \ && sudo dnf clean all @@ -43,7 +43,6 @@ RUN mkdir build \ -D TUVX_ENABLE_OPENMP:BOOL=TRUE \ -D TUVX_ENABLE_MPI:BOOL=TRUE \ -D TUVX_ENABLE_MEMCHECK:BOOL=TRUE \ - -D LAPACK_LIBRARIES=-llapacke \ ../tuv-x \ && make -j 8 From 4dc105f4cb35f57de402f3e773877b853dd4b477 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 11:04:12 -0500 Subject: [PATCH 24/51] correcting working directory --- docker/Dockerfile | 2 +- docker/Dockerfile.memcheck | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 5dd38fc7..f9d5738d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -33,4 +33,4 @@ RUN cd /tuv-x \ .. \ && make install -j 8 -WORKDIR /build +WORKDIR /tuvx/build diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck index 8a2127ca..587f1d4d 100644 --- a/docker/Dockerfile.memcheck +++ b/docker/Dockerfile.memcheck @@ -30,4 +30,4 @@ RUN mkdir /build \ /tuv-x \ && make -j 8 -WORKDIR /build +WORKDIR /tuvx/build From 6621164e2ec3f68d4ccdc60adfdd52d194878a96 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 11:15:03 -0500 Subject: [PATCH 25/51] adding benchmark cmake variable --- CMakeLists.txt | 10 +++++++--- cmake/dependencies.cmake | 28 ++++++++++++++-------------- docker/Dockerfile.docs | 8 +++++--- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1dbc3f7f..1ec9e4d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ option(TUVX_ENABLE_MPI "Enable MPI parallel support" OFF) cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF "TUVX_ENABLE_MPI" OFF) option(TUVX_ENABLE_TESTS "Build tests" ON) +option(TUVX_ENABLE_BENCHMARK "Build benchmark examples" ON) option(TUVX_ENABLE_COVERAGE "Enable code coverage output" OFF) option(TUVX_ENABLE_MEMCHECK "Enable memory checking in tests" OFF) option(TUVX_ENABLE_NC_CONFIG "Use nc-config to determine NetCDF libraries" OFF) @@ -170,8 +171,11 @@ if(PROJECT_IS_TOP_LEVEL) endif() ################################################################################ - # benchmarking -add_subdirectory(benchmark) -# + +if(TUVX_ENABLE_BENCHMARK) + add_subdirectory(benchmark) +endif() + + ################################################################################ diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 2017d46b..48c2f5b2 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -71,17 +71,26 @@ endif() ################################################################################ # google test and benchmark +if(TUVX_ENABLE_BENCHMARK) + FetchContent_Declare( + googlebenchmark + GIT_REPOSITORY https://github.com/google/benchmark.git + GIT_TAG v1.8.3 + ) + + set(BENCHMARK_DOWNLOAD_DEPENDENCIES ON) + set(BENCHMARK_ENABLE_GTEST_TESTS OFF) + set(BENCHMARK_ENABLE_ASSEMBLY_TESTS OFF) + set(BENCHMARK_ENABLE_TESTING OFF) + FetchContent_MakeAvailable(googlebenchmark) +endif() + if(TUVX_ENABLE_TESTS) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG be03d00f5f0cc3a997d1a368bee8a1fe93651f48) - FetchContent_Declare( - googlebenchmark - GIT_REPOSITORY https://github.com/google/benchmark.git - GIT_TAG main) # need main for benchmark::benchmark - set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) @@ -91,15 +100,6 @@ if(TUVX_ENABLE_TESTS) FetchContent_MakeAvailable(googletest) - set(BENCHMARK_DOWNLOAD_DEPENDENCIES ON) - set(BENCHMARK_ENABLE_GTEST_TESTS OFF) - set(BENCHMARK_ENABLE_ASSEMBLY_TESTS OFF) - set(BENCHMARK_ENABLE_TESTING OFF) - FetchContent_MakeAvailable(googlebenchmark) - - # don't run clang-tidy on google test - set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "") - set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() ################################################################################ \ No newline at end of file diff --git a/docker/Dockerfile.docs b/docker/Dockerfile.docs index 3fdb9147..67b84af1 100644 --- a/docker/Dockerfile.docs +++ b/docker/Dockerfile.docs @@ -31,9 +31,11 @@ RUN echo "The suffix is '$SWITCHER_SUFFIX'" RUN mkdir /build \ && cd /build \ - && cmake -D TUVX_ENABLE_TESTS=OFF \ - -D TUVX_BUILD_DOCS=ON \ - /tuv-x \ + && cmake \ + -D TUVX_ENABLE_TESTS=OFF \ + -D TUVX_ENABLE_BENCHMARK=OFF \ + -D TUVX_BUILD_DOCS=ON \ + /tuv-x \ && make docs WORKDIR /build From 26fd879950b6e983d2ace3e0bf8fd89e0abfc470 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 11:21:25 -0500 Subject: [PATCH 26/51] dash --- docker/Dockerfile | 2 +- docker/Dockerfile.memcheck | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f9d5738d..fac338b8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -33,4 +33,4 @@ RUN cd /tuv-x \ .. \ && make install -j 8 -WORKDIR /tuvx/build +WORKDIR /tuv-x/build diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck index 587f1d4d..afc46d8b 100644 --- a/docker/Dockerfile.memcheck +++ b/docker/Dockerfile.memcheck @@ -30,4 +30,4 @@ RUN mkdir /build \ /tuv-x \ && make -j 8 -WORKDIR /tuvx/build +WORKDIR /tuv-x/build From 874e9709bc6deb8af50f2508b99f4113687afdc3 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 11:29:35 -0500 Subject: [PATCH 27/51] fixing path --- docker/Dockerfile.memcheck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck index afc46d8b..8a2127ca 100644 --- a/docker/Dockerfile.memcheck +++ b/docker/Dockerfile.memcheck @@ -30,4 +30,4 @@ RUN mkdir /build \ /tuv-x \ && make -j 8 -WORKDIR /tuv-x/build +WORKDIR /build From 4994013528401bc1732955bc14fc9d8ab05817f2 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 11:46:33 -0500 Subject: [PATCH 28/51] removing language thing --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 620c62a2..217a79d7 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ <img src="docs/source/_static/logo.svg" width="300"> </h1><br> -![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&layout=compact) - Tropospheric ultraviolet-extended (TUV-x): A photolysis rate calculator [![License](https://img.shields.io/github/license/NCAR/tuv-x.svg)](https://github.com/NCAR/tuv-x/blob/main/LICENSE) From 0e909a017cadabc2d4081935e4e6579943ca72d8 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Mon, 1 Jul 2024 16:58:29 -0500 Subject: [PATCH 29/51] ignore gtest when running clang tidy --- cmake/dependencies.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 48c2f5b2..d41d95e4 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -100,6 +100,9 @@ if(TUVX_ENABLE_TESTS) FetchContent_MakeAvailable(googletest) + # don't run clang-tidy on google test + set_target_properties(gtest PROPERTIES CXX_CLANG_TIDY "") + set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() ################################################################################ \ No newline at end of file From 9239c15273d144f582543ea107fa5123861cf1a1 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@casper-login2.hpc.ucar.edu> Date: Tue, 2 Jul 2024 14:54:35 -0600 Subject: [PATCH 30/51] unit tests operate on one size (1000); formatting changes; use same random values to compare lapacke and tuvx --- CMakeLists.txt | 38 ++-- benchmark/benchmark_tridiagonal_solver.cpp | 72 ++++---- cmake/dependencies.cmake | 19 +- .../tuvx/linear_algebra/linear_algebra.hpp | 4 +- .../tuvx/linear_algebra/linear_algebra.inl | 17 +- src/CMakeLists.txt | 20 +-- .../test_tridiagonal_solver.cpp | 162 +++++++----------- 7 files changed, 140 insertions(+), 192 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ec9e4d8..db2d537b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,12 @@ -################################################################################ +# ############################################################################## # Preamble cmake_minimum_required(VERSION 3.17) project( tuv-x - VERSION 0.9.0 - LANGUAGES Fortran CXX C -) + VERSION 0.8.0 + LANGUAGES Fortran CXX C) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake") @@ -37,7 +36,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -################################################################################ +# ############################################################################## # Projet wide setup options include(CMakeDependentOption) @@ -45,7 +44,6 @@ option(TUVX_ENABLE_MPI "Enable MPI parallel support" OFF) cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF "TUVX_ENABLE_MPI" OFF) option(TUVX_ENABLE_TESTS "Build tests" ON) -option(TUVX_ENABLE_BENCHMARK "Build benchmark examples" ON) option(TUVX_ENABLE_COVERAGE "Enable code coverage output" OFF) option(TUVX_ENABLE_MEMCHECK "Enable memory checking in tests" OFF) option(TUVX_ENABLE_NC_CONFIG "Use nc-config to determine NetCDF libraries" OFF) @@ -96,12 +94,12 @@ if(TUVX_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -################################################################################ +# ############################################################################## # Dependencies include(cmake/dependencies.cmake) -################################################################################ +# ############################################################################## # TUV-x targets add_subdirectory(src) @@ -117,11 +115,8 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(tuv-x PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(tuv-x - PUBLIC - musica::tuvx - yaml-cpp::yaml-cpp -) +target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp + ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) target_include_directories( tuv-x PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> @@ -131,14 +126,14 @@ if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -################################################################################ +# ############################################################################## # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -################################################################################ +# ############################################################################## # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -160,9 +155,10 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) enable_testing() add_subdirectory(test) + add_subdirectory(benchmark) endif() -################################################################################ +# ############################################################################## # Packaging # only include packaging if we are the top level project being built @@ -170,12 +166,4 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -################################################################################ -# benchmarking - -if(TUVX_ENABLE_BENCHMARK) - add_subdirectory(benchmark) -endif() - - -################################################################################ +# ############################################################################## diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index e1ea6e3f..5779728d 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -3,35 +3,33 @@ #include <benchmark/benchmark.h> +#include <random> +#include <vector> + #ifdef TUVX_COMPILE_WITH_INTEL #include <mkl_lapacke.h> #elif TUVX_COMPILE_WITH_GCC #include <lapacke.h> #endif -using namespace tuvx; -typedef TridiagonalMatrix<double> trid_matd; -typedef std::vector<double> vecd; - -typedef TridiagonalMatrix<float> trid_matf; -typedef std::vector<float> vecf; - const std::size_t system_size = 1e6; -const bool diagonally_dominant = false; +const bool diagonally_dominant = true; + +const unsigned random_number_seed = 1; static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) { - vecf x(system_size); - vecf b(system_size); - trid_matf A(system_size); - + std::vector<float> x(system_size); + std::vector<float> b(system_size); + tuvx::TridiagonalMatrix<float> A(system_size); + std::mt19937 random_device(random_number_seed); for (auto _ : state) { state.PauseTiming(); - FillRandom<float>(A, diagonally_dominant); - FillRandom<float>(x); - b = Dot<float>(A, x); + tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<float>(x, random_number_seed); + b = tuvx::Dot<float>(A, x); state.ResumeTiming(); LAPACKE_sgtsv( @@ -48,18 +46,20 @@ static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) { - vecd x(system_size); - vecd b(system_size); - trid_matd A(system_size); + std::vector<double> x(system_size); + std::vector<double> b(system_size); + tuvx::TridiagonalMatrix<double> A(system_size); + std::mt19937 random_device(random_number_seed); // Perform setup here for (auto _ : state) { state.PauseTiming(); - FillRandom<double>(A, diagonally_dominant); - FillRandom<double>(x); - b = Dot<double>(A, x); + tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<double>(x, random_number_seed); + b = tuvx::Dot<double>(A, x); state.ResumeTiming(); + LAPACKE_dgtsv( LAPACK_ROW_MAJOR, system_size, @@ -74,37 +74,37 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) { - vecd x(system_size); - vecd b(system_size); - trid_matd A(system_size); - vecd x_approx(system_size); + std::vector<double> x(system_size); + std::vector<double> b(system_size); + tuvx::TridiagonalMatrix<double> A(system_size); + std::vector<double> x_approx(system_size); for (auto _ : state) { state.PauseTiming(); - FillRandom<double>(A, diagonally_dominant); - FillRandom<double>(x); + tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<double>(x, random_number_seed); state.ResumeTiming(); - Solve<double>(A, b); + tuvx::Solve<double>(A, b); } } static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) { - vecf x(system_size); - vecf b(system_size); - trid_matf A(system_size); - vecf x_approx(system_size); + std::vector<float> x(system_size); + std::vector<float> b(system_size); + tuvx::TridiagonalMatrix<float> A(system_size); + std::vector<float> x_approx(system_size); // Perform setup here for (auto _ : state) { state.PauseTiming(); - FillRandom<float>(A, diagonally_dominant); - FillRandom<float>(x); - b = Dot<float>(A, x); + tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<float>(x, random_number_seed); + b = tuvx::Dot<float>(A, x); state.ResumeTiming(); - Solve<float>(A, b); + tuvx::Solve<float>(A, b); } } diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d41d95e4..d451d662 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,14 +1,14 @@ find_package(PkgConfig REQUIRED) include(FetchContent) -################################################################################ +# ############################################################################## # LAPACK find_package(BLAS) find_package(LAPACK) find_package(LAPACKE) -################################################################################ +# ############################################################################## # Memory check if(TUVX_ENABLE_MEMCHECK) @@ -28,7 +28,7 @@ if(TUVX_ENABLE_MEMCHECK) endif() endif() -################################################################################ +# ############################################################################## # OpenMP if(TUVX_ENABLE_OPENMP) @@ -41,7 +41,7 @@ if(TUVX_ENABLE_OPENMP) endif() endif() -################################################################################ +# ############################################################################## # NetCDF library find_package(PkgConfig REQUIRED) @@ -49,7 +49,7 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(netcdff IMPORTED_TARGET REQUIRED netcdf-fortran) pkg_check_modules(netcdfc IMPORTED_TARGET REQUIRED netcdf) -################################################################################ +# ############################################################################## # yaml-cpp FetchContent_Declare( @@ -60,7 +60,7 @@ FetchContent_Declare( ${FETCHCONTENT_QUIET}) FetchContent_MakeAvailable(yaml-cpp) -################################################################################ +# ############################################################################## # Docs if(TUVX_BUILD_DOCS) @@ -68,15 +68,14 @@ if(TUVX_BUILD_DOCS) find_package(Sphinx REQUIRED) endif() -################################################################################ +# ############################################################################## # google test and benchmark if(TUVX_ENABLE_BENCHMARK) FetchContent_Declare( googlebenchmark GIT_REPOSITORY https://github.com/google/benchmark.git - GIT_TAG v1.8.3 - ) + GIT_TAG v1.8.3) set(BENCHMARK_DOWNLOAD_DEPENDENCIES ON) set(BENCHMARK_ENABLE_GTEST_TESTS OFF) @@ -105,4 +104,4 @@ if(TUVX_ENABLE_TESTS) set_target_properties(gtest_main PROPERTIES CXX_CLANG_TIDY "") endif() -################################################################################ \ No newline at end of file +# ############################################################################## diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 7c93d108..0358cd04 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -31,13 +31,13 @@ namespace tuvx /// @brief Fill a std::vector with random values /// @param x Vector to allocate and fill template<typename T> - void FillRandom(std::vector<T> &x); + void FillRandom(std::vector<T> &x, const unsigned &seed); /// @fn Initialize random matrix function /// @brief Fills a matrix with uniformly distributed random values. /// @param A tridiagonal matrix to allocate and fill template<typename T> - void FillRandom(TridiagonalMatrix<T> &A, bool diagonally_dominant = false); + void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, bool diagonally_dominant = false); /// @fn print vector function /// @brief displays the data stored inside a std::vector diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index 52cf6085..385e639e 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -1,4 +1,5 @@ +#include <random> namespace tuvx { @@ -52,24 +53,24 @@ namespace tuvx } template<typename T> - inline void FillRandom(std::vector<T> &x) + inline void FillRandom(std::vector<T> &x, const unsigned &seed) { - std::random_device dev; - std::mt19937 rng(dev()); // sample from normal distribution + + std::mt19937 random_device(seed); std::normal_distribution<double> distribution(5.0, 1.0); for (std::size_t i = 0; i < x.size(); i++) { - x[i] = (T)distribution(rng); + x[i] = (T)distribution(random_device); } } template<typename T> - inline void FillRandom(TridiagonalMatrix<T> &A, bool diagonally_dominant) + inline void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, bool diagonally_dominant) { - FillRandom<T>(A.main_diagonal_); - FillRandom<T>(A.lower_diagonal_); - FillRandom<T>(A.upper_diagonal_); + FillRandom<T>(A.main_diagonal_, seed); + FillRandom<T>(A.lower_diagonal_, seed); + FillRandom<T>(A.upper_diagonal_, seed); if (diagonally_dominant) { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5c9ad8f7..7981493b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -################################################################################ +# ############################################################################## # Photo-decomp tool source # object library @@ -44,19 +44,15 @@ endif() add_library(tuvx $<TARGET_OBJECTS:tuvx_object>) add_library(musica::tuvx ALIAS tuvx) - if(NOT BUILD_SHARED_LIBS) - set_target_properties(tuvx_object - PROPERTIES - POSITION_INDEPENDENT_CODE ON - ) + set_target_properties(tuvx_object PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -set_target_properties(tuvx PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${TUVX_LIB_DIR} - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} -) +set_target_properties( + tuvx + PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${TUVX_LIB_DIR} + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) target_link_libraries(tuvx PUBLIC tuvx_object) @@ -112,4 +108,4 @@ add_subdirectory(quantum_yields) add_subdirectory(radiative_transfer) add_subdirectory(spectral_weights) add_subdirectory(util) -################################################################################ +# ############################################################################## diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index d3993562..8eaae0cd 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -5,6 +5,7 @@ #include <cfloat> #include <cstddef> #include <cstdlib> +#include <iterator> #include <limits> #include <vector> @@ -14,22 +15,14 @@ #include <lapacke.h> #endif -using namespace tuvx; - -typedef TridiagonalMatrix<double> trid_matd; -typedef std::vector<double> vecd; - -typedef TridiagonalMatrix<float> trid_matf; -typedef std::vector<float> vecf; - const double tol_dp = std::numeric_limits<double>::epsilon(); const float tol_sp = std::numeric_limits<float>::epsilon(); const std::size_t number_of_runs = 20; +const std::size_t size = 10; const bool diagonally_dominant = true; -std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; - +const unsigned random_number_seed = 1; /// @test Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed @@ -38,28 +31,24 @@ std::size_t sizes[5] = { 1000, 10000, 100000, 1000000, 10000000 }; TEST(TridiagSolveTest, SinglePrecision) { float error = 0; - vecd errors(5, 0); - for (std::size_t i = 0; i < 5; i++) - { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecf x(sizes[i]); - vecf b(sizes[i]); - trid_matf A(sizes[i]); - FillRandom<float>(A, diagonally_dominant); - FillRandom<float>(x); - b = Dot<float>(A, x); + for (std::size_t j = 0; j < number_of_runs; j++) + { + std::vector<float> x(size); + std::vector<float> b(size); + tuvx::TridiagonalMatrix<float> A(size); - Solve<float>(A, b); + tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<float>(x, random_number_seed); + b = tuvx::Dot<float>(A, x); + tuvx::Solve<float>(A, b); - errors[i] += ComputeError<float>(x, b); - } + error += tuvx::ComputeError<float>(x, b); + } - errors[i] /= number_of_runs; + error /= number_of_runs; - EXPECT_LE(errors[i], tol_sp); - } + EXPECT_LE(error, tol_sp); } /// @test Tridiagonal Solver Test for Double Precision Floats. @@ -69,26 +58,22 @@ TEST(TridiagSolveTest, SinglePrecision) /// sizes to check consistency TEST(TridiagSolveTest, DoublePrecision) { - vecd errors(5, 0); - for (std::size_t i = 0; i < 5; i++) + double error = 0; + for (std::size_t j = 0; j < number_of_runs; j++) { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecd x(sizes[i]); - vecd b(sizes[i]); - trid_matd A(sizes[i]); - - FillRandom<double>(A, diagonally_dominant); - FillRandom<double>(x); - b = Dot<double>(A, x); - - Solve<double>(A, b); - - errors[i] += ComputeError<double>(x, b); - } - errors[i] /= number_of_runs; - EXPECT_LE(errors[i], tol_dp); + std::vector<double> x(size); + std::vector<double> b(size); + tuvx::TridiagonalMatrix<double> A(size); + + tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<double>(x, random_number_seed); + b = tuvx::Dot<double>(A, x); + tuvx::Solve<double>(A, b); + + error += tuvx::ComputeError<double>(x, b); } + error /= number_of_runs; + EXPECT_LE(error, tol_dp); } /// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. @@ -98,36 +83,26 @@ TEST(TridiagSolveTest, DoublePrecision) /// sizes to check consistency TEST(LapackeTest, SinglePrecision) { - vecf errors(5, 0); + float error; - for (std::size_t i = 0; i < 5; i++) + for (std::size_t j = 0; j < number_of_runs; j++) { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecf x(sizes[i]); - vecf b(sizes[i]); - trid_matf A(sizes[i]); - - FillRandom<float>(A, diagonally_dominant); - FillRandom<float>(x); - b = Dot<float>(A, x); - - LAPACKE_sgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - // to be written to a file - errors[i] += ComputeError<float>(x, b); - } - errors[i] /= number_of_runs; - EXPECT_LE(errors[i], tol_sp); + std::vector<float> x(size); + std::vector<float> b(size); + tuvx::TridiagonalMatrix<float> A(size); + + tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<float>(x, random_number_seed); + b = tuvx::Dot<float>(A, x); + + LAPACKE_sgtsv( + LAPACK_ROW_MAJOR, size, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), A.upper_diagonal_.data(), b.data(), 1); + + // to be written to a file + error += tuvx::ComputeError<float>(x, b); } + error /= number_of_runs; + EXPECT_LE(error, tol_sp); } /// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. @@ -137,33 +112,22 @@ TEST(LapackeTest, SinglePrecision) /// sizes to check consistency TEST(LapackeTest, DoublePrecision) { - vecd errors(5, 0); - vecd times(5, 0); - for (std::size_t i = 0; i < 5; i++) + double error; + for (std::size_t j = 0; j < number_of_runs; j++) { - for (std::size_t j = 0; j < number_of_runs; j++) - { - vecd x(sizes[i]); - vecd b(sizes[i]); - trid_matd A(sizes[i]); - - FillRandom<double>(A, diagonally_dominant); - FillRandom<double>(x); - b = Dot<double>(A, x); - - LAPACKE_dgtsv( - LAPACK_ROW_MAJOR, - sizes[i], - 1, - A.lower_diagonal_.data(), - A.main_diagonal_.data(), - A.upper_diagonal_.data(), - b.data(), - 1); - - errors[i] += ComputeError<double>(x, b); - } - errors[i] /= number_of_runs; - EXPECT_LE(errors[i], tol_dp); + std::vector<double> x(size); + std::vector<double> b(size); + tuvx::TridiagonalMatrix<double> A(size); + + tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); + tuvx::FillRandom<double>(x, random_number_seed); + b = tuvx::Dot<double>(A, x); + + LAPACKE_dgtsv( + LAPACK_ROW_MAJOR, size, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), A.upper_diagonal_.data(), b.data(), 1); + + error += tuvx::ComputeError<double>(x, b); } + error /= number_of_runs; + EXPECT_LE(error, tol_dp); } From a6299bcf2f02347e1ee53ede56dee3b7b7f3e293 Mon Sep 17 00:00:00 2001 From: Kyle Shores <kyle.shores44@gmail.com> Date: Wed, 3 Jul 2024 10:43:44 -0500 Subject: [PATCH 31/51] re-adding benchmark variable --- CMakeLists.txt | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db2d537b..25741002 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,13 @@ -# ############################################################################## +################################################################################ # Preamble cmake_minimum_required(VERSION 3.17) project( tuv-x - VERSION 0.8.0 - LANGUAGES Fortran CXX C) + VERSION 0.9.0 + LANGUAGES Fortran CXX C +) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake") @@ -36,7 +37,7 @@ if(${CMAKE_VERSION} VERSION_LESS "3.21") endif() endif() -# ############################################################################## +################################################################################ # Projet wide setup options include(CMakeDependentOption) @@ -44,6 +45,7 @@ option(TUVX_ENABLE_MPI "Enable MPI parallel support" OFF) cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF "TUVX_ENABLE_MPI" OFF) option(TUVX_ENABLE_TESTS "Build tests" ON) +option(TUVX_ENABLE_BENCHMARK "Build benchmark examples" ON) option(TUVX_ENABLE_COVERAGE "Enable code coverage output" OFF) option(TUVX_ENABLE_MEMCHECK "Enable memory checking in tests" OFF) option(TUVX_ENABLE_NC_CONFIG "Use nc-config to determine NetCDF libraries" OFF) @@ -94,12 +96,12 @@ if(TUVX_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() -# ############################################################################## +################################################################################ # Dependencies include(cmake/dependencies.cmake) -# ############################################################################## +################################################################################ # TUV-x targets add_subdirectory(src) @@ -115,8 +117,11 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(tuv-x PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() -target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp - ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) +target_link_libraries(tuv-x + PUBLIC + musica::tuvx + yaml-cpp::yaml-cpp +) target_include_directories( tuv-x PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> @@ -126,14 +131,14 @@ if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) endif() -# ############################################################################## +################################################################################ # TUV-x docs if(TUVX_BUILD_DOCS) add_subdirectory(docs) endif() -# ############################################################################## +################################################################################ # TUV-x tests if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) @@ -155,10 +160,9 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) enable_testing() add_subdirectory(test) - add_subdirectory(benchmark) endif() -# ############################################################################## +################################################################################ # Packaging # only include packaging if we are the top level project being built @@ -166,4 +170,11 @@ if(PROJECT_IS_TOP_LEVEL) add_subdirectory(packaging) endif() -# ############################################################################## +################################################################################ +# benchmarking + +if(TUVX_ENABLE_BENCHMARK) + add_subdirectory(benchmark) +endif() + +################################################################################ From 510c956c4bc9737ac15a645792931d017598c24d Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 10:41:43 -0600 Subject: [PATCH 32/51] fixed bug in test_error_function unit test; updated documentation --- benchmark/benchmark_tridiagonal_solver.cpp | 58 +++++------ cmake/dependencies.cmake | 2 +- .../tuvx/linear_algebra/linear_algebra.hpp | 6 +- .../tuvx/linear_algebra/linear_algebra.inl | 4 +- .../linear_algebra/test_error_function.cpp | 24 ++--- .../test_tridiagonal_solver.cpp | 95 +++++++++++-------- 6 files changed, 104 insertions(+), 85 deletions(-) diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index 5779728d..b649d433 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -12,29 +12,29 @@ #include <lapacke.h> #endif -const std::size_t system_size = 1e6; +const std::size_t SYSTEM_SIZE = 1e6; -const bool diagonally_dominant = true; +const bool MAKE_DIAGONALLY_DOMINANT = true; -const unsigned random_number_seed = 1; +const unsigned RANDOM_NUMBER_SEED = 1; static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) { - std::vector<float> x(system_size); - std::vector<float> b(system_size); - tuvx::TridiagonalMatrix<float> A(system_size); - std::mt19937 random_device(random_number_seed); + std::vector<float> x(SYSTEM_SIZE); + std::vector<float> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<float> A(SYSTEM_SIZE); + std::mt19937 random_device(RANDOM_NUMBER_SEED); for (auto _ : state) { state.PauseTiming(); - tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<float>(x, random_number_seed); + tuvx::FillRandom<float>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<float>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<float>(A, x); state.ResumeTiming(); LAPACKE_sgtsv( LAPACK_ROW_MAJOR, - system_size, + SYSTEM_SIZE, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), @@ -46,23 +46,23 @@ static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) { - std::vector<double> x(system_size); - std::vector<double> b(system_size); - tuvx::TridiagonalMatrix<double> A(system_size); + std::vector<double> x(SYSTEM_SIZE); + std::vector<double> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<double> A(SYSTEM_SIZE); - std::mt19937 random_device(random_number_seed); + std::mt19937 random_device(RANDOM_NUMBER_SEED); // Perform setup here for (auto _ : state) { state.PauseTiming(); - tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<double>(x, random_number_seed); + tuvx::FillRandom<double>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<double>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<double>(A, x); state.ResumeTiming(); LAPACKE_dgtsv( LAPACK_ROW_MAJOR, - system_size, + SYSTEM_SIZE, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), @@ -74,16 +74,16 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) { - std::vector<double> x(system_size); - std::vector<double> b(system_size); - tuvx::TridiagonalMatrix<double> A(system_size); - std::vector<double> x_approx(system_size); + std::vector<double> x(SYSTEM_SIZE); + std::vector<double> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<double> A(SYSTEM_SIZE); + std::vector<double> x_approx(SYSTEM_SIZE); for (auto _ : state) { state.PauseTiming(); - tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<double>(x, random_number_seed); + tuvx::FillRandom<double>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<double>(x, RANDOM_NUMBER_SEED); state.ResumeTiming(); tuvx::Solve<double>(A, b); } @@ -91,17 +91,17 @@ static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) { - std::vector<float> x(system_size); - std::vector<float> b(system_size); - tuvx::TridiagonalMatrix<float> A(system_size); - std::vector<float> x_approx(system_size); + std::vector<float> x(SYSTEM_SIZE); + std::vector<float> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<float> A(SYSTEM_SIZE); + std::vector<float> x_approx(SYSTEM_SIZE); // Perform setup here for (auto _ : state) { state.PauseTiming(); - tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<float>(x, random_number_seed); + tuvx::FillRandom<float>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<float>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<float>(A, x); state.ResumeTiming(); tuvx::Solve<float>(A, b); diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index d451d662..0ab9bb34 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -6,7 +6,7 @@ include(FetchContent) find_package(BLAS) find_package(LAPACK) -find_package(LAPACKE) +# find_package(LAPACKE) # ############################################################################## # Memory check diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 0358cd04..127eb71b 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -30,14 +30,18 @@ namespace tuvx /// @fn Random vector function /// @brief Fill a std::vector with random values /// @param x Vector to allocate and fill + /// @param seed for random number generation template<typename T> void FillRandom(std::vector<T> &x, const unsigned &seed); /// @fn Initialize random matrix function /// @brief Fills a matrix with uniformly distributed random values. /// @param A tridiagonal matrix to allocate and fill + /// @param seed for random number generation + /// @param make_diagonally_dominant make the tridiagonal matrix diagonally dominant (diagonal value is greater than sum of + /// the corrosponding row) template<typename T> - void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, bool diagonally_dominant = false); + void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); /// @fn print vector function /// @brief displays the data stored inside a std::vector diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index 385e639e..2d4b720a 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -66,13 +66,13 @@ namespace tuvx } template<typename T> - inline void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, bool diagonally_dominant) + inline void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant) { FillRandom<T>(A.main_diagonal_, seed); FillRandom<T>(A.lower_diagonal_, seed); FillRandom<T>(A.upper_diagonal_, seed); - if (diagonally_dominant) + if (make_diagonally_dominant) { // make diagonally dominant (diagonal value greater than sum of its row) std::size_t i = 0; diff --git a/test/unit/linear_algebra/test_error_function.cpp b/test/unit/linear_algebra/test_error_function.cpp index 9c40605b..3acea7b4 100644 --- a/test/unit/linear_algebra/test_error_function.cpp +++ b/test/unit/linear_algebra/test_error_function.cpp @@ -8,9 +8,9 @@ #include <cstdlib> #include <vector> -const std::size_t size = 10; // size of the system to test -const double tol_dp = 1e-14; // tolorance for double -const float tol_sp = 1e-5; // tolorance for single point floating precision +const std::size_t SIZE = 10; // size of the system to test +const double TOL_DP = 1e-14; // tolorance for double +const float TOL_SP = 1e-5; // tolorance for single point floating precision using namespace tuvx; @@ -20,15 +20,17 @@ typedef std::vector<double> vecd; typedef TridiagonalMatrix<float> trid_matf; typedef std::vector<float> vecf; +const unsigned RANDOM_NUMBER_SEED = 1; + /// @test Error function test /// @brief Test the correctness of the error function used for /// testing the Linear approximation solvers TEST(ErrorFunctionTest, DoublePrecision) { // same vector should return 0 error - vecd x(size); - vecd x1(size); - FillRandom<double>(x); + vecd x(SIZE); + vecd x1(SIZE); + FillRandom<double>(x, RANDOM_NUMBER_SEED); x1 = x; double error = ComputeError<double>(x, x1); EXPECT_EQ(error, 0.0); @@ -39,7 +41,7 @@ TEST(ErrorFunctionTest, DoublePrecision) x[0] += 0.1; error = ComputeError<double>(x, x1); - EXPECT_LE(error - 0.1 / size, tol_dp); + EXPECT_LE(error - 0.1 / SIZE, TOL_SP); } /// @test Error function test @@ -48,9 +50,9 @@ TEST(ErrorFunctionTest, DoublePrecision) TEST(ErrorFunctionTest, SinglePrecision) { // same vector should return 0 error - vecf x(size); - vecf x1(size); - FillRandom<float>(x); + vecf x(SIZE); + vecf x1(SIZE); + FillRandom<float>(x, RANDOM_NUMBER_SEED); x1 = x; float error = ComputeError<float>(x, x1); EXPECT_EQ(error, 0.0f); @@ -61,5 +63,5 @@ TEST(ErrorFunctionTest, SinglePrecision) x[0] += 0.1f; error = ComputeError(x, x1); - EXPECT_LE(error - 0.1f / size, tol_sp); + EXPECT_LE(error - 0.1f / SIZE, TOL_SP); } diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index 8eaae0cd..fd7dcba5 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -5,7 +5,6 @@ #include <cfloat> #include <cstddef> #include <cstdlib> -#include <iterator> #include <limits> #include <vector> @@ -15,14 +14,14 @@ #include <lapacke.h> #endif -const double tol_dp = std::numeric_limits<double>::epsilon(); -const float tol_sp = std::numeric_limits<float>::epsilon(); +const double TOL_DP = std::numeric_limits<double>::epsilon(); +const float TOL_SP = std::numeric_limits<float>::epsilon(); -const std::size_t number_of_runs = 20; -const std::size_t size = 10; -const bool diagonally_dominant = true; +const std::size_t NUMBER_OF_RUNS = 20; +const std::size_t SYSTEM_SIZE = 10; +const bool MAKE_DIAGONALLY_DOMINANT = true; -const unsigned random_number_seed = 1; +const unsigned RANDOM_NUMBER_SEED = 1; /// @test Tridiagonal Solver Test for single Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed @@ -32,23 +31,23 @@ TEST(TridiagSolveTest, SinglePrecision) { float error = 0; - for (std::size_t j = 0; j < number_of_runs; j++) + for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { - std::vector<float> x(size); - std::vector<float> b(size); - tuvx::TridiagonalMatrix<float> A(size); + std::vector<float> x(SYSTEM_SIZE); + std::vector<float> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<float> A(SYSTEM_SIZE); - tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<float>(x, random_number_seed); + tuvx::FillRandom<float>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<float>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<float>(A, x); tuvx::Solve<float>(A, b); error += tuvx::ComputeError<float>(x, b); } - error /= number_of_runs; + error /= NUMBER_OF_RUNS; - EXPECT_LE(error, tol_sp); + EXPECT_LE(error, TOL_SP); } /// @test Tridiagonal Solver Test for Double Precision Floats. @@ -59,21 +58,21 @@ TEST(TridiagSolveTest, SinglePrecision) TEST(TridiagSolveTest, DoublePrecision) { double error = 0; - for (std::size_t j = 0; j < number_of_runs; j++) + for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { - std::vector<double> x(size); - std::vector<double> b(size); - tuvx::TridiagonalMatrix<double> A(size); + std::vector<double> x(SYSTEM_SIZE); + std::vector<double> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<double> A(SYSTEM_SIZE); - tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<double>(x, random_number_seed); + tuvx::FillRandom<double>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<double>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<double>(A, x); tuvx::Solve<double>(A, b); error += tuvx::ComputeError<double>(x, b); } - error /= number_of_runs; - EXPECT_LE(error, tol_dp); + error /= NUMBER_OF_RUNS; + EXPECT_LE(error, TOL_DP); } /// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. @@ -85,24 +84,31 @@ TEST(LapackeTest, SinglePrecision) { float error; - for (std::size_t j = 0; j < number_of_runs; j++) + for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { - std::vector<float> x(size); - std::vector<float> b(size); - tuvx::TridiagonalMatrix<float> A(size); + std::vector<float> x(SYSTEM_SIZE); + std::vector<float> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<float> A(SYSTEM_SIZE); - tuvx::FillRandom<float>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<float>(x, random_number_seed); + tuvx::FillRandom<float>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<float>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<float>(A, x); LAPACKE_sgtsv( - LAPACK_ROW_MAJOR, size, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), A.upper_diagonal_.data(), b.data(), 1); + LAPACK_ROW_MAJOR, + SYSTEM_SIZE, + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); // to be written to a file error += tuvx::ComputeError<float>(x, b); } - error /= number_of_runs; - EXPECT_LE(error, tol_sp); + error /= NUMBER_OF_RUNS; + EXPECT_LE(error, TOL_SP); } /// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. @@ -113,21 +119,28 @@ TEST(LapackeTest, SinglePrecision) TEST(LapackeTest, DoublePrecision) { double error; - for (std::size_t j = 0; j < number_of_runs; j++) + for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { - std::vector<double> x(size); - std::vector<double> b(size); - tuvx::TridiagonalMatrix<double> A(size); + std::vector<double> x(SYSTEM_SIZE); + std::vector<double> b(SYSTEM_SIZE); + tuvx::TridiagonalMatrix<double> A(SYSTEM_SIZE); - tuvx::FillRandom<double>(A, random_number_seed, diagonally_dominant); - tuvx::FillRandom<double>(x, random_number_seed); + tuvx::FillRandom<double>(A, RANDOM_NUMBER_SEED, MAKE_DIAGONALLY_DOMINANT); + tuvx::FillRandom<double>(x, RANDOM_NUMBER_SEED); b = tuvx::Dot<double>(A, x); LAPACKE_dgtsv( - LAPACK_ROW_MAJOR, size, 1, A.lower_diagonal_.data(), A.main_diagonal_.data(), A.upper_diagonal_.data(), b.data(), 1); + LAPACK_ROW_MAJOR, + SYSTEM_SIZE, + 1, + A.lower_diagonal_.data(), + A.main_diagonal_.data(), + A.upper_diagonal_.data(), + b.data(), + 1); error += tuvx::ComputeError<double>(x, b); } - error /= number_of_runs; - EXPECT_LE(error, tol_dp); + error /= NUMBER_OF_RUNS; + EXPECT_LE(error, TOL_DP); } From 9f54f5a6e3445532864d7abce2d4700390b950d9 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 10:42:45 -0600 Subject: [PATCH 33/51] uncommented findLAPACKE --- cmake/dependencies.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 0ab9bb34..d451d662 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -6,7 +6,7 @@ include(FetchContent) find_package(BLAS) find_package(LAPACK) -# find_package(LAPACKE) +find_package(LAPACKE) # ############################################################################## # Memory check From 9f983b3af0d4416c73ba6630a065a4e33b0828fa Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 10:51:48 -0600 Subject: [PATCH 34/51] added some more documentation --- benchmark/benchmark_tridiagonal_solver.cpp | 8 ++++++-- test/unit/linear_algebra/test_tridiagonal_solver.cpp | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index b649d433..49264bb2 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -18,6 +18,7 @@ const bool MAKE_DIAGONALLY_DOMINANT = true; const unsigned RANDOM_NUMBER_SEED = 1; +/// @brief This function benchmarks the lapacke tridiagonal matrix solver for single precision static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) { std::vector<float> x(SYSTEM_SIZE); @@ -44,6 +45,7 @@ static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) } } +/// @brief This function benchmarks the lapacke tridiagonal matrix solver for double precision static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) { std::vector<double> x(SYSTEM_SIZE); @@ -72,6 +74,7 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) } } +/// @brief This function benchmarks the tuvx tridiagonal matrix solver for single precision static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) { std::vector<double> x(SYSTEM_SIZE); @@ -89,6 +92,7 @@ static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) } } +/// @brief This function benchmarks the tuvx tridiagonal matrix solver for double precision static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) { std::vector<float> x(SYSTEM_SIZE); @@ -108,11 +112,11 @@ static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) } } -// Register the function as a benchmark +/// @brief Register the functions defined above as a benchmark BENCHMARK(BM_LAPACKE_DOUBLE_PRECISISON); BENCHMARK(BM_LAPACKE_SINGLE_PRECISISON); BENCHMARK(BM_TUVX_DOUBLE_PRECISISON); BENCHMARK(BM_TUVX_SINGLE_PRECISISON); -// Run the benchmark +/// @brief run all benchmarks BENCHMARK_MAIN(); diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index fd7dcba5..a35739b6 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -104,7 +104,6 @@ TEST(LapackeTest, SinglePrecision) b.data(), 1); - // to be written to a file error += tuvx::ComputeError<float>(x, b); } error /= NUMBER_OF_RUNS; From c22d41da85b7fa94fde528de894c2135fdd25339 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 11:27:32 -0600 Subject: [PATCH 35/51] fixed a bug that caused the memcheck to fail --- test/unit/linear_algebra/test_tridiagonal_solver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index a35739b6..b9256cdd 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -82,7 +82,7 @@ TEST(TridiagSolveTest, DoublePrecision) /// sizes to check consistency TEST(LapackeTest, SinglePrecision) { - float error; + float error = 0; for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { @@ -117,7 +117,7 @@ TEST(LapackeTest, SinglePrecision) /// sizes to check consistency TEST(LapackeTest, DoublePrecision) { - double error; + double error = 0; for (std::size_t j = 0; j < NUMBER_OF_RUNS; j++) { std::vector<double> x(SYSTEM_SIZE); From eda38a6358cedf7381819ee643d66623b07edde6 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Wed, 3 Jul 2024 11:36:16 -0600 Subject: [PATCH 36/51] Apply suggestions from code review CMAKE file formatting changes Co-authored-by: mwaxmonsky <137746677+mwaxmonsky@users.noreply.github.com> --- CMakeLists.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25741002..cc3f0c40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,18 +16,13 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE "${PROJECT_SOURCE_DIR}/cmake/set_defaults.cmake") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE - "Release" - CACHE - STRING - "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." - FORCE) + set(CMAKE_BUILD_TYPE "Release" + CACHE STRING + "Choose the type of build, options are: ${CMAKE_CONFIGURATION_TYPES}." + FORCE) endif(NOT CMAKE_BUILD_TYPE) -message( - STATUS - "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}" -) +message(STATUS "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}") if(${CMAKE_VERSION} VERSION_LESS "3.21") if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) From d3b66f7a877830cd3bee43647275a95f9e86ebaf Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho2.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 11:50:54 -0600 Subject: [PATCH 37/51] switched to std::abs instead of ::abs --- include/tuvx/linear_algebra/linear_algebra.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/tuvx/linear_algebra/linear_algebra.inl b/include/tuvx/linear_algebra/linear_algebra.inl index 2d4b720a..a04caa09 100644 --- a/include/tuvx/linear_algebra/linear_algebra.inl +++ b/include/tuvx/linear_algebra/linear_algebra.inl @@ -102,7 +102,7 @@ namespace tuvx T error = 0; for (std::size_t i = 0; i < x.size(); i++) { - error += (abs(x[i] - x_approx[i]) / std::max(x[i], x_approx[i])) / (T)x.size(); + error += (std::abs(x[i] - x_approx[i]) / std::max(x[i], x_approx[i])) / (T)x.size(); } return error; } From bb1c2278447cf5d4c113e203999e872f35f4b5a6 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho5.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 14:41:23 -0600 Subject: [PATCH 38/51] reverted formatting changes in cmake file --- CMakeLists.txt | 84 +++++++++++++++++++------------------------ cmake/test_util.cmake | 77 ++++++++++++++------------------------- 2 files changed, 63 insertions(+), 98 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc3f0c40..4194ce81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,26 +5,24 @@ cmake_minimum_required(VERSION 3.17) project( tuv-x - VERSION 0.9.0 + VERSION 0.8.0 LANGUAGES Fortran CXX C ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake") -set(CMAKE_USER_MAKE_RULES_OVERRIDE - "${PROJECT_SOURCE_DIR}/cmake/set_defaults.cmake") +set(CMAKE_USER_MAKE_RULES_OVERRIDE "${PROJECT_SOURCE_DIR}/cmake/set_defaults.cmake") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" - CACHE STRING - "Choose the type of build, options are: ${CMAKE_CONFIGURATION_TYPES}." + set(CMAKE_BUILD_TYPE "Release" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) endif(NOT CMAKE_BUILD_TYPE) -message(STATUS "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}") +message ( STATUS "CMake build configuration for tuv-x(${CMAKE_BUILD_TYPE}) ${PROJECT_VERSION}" ) -if(${CMAKE_VERSION} VERSION_LESS "3.21") +if(${CMAKE_VERSION} VERSION_LESS "3.21") if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_TOP_LEVEL TRUE) else() @@ -37,29 +35,22 @@ endif() include(CMakeDependentOption) option(TUVX_ENABLE_MPI "Enable MPI parallel support" OFF) -cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF - "TUVX_ENABLE_MPI" OFF) +cmake_dependent_option(TUVX_ENABLE_OPENMP "Enable OpenMP support" OFF "TUVX_ENABLE_MPI" OFF) option(TUVX_ENABLE_TESTS "Build tests" ON) -option(TUVX_ENABLE_BENCHMARK "Build benchmark examples" ON) +option(TUVX_ENABLE_BENCHMARK "Build benchmark examples" OFF) option(TUVX_ENABLE_COVERAGE "Enable code coverage output" OFF) option(TUVX_ENABLE_MEMCHECK "Enable memory checking in tests" OFF) option(TUVX_ENABLE_NC_CONFIG "Use nc-config to determine NetCDF libraries" OFF) option(TUVX_ENABLE_REGRESSION_TESTS "Enable regression tests" ON) option(TUVX_BUILD_DOCS "Build the documentation" OFF) -set(TUVX_MOD_DIR - "${PROJECT_BINARY_DIR}/include" - CACHE PATH "Directory to find Fortran module files during the build") -set(TUVX_INSTALL_MOD_DIR - "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" - CACHE PATH "Directory to install Fortran module files") -set(TUVX_INSTALL_INCLUDE_DIR - "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" - CACHE PATH "Directory to install include files") +set(TUVX_MOD_DIR "${PROJECT_BINARY_DIR}/include" CACHE PATH "Directory to find Fortran module files during the build") +set(TUVX_INSTALL_MOD_DIR "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "Directory to install Fortran module files") +set(TUVX_INSTALL_INCLUDE_DIR "${INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "Directory to install include files") # Set up include and lib directories set(TUVX_LIB_DIR "${PROJECT_BINARY_DIR}/lib") include(GNUInstallDirs) -set(INSTALL_PREFIX "tuvx-${PROJECT_VERSION}") +set(INSTALL_PREFIX "tuvx-${PROJECT_VERSION}" ) # Compiler specific flags if(${CMAKE_Fortran_COMPILER_ID} MATCHES "NAG") @@ -76,19 +67,13 @@ if(TUVX_ENABLE_MPI) endif() # copy data -if(TUVX_ENABLE_TESTS) - add_custom_target( - copy-data ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/data - ${CMAKE_BINARY_DIR}/data) - add_custom_target( - copy-tool ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/tool - ${CMAKE_BINARY_DIR}/tool) - add_custom_target( - copy-examples ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) +if (TUVX_ENABLE_TESTS) + add_custom_target(copy-data ALL COMMAND ${CMAKE_COMMAND} + -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/data ${CMAKE_BINARY_DIR}/data) + add_custom_target(copy-tool ALL COMMAND ${CMAKE_COMMAND} + -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/tool ${CMAKE_BINARY_DIR}/tool) + add_custom_target(copy-examples ALL COMMAND ${CMAKE_COMMAND} + -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/examples ${CMAKE_BINARY_DIR}/examples) endif() ################################################################################ @@ -106,21 +91,30 @@ configure_file(src/version.F90.in version.F90 @ONLY) add_executable(tuv-x src/tuvx.F90 version.F90) -set_target_properties(tuv-x PROPERTIES LINKER_LANGUAGE Fortran) +set_target_properties(tuv-x + PROPERTIES + LINKER_LANGUAGE Fortran +) if(NOT BUILD_SHARED_LIBS) - set_target_properties(tuv-x PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(tuv-x + PROPERTIES + POSITION_INDEPENDENT_CODE ON + ) endif() target_link_libraries(tuv-x PUBLIC musica::tuvx yaml-cpp::yaml-cpp + ${BLAS_LIBRARIES} + ${LAPACK_LIBRARIES} ) -target_include_directories( - tuv-x PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> - $<INSTALL_INTERFACE:${TUVX_INSTALL_INCLUDE_DIR}>) +target_include_directories(tuv-x + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include> + $<INSTALL_INTERFACE:${TUVX_INSTALL_INCLUDE_DIR}>) if(TUVX_ENABLE_OPENMP) target_link_libraries(tuv-x PUBLIC OpenMP::OpenMP_Fortran) @@ -142,14 +136,10 @@ if(PROJECT_IS_TOP_LEVEL AND TUVX_ENABLE_TESTS) include(CodeCoverage) if(${CMAKE_Fortran_COMPILER_ID} MATCHES "GNU") setup_target_for_coverage_lcov( - NAME - coverage - EXECUTABLE - "ctest" - EXCLUDE - "${PROJECT_SOURCE_DIR}/test/*" - BASE_DIRECTORY - "${PROJECT_SOURCE_DIR}/src") + NAME coverage + EXECUTABLE "ctest" + EXCLUDE "${PROJECT_SOURCE_DIR}/test/*" + BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src") endif() endif() diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index a816bd19..d77af674 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -9,11 +9,10 @@ endif() # impose that one test runs after another so that we can safely test in parallel function(add_test_dependency run_second run_first) - # add dependency between two tests - # https://stackoverflow.com/a/66931930/5217293 - set_tests_properties(${run_first} PROPERTIES FIXTURES_SETUP f_${run_first}) - set_tests_properties(${run_second} PROPERTIES FIXTURES_REQUIRED - f_${run_first}) + # add dependency between two tests + # https://stackoverflow.com/a/66931930/5217293 + set_tests_properties(${run_first} PROPERTIES FIXTURES_SETUP f_${run_first}) + set_tests_properties(${run_second} PROPERTIES FIXTURES_REQUIRED f_${run_first}) endfunction(add_test_dependency) ################################################################################ @@ -24,13 +23,10 @@ function(create_standard_test) set(singleValues NAME WORKING_DIRECTORY) set(multiValues SOURCES) include(CMakeParseArguments) - cmake_parse_arguments(${prefix} " " "${singleValues}" "${multiValues}" - ${ARGN}) + cmake_parse_arguments(${prefix} " " "${singleValues}" "${multiValues}" ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) set_target_properties(test_${TEST_NAME} PROPERTIES LINKER_LANGUAGE Fortran) - target_link_libraries( - test_${TEST_NAME} PUBLIC musica::tuvx tuvx_test_utils ${BLAS_LIBRARIES} - ${LAPACK_LIBRARIES} GTest::gtest_main) + target_link_libraries(test_${TEST_NAME} PUBLIC musica::tuvx tuvx_test_utils ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} GTest::gtest_main) if(TUVX_ENABLE_OPENMP) target_link_libraries(test_${TEST_NAME} PUBLIC OpenMP::OpenMP_Fortran) endif() @@ -50,17 +46,12 @@ function(create_standard_cxx_test) set(multiValues SOURCES LIBRARIES) include(CMakeParseArguments) - cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" - "${multiValues}" ${ARGN}) + cmake_parse_arguments(${prefix} "${optionalValues}" "${singleValues}" "${multiValues}" ${ARGN}) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) - target_link_libraries(test_${TEST_NAME} PUBLIC - LAPACK::LAPACK - ${LAPACKE_LIBRARIES} - musica::tuvx - GTest::gtest_main - ) + target_link_libraries(test_${TEST_NAME} PUBLIC musica::tuvx GTest::gtest_main) + # link additional libraries foreach(library ${TEST_LIBRARIES}) target_link_libraries(test_${TEST_NAME} PUBLIC ${library}) @@ -70,8 +61,7 @@ function(create_standard_cxx_test) set(TEST_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") endif() - add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY} - ${TEST_SKIP_MEMCHECK}) + add_tuvx_test(${TEST_NAME} test_${TEST_NAME} "" ${TEST_WORKING_DIRECTORY} ${TEST_SKIP_MEMCHECK}) endfunction(create_standard_cxx_test) ################################################################################ @@ -79,54 +69,39 @@ endfunction(create_standard_cxx_test) function(add_tuvx_test test_name test_binary test_args working_dir) if(TUVX_ENABLE_MPI) - add_test( - NAME ${test_name} + add_test(NAME ${test_name} COMMAND mpirun -v -np 2 ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + WORKING_DIRECTORY ${working_dir}) else() - add_test( - NAME ${test_name} - COMMAND ${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + add_test(NAME ${test_name} + COMMAND ${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) endif() - set(MEMORYCHECK_COMMAND_OPTIONS - "--error-exitcode=1 --trace-children=yes --leak-check=full -s --gen-suppressions=all ${MEMCHECK_SUPPRESS}" - ) + set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --trace-children=yes --leak-check=full -s --gen-suppressions=all ${MEMCHECK_SUPPRESS}") set(memcheck "${MEMORYCHECK_COMMAND} ${MEMORYCHECK_COMMAND_OPTIONS}") separate_arguments(memcheck) - if(TUVX_ENABLE_MPI - AND MEMORYCHECK_COMMAND - AND TUVX_ENABLE_MEMCHECK) - add_test( - NAME memcheck_${test_name} - COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} - ${test_args} - WORKING_DIRECTORY ${working_dir}) + if(TUVX_ENABLE_MPI AND MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) + add_test(NAME memcheck_${test_name} + COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) elseif(MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) - add_test( - NAME memcheck_${test_name} - COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - WORKING_DIRECTORY ${working_dir}) + add_test(NAME memcheck_${test_name} + COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) endif() endfunction(add_tuvx_test) ################################################################################ -# Setup regression tests. Add dependencies between each regression test and its +# Setup regression tests. Add dependencies between each regression test and its # memcheck test. Also add a dependence with any previous tests. Becuase TUV-x # outputs to the same location, concurrent runs of the standalone tool that # depend on the output must run in serial function(add_regression_test test_name command memcheck_command) - add_test( - NAME ${test_name} - COMMAND ${command} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME ${test_name} COMMAND ${command} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) if(MEMORYCHECK_COMMAND AND TUVX_ENABLE_MEMCHECK) - add_test( - NAME memcheck_${test_name} - COMMAND ${memcheck_command} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME memcheck_${test_name} COMMAND ${memcheck_command} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) endif() endfunction(add_regression_test) From 05e2827bc77189c5d683f16cc1538b8649fb0d41 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho5.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 15:18:26 -0600 Subject: [PATCH 39/51] re-added lapacke dependency in test_util --- cmake/test_util.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index d77af674..932df3db 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -50,8 +50,9 @@ function(create_standard_cxx_test) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) - target_link_libraries(test_${TEST_NAME} PUBLIC musica::tuvx GTest::gtest_main) - + target_include_directories(test_${TEST_NAME} PUBLIC ${LAPACK_INCLUDE_DIRS}) + target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx GTest::gtest_main) + # link additional libraries foreach(library ${TEST_LIBRARIES}) target_link_libraries(test_${TEST_NAME} PUBLIC ${library}) From 04a9b0fd842c6656459ba37b582025afb1536f74 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho5.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 15:24:16 -0600 Subject: [PATCH 40/51] linked LAPACKE libraries to unit tests --- cmake/test_util.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index 932df3db..7cdade62 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -51,7 +51,7 @@ function(create_standard_cxx_test) add_executable(test_${TEST_NAME} ${TEST_SOURCES}) target_include_directories(test_${TEST_NAME} PUBLIC ${LAPACK_INCLUDE_DIRS}) - target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK musica::tuvx GTest::gtest_main) + target_link_libraries(test_${TEST_NAME} PUBLIC LAPACK::LAPACK ${LAPACKE_LIBRARIES} musica::tuvx GTest::gtest_main) # link additional libraries foreach(library ${TEST_LIBRARIES}) From 20e73de68b72c6ad8bbb7fd5be4ab102f4761397 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho5.hsn.de.hpc.ucar.edu> Date: Wed, 3 Jul 2024 15:41:03 -0600 Subject: [PATCH 41/51] removed typedefs in test_error_function.cpp --- .../linear_algebra/test_error_function.cpp | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/test/unit/linear_algebra/test_error_function.cpp b/test/unit/linear_algebra/test_error_function.cpp index 3acea7b4..9c1db615 100644 --- a/test/unit/linear_algebra/test_error_function.cpp +++ b/test/unit/linear_algebra/test_error_function.cpp @@ -12,14 +12,6 @@ const std::size_t SIZE = 10; // size of the system to test const double TOL_DP = 1e-14; // tolorance for double const float TOL_SP = 1e-5; // tolorance for single point floating precision -using namespace tuvx; - -typedef TridiagonalMatrix<double> trid_matd; -typedef std::vector<double> vecd; - -typedef TridiagonalMatrix<float> trid_matf; -typedef std::vector<float> vecf; - const unsigned RANDOM_NUMBER_SEED = 1; /// @test Error function test @@ -28,11 +20,11 @@ const unsigned RANDOM_NUMBER_SEED = 1; TEST(ErrorFunctionTest, DoublePrecision) { // same vector should return 0 error - vecd x(SIZE); - vecd x1(SIZE); - FillRandom<double>(x, RANDOM_NUMBER_SEED); + std::vector<double> x(SIZE); + std::vector<double> x1(SIZE); + tuvx::FillRandom<double>(x, RANDOM_NUMBER_SEED); x1 = x; - double error = ComputeError<double>(x, x1); + double error = tuvx::ComputeError<double>(x, x1); EXPECT_EQ(error, 0.0); // L1 norm between x and (x[1]+0.1) should be 0.1/size; @@ -40,7 +32,7 @@ TEST(ErrorFunctionTest, DoublePrecision) x1 = x; x[0] += 0.1; - error = ComputeError<double>(x, x1); + error = tuvx::ComputeError<double>(x, x1); EXPECT_LE(error - 0.1 / SIZE, TOL_SP); } @@ -50,11 +42,11 @@ TEST(ErrorFunctionTest, DoublePrecision) TEST(ErrorFunctionTest, SinglePrecision) { // same vector should return 0 error - vecf x(SIZE); - vecf x1(SIZE); - FillRandom<float>(x, RANDOM_NUMBER_SEED); + std::vector<float> x(SIZE); + std::vector<float> x1(SIZE); + tuvx::FillRandom<float>(x, RANDOM_NUMBER_SEED); x1 = x; - float error = ComputeError<float>(x, x1); + float error = tuvx::ComputeError<float>(x, x1); EXPECT_EQ(error, 0.0f); // L1 norm between x and (x[1]+0.1) should be 0.1/size; @@ -62,6 +54,6 @@ TEST(ErrorFunctionTest, SinglePrecision) x1 = x; x[0] += 0.1f; - error = ComputeError(x, x1); + error = tuvx::ComputeError(x, x1); EXPECT_LE(error - 0.1f / SIZE, TOL_SP); } From 34b529bf442b6bb4f690c3d19ee3021b1c0068c8 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Fri, 5 Jul 2024 15:03:08 -0600 Subject: [PATCH 42/51] updated code documentation --- .../tuvx/linear_algebra/linear_algebra.hpp | 27 +++++++------------ .../linear_algebra/test_error_function.cpp | 6 ++--- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 127eb71b..ac53aa2d 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -9,10 +9,8 @@ namespace tuvx { - /// @struct Tridiagonal Matrix Data Structure. - /// @brief Given a matrix of shape (n, n), the - /// data structure holds three std::vectors - /// storing the diagonal values. + /// @brief Tridiagonal Matrix Data Structure. Given a matrix of shape (n, n), the + /// data structure holds three std::vectors storing the diagonal values. template<typename T> struct TridiagonalMatrix { @@ -20,22 +18,20 @@ namespace tuvx std::vector<T> upper_diagonal_; // upper diagonal std::vector<T> lower_diagonal_; // lower diagonal std::vector<T> main_diagonal_; // main diagonal - /// @fn tridiagonal matrix structure constructor - /// @brief initializes the three internal vectors based on + /// @brief tridiagonal matrix structure constructor + /// initializes the three internal vectors based on /// size. Main diagonal will be of size $n$, while the upper/lower /// diagonals will be of size $n-1# TridiagonalMatrix(std::size_t size); }; - /// @fn Random vector function - /// @brief Fill a std::vector with random values - /// @param x Vector to allocate and fill + /// @brief Random vector function + /// @param x Vector to and fill /// @param seed for random number generation template<typename T> void FillRandom(std::vector<T> &x, const unsigned &seed); - /// @fn Initialize random matrix function - /// @brief Fills a matrix with uniformly distributed random values. + /// @brief Initialize random matrix function /// @param A tridiagonal matrix to allocate and fill /// @param seed for random number generation /// @param make_diagonally_dominant make the tridiagonal matrix diagonally dominant (diagonal value is greater than sum of @@ -43,20 +39,17 @@ namespace tuvx template<typename T> void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); - /// @fn print vector function - /// @brief displays the data stored inside a std::vector + /// @brief display contents of std::vector /// @param x Vector to print template<typename T> void Print(const std::vector<T> &x); - /// @fn print matrix function /// @brief displays the data stored inside a tridiagonal matrix. /// For now, this function simply calls printvec() on the three diagonals. /// @param A tridiagonal matrix to print template<typename T> void Print(const TridiagonalMatrix<T> &A); - /// @fn Tridiagonal Linear System Solver /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b). /// store solution in b. /// @param A tridiagonal coeffcient matrix @@ -64,7 +57,6 @@ namespace tuvx template<typename T> void Solve(TridiagonalMatrix<T> &A, std::vector<T> &b); - /// @fn Tridiagonal Matrix - vector dot product /// @brief Specialized dot product function for tridiagonal matrices. /// @param A tridiagonal matrix /// @param x vector to multiply the matrix with @@ -72,8 +64,7 @@ namespace tuvx template<typename T> std::vector<T> Dot(const TridiagonalMatrix<T> &A, const std::vector<T> &b); - /// @fn residual vector function - /// @brief Computes the LP error norm between two vectors. Used for computing + /// @brief Computes the relative error between two vectors. Used for computing /// approximation errors. /// @param x true solution /// @param x_approx approximated solution diff --git a/test/unit/linear_algebra/test_error_function.cpp b/test/unit/linear_algebra/test_error_function.cpp index 9c1db615..800ee846 100644 --- a/test/unit/linear_algebra/test_error_function.cpp +++ b/test/unit/linear_algebra/test_error_function.cpp @@ -14,9 +14,8 @@ const float TOL_SP = 1e-5; // tolorance for single point floating precision const unsigned RANDOM_NUMBER_SEED = 1; -/// @test Error function test /// @brief Test the correctness of the error function used for -/// testing the Linear approximation solvers +/// testing the Linear approximation solvers with double precision data types. TEST(ErrorFunctionTest, DoublePrecision) { // same vector should return 0 error @@ -36,9 +35,8 @@ TEST(ErrorFunctionTest, DoublePrecision) EXPECT_LE(error - 0.1 / SIZE, TOL_SP); } -/// @test Error function test /// @brief Test the correctness of the error function used for -/// testing the Linear approximation solvers +/// testing the Linear approximation solvers with single precision data types. TEST(ErrorFunctionTest, SinglePrecision) { // same vector should return 0 error From 88fa5a68e0cddc331125fb87c76618890c6e8715 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Fri, 5 Jul 2024 16:47:57 -0600 Subject: [PATCH 43/51] documentaion changes --- .../tuvx/linear_algebra/linear_algebra.hpp | 19 +++++-------------- .../test_tridiagonal_solver.cpp | 14 +++++++------- y | 8 ++++++++ y.pub | 1 + 4 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 y create mode 100644 y.pub diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index ac53aa2d..976e5fae 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -9,8 +9,7 @@ namespace tuvx { - /// @brief Tridiagonal Matrix Data Structure. Given a matrix of shape (n, n), the - /// data structure holds three std::vectors storing the diagonal values. + /// @brief Tridiagonal Matrix Data Structure. template<typename T> struct TridiagonalMatrix { @@ -19,23 +18,19 @@ namespace tuvx std::vector<T> lower_diagonal_; // lower diagonal std::vector<T> main_diagonal_; // main diagonal /// @brief tridiagonal matrix structure constructor - /// initializes the three internal vectors based on - /// size. Main diagonal will be of size $n$, while the upper/lower - /// diagonals will be of size $n-1# TridiagonalMatrix(std::size_t size); }; - /// @brief Random vector function + /// @brief Fills a vector with uniformly distributed random values. /// @param x Vector to and fill /// @param seed for random number generation template<typename T> void FillRandom(std::vector<T> &x, const unsigned &seed); - /// @brief Initialize random matrix function + /// @brief Fills a matrix with uniformly distributed random values. /// @param A tridiagonal matrix to allocate and fill /// @param seed for random number generation - /// @param make_diagonally_dominant make the tridiagonal matrix diagonally dominant (diagonal value is greater than sum of - /// the corrosponding row) + /// @param make_diagonally_dominant make the tridiagonal matrix diagonally dominant. template<typename T> void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); @@ -45,13 +40,11 @@ namespace tuvx void Print(const std::vector<T> &x); /// @brief displays the data stored inside a tridiagonal matrix. - /// For now, this function simply calls printvec() on the three diagonals. /// @param A tridiagonal matrix to print template<typename T> void Print(const TridiagonalMatrix<T> &A); /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b). - /// store solution in b. /// @param A tridiagonal coeffcient matrix /// @param b right hand side vector of the tridiagonal system. template<typename T> @@ -60,12 +53,10 @@ namespace tuvx /// @brief Specialized dot product function for tridiagonal matrices. /// @param A tridiagonal matrix /// @param x vector to multiply the matrix with - /// @returns dot product between A and x template<typename T> std::vector<T> Dot(const TridiagonalMatrix<T> &A, const std::vector<T> &b); - /// @brief Computes the relative error between two vectors. Used for computing - /// approximation errors. + /// @brief Computes the relative error between two vectors. /// @param x true solution /// @param x_approx approximated solution template<typename T> diff --git a/test/unit/linear_algebra/test_tridiagonal_solver.cpp b/test/unit/linear_algebra/test_tridiagonal_solver.cpp index b9256cdd..70035cb1 100644 --- a/test/unit/linear_algebra/test_tridiagonal_solver.cpp +++ b/test/unit/linear_algebra/test_tridiagonal_solver.cpp @@ -22,8 +22,8 @@ const std::size_t SYSTEM_SIZE = 10; const bool MAKE_DIAGONALLY_DOMINANT = true; const unsigned RANDOM_NUMBER_SEED = 1; -/// @test Tridiagonal Solver Test for single Precision Floats. -/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// @brief Tridiagonal Solver Test for single Precision Floats. +/// Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed /// accurately using L2 norm (single precision). Check for different /// sizes to check consistency @@ -50,8 +50,8 @@ TEST(TridiagSolveTest, SinglePrecision) EXPECT_LE(error, TOL_SP); } -/// @test Tridiagonal Solver Test for Double Precision Floats. /// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// Tridiagonal Solver Test for Double Precision Floats. /// compute $b=A \cdot x$, and check if solution is reconstructed /// accurately using L2 norm (double precision). Check for different /// sizes to check consistency @@ -75,8 +75,8 @@ TEST(TridiagSolveTest, DoublePrecision) EXPECT_LE(error, TOL_DP); } -/// @test LAPACKE Tridiagonal Solver Test for single Precision Floats. -/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// @brief LAPACKE Tridiagonal Solver Test for single Precision Floats. +/// Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed /// accurately using L2 norm (single precision). Check for different /// sizes to check consistency @@ -110,8 +110,8 @@ TEST(LapackeTest, SinglePrecision) EXPECT_LE(error, TOL_SP); } -/// @test LAPACKE Tridiagonal Solver Test for double Precision Floats. -/// @brief Generate random tridiagonal matrix $A$ and vector $x$, +/// @brief LAPACKE Tridiagonal Solver Test for double Precision Floats. +/// Generate random tridiagonal matrix $A$ and vector $x$, /// compute $b=A \cdot x$, and check if solution is reconstructed /// accurately using L2 norm (double precision). Check for different /// sizes to check consistency diff --git a/y b/y new file mode 100644 index 00000000..2c7d7444 --- /dev/null +++ b/y @@ -0,0 +1,8 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACC5jTbOVS2dNQc+V7gcRpvR3dFj/wCSWcresBLWGhNpbQAAAKhL0nbAS9J2 +wAAAAAtzc2gtZWQyNTUxOQAAACC5jTbOVS2dNQc+V7gcRpvR3dFj/wCSWcresBLWGhNpbQ +AAAEDfkTUlKIH/Fp0qgB5qnE5Jllf3NcDAnO5sPX+TXJvD6rmNNs5VLZ01Bz5XuBxGm9Hd +0WP/AJJZyt6wEtYaE2ltAAAAH2RlbmR1a3VyaS5hZGl0eWExMjNAb3V0bG9vay5jb20BAg +MEBQY= +-----END OPENSSH PRIVATE KEY----- diff --git a/y.pub b/y.pub new file mode 100644 index 00000000..c7ca88e8 --- /dev/null +++ b/y.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILmNNs5VLZ01Bz5XuBxGm9Hd0WP/AJJZyt6wEtYaE2lt dendukuri.aditya123@outlook.com From 302fc37174ea6c2eb29c049d5acdaaaf2659bc6f Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Fri, 5 Jul 2024 16:49:18 -0600 Subject: [PATCH 44/51] documentation changes --- include/tuvx/linear_algebra/linear_algebra.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 976e5fae..fc1450ff 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -30,7 +30,8 @@ namespace tuvx /// @brief Fills a matrix with uniformly distributed random values. /// @param A tridiagonal matrix to allocate and fill /// @param seed for random number generation - /// @param make_diagonally_dominant make the tridiagonal matrix diagonally dominant. + /// @param make_diagonally_dominant Flag that is set to true if matrix is diagonally dominant; false otherwise + ; template<typename T> void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); From 73ac682c24b73e706baedcc21433e4122d2e04a5 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho1.hsn.de.hpc.ucar.edu> Date: Mon, 8 Jul 2024 08:55:33 -0600 Subject: [PATCH 45/51] documentation changes --- .../tuvx/linear_algebra/linear_algebra.hpp | 36 ++++++++++++------- y | 8 ----- y.pub | 1 - 3 files changed, 23 insertions(+), 22 deletions(-) delete mode 100644 y delete mode 100644 y.pub diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index fc1450ff..80d5f740 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -17,49 +17,59 @@ namespace tuvx std::vector<T> upper_diagonal_; // upper diagonal std::vector<T> lower_diagonal_; // lower diagonal std::vector<T> main_diagonal_; // main diagonal - /// @brief tridiagonal matrix structure constructor + /// @fn tridiagonal matrix structure constructor + /// @brief initializes the three internal vectors based on + /// size. Main diagonal will be of size $n$, while the upper/lower + /// diagonals will be of size $n-1# TridiagonalMatrix(std::size_t size); }; - /// @brief Fills a vector with uniformly distributed random values. - /// @param x Vector to and fill + /// @brief Fill a std::vector with random values + /// @param x Vector to allocate and fill /// @param seed for random number generation template<typename T> void FillRandom(std::vector<T> &x, const unsigned &seed); /// @brief Fills a matrix with uniformly distributed random values. - /// @param A tridiagonal matrix to allocate and fill - /// @param seed for random number generation - /// @param make_diagonally_dominant Flag that is set to true if matrix is diagonally dominant; false otherwise - ; + /// @param A Tridiagonal matrix to allocate and fill + /// @param seed For random number generation + /// @param make_diagonally_dominant Make the tridiagonal matrix diagonally dominant (diagonal value is greater than sum of + /// the corrosponding row) template<typename T> void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); - /// @brief display contents of std::vector + /// @fn print vector function + /// @brief displays the data stored inside a std::vector /// @param x Vector to print template<typename T> void Print(const std::vector<T> &x); + /// @fn print matrix function /// @brief displays the data stored inside a tridiagonal matrix. + /// For now, this function simply calls printvec() on the three diagonals. /// @param A tridiagonal matrix to print template<typename T> void Print(const TridiagonalMatrix<T> &A); + /// @fn Tridiagonal Linear System Solver /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b). + /// store solution in b. /// @param A tridiagonal coeffcient matrix /// @param b right hand side vector of the tridiagonal system. template<typename T> void Solve(TridiagonalMatrix<T> &A, std::vector<T> &b); /// @brief Specialized dot product function for tridiagonal matrices. - /// @param A tridiagonal matrix - /// @param x vector to multiply the matrix with + /// @param A Tridiagonal matrix + /// @param x Vector to multiply the matrix with + /// @returns Dot product between A and x template<typename T> std::vector<T> Dot(const TridiagonalMatrix<T> &A, const std::vector<T> &b); - /// @brief Computes the relative error between two vectors. - /// @param x true solution - /// @param x_approx approximated solution + /// @brief Computes the LP error norm between two vectors. Used for computing + /// approximation errors. + /// @param x True solution + /// @param x_approx Approximated solution template<typename T> T ComputeError(const std::vector<T> &x, const std::vector<T> &x_approx); diff --git a/y b/y deleted file mode 100644 index 2c7d7444..00000000 --- a/y +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACC5jTbOVS2dNQc+V7gcRpvR3dFj/wCSWcresBLWGhNpbQAAAKhL0nbAS9J2 -wAAAAAtzc2gtZWQyNTUxOQAAACC5jTbOVS2dNQc+V7gcRpvR3dFj/wCSWcresBLWGhNpbQ -AAAEDfkTUlKIH/Fp0qgB5qnE5Jllf3NcDAnO5sPX+TXJvD6rmNNs5VLZ01Bz5XuBxGm9Hd -0WP/AJJZyt6wEtYaE2ltAAAAH2RlbmR1a3VyaS5hZGl0eWExMjNAb3V0bG9vay5jb20BAg -MEBQY= ------END OPENSSH PRIVATE KEY----- diff --git a/y.pub b/y.pub deleted file mode 100644 index c7ca88e8..00000000 --- a/y.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILmNNs5VLZ01Bz5XuBxGm9Hd0WP/AJJZyt6wEtYaE2lt dendukuri.aditya123@outlook.com From 1d165a874a0fb51745337f788d1c48fd69392295 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho1.hsn.de.hpc.ucar.edu> Date: Mon, 8 Jul 2024 09:01:25 -0600 Subject: [PATCH 46/51] switched back to version 0.9.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4194ce81..9fa1ab4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.17) project( tuv-x - VERSION 0.8.0 + VERSION 0.9.0 LANGUAGES Fortran CXX C ) From 23b358edb6587a4058ff0da43ecc8a090a3549a1 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho1.hsn.de.hpc.ucar.edu> Date: Mon, 8 Jul 2024 09:56:08 -0600 Subject: [PATCH 47/51] Documentation Changes --- benchmark/benchmark_tridiagonal_solver.cpp | 6 +++- .../tuvx/linear_algebra/linear_algebra.hpp | 29 +++++++++---------- .../linear_algebra/test_error_function.cpp | 1 + 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/benchmark/benchmark_tridiagonal_solver.cpp b/benchmark/benchmark_tridiagonal_solver.cpp index 49264bb2..c0496262 100644 --- a/benchmark/benchmark_tridiagonal_solver.cpp +++ b/benchmark/benchmark_tridiagonal_solver.cpp @@ -19,6 +19,7 @@ const bool MAKE_DIAGONALLY_DOMINANT = true; const unsigned RANDOM_NUMBER_SEED = 1; /// @brief This function benchmarks the lapacke tridiagonal matrix solver for single precision +/// @param state Benchmarking argument static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) { std::vector<float> x(SYSTEM_SIZE); @@ -46,6 +47,7 @@ static void BM_LAPACKE_SINGLE_PRECISISON(benchmark::State& state) } /// @brief This function benchmarks the lapacke tridiagonal matrix solver for double precision +/// @param state Benchmarking argument static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) { std::vector<double> x(SYSTEM_SIZE); @@ -75,6 +77,7 @@ static void BM_LAPACKE_DOUBLE_PRECISISON(benchmark::State& state) } /// @brief This function benchmarks the tuvx tridiagonal matrix solver for single precision +/// @param state Benchmarking argument static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) { std::vector<double> x(SYSTEM_SIZE); @@ -93,6 +96,7 @@ static void BM_TUVX_DOUBLE_PRECISISON(benchmark::State& state) } /// @brief This function benchmarks the tuvx tridiagonal matrix solver for double precision +/// @param state Benchmarking argument static void BM_TUVX_SINGLE_PRECISISON(benchmark::State& state) { std::vector<float> x(SYSTEM_SIZE); @@ -118,5 +122,5 @@ BENCHMARK(BM_LAPACKE_SINGLE_PRECISISON); BENCHMARK(BM_TUVX_DOUBLE_PRECISISON); BENCHMARK(BM_TUVX_SINGLE_PRECISISON); -/// @brief run all benchmarks +/// @brief Run all benchmarks BENCHMARK_MAIN(); diff --git a/include/tuvx/linear_algebra/linear_algebra.hpp b/include/tuvx/linear_algebra/linear_algebra.hpp index 80d5f740..29c7f5b3 100644 --- a/include/tuvx/linear_algebra/linear_algebra.hpp +++ b/include/tuvx/linear_algebra/linear_algebra.hpp @@ -17,45 +17,42 @@ namespace tuvx std::vector<T> upper_diagonal_; // upper diagonal std::vector<T> lower_diagonal_; // lower diagonal std::vector<T> main_diagonal_; // main diagonal - /// @fn tridiagonal matrix structure constructor - /// @brief initializes the three internal vectors based on + /// @brief Initializes the three internal vectors based on /// size. Main diagonal will be of size $n$, while the upper/lower - /// diagonals will be of size $n-1# + /// diagonals will be of size $n-1$ + /// @param size Size of the matrix to be initialized TridiagonalMatrix(std::size_t size); }; - /// @brief Fill a std::vector with random values + /// @brief Fills a std::vector with random values /// @param x Vector to allocate and fill - /// @param seed for random number generation + /// @param seed Seed for random number generation template<typename T> void FillRandom(std::vector<T> &x, const unsigned &seed); /// @brief Fills a matrix with uniformly distributed random values. /// @param A Tridiagonal matrix to allocate and fill - /// @param seed For random number generation + /// @param seed Seed for random number generation /// @param make_diagonally_dominant Make the tridiagonal matrix diagonally dominant (diagonal value is greater than sum of - /// the corrosponding row) + /// the corrosponding row values) template<typename T> void FillRandom(TridiagonalMatrix<T> &A, const unsigned &seed, const bool &make_diagonally_dominant = false); - /// @fn print vector function - /// @brief displays the data stored inside a std::vector + /// @brief Displays the data stored inside a std::vector /// @param x Vector to print template<typename T> void Print(const std::vector<T> &x); - /// @fn print matrix function - /// @brief displays the data stored inside a tridiagonal matrix. + /// @brief Displays the data stored inside a tridiagonal matrix. /// For now, this function simply calls printvec() on the three diagonals. - /// @param A tridiagonal matrix to print + /// @param A Tridiagonal matrix to print template<typename T> void Print(const TridiagonalMatrix<T> &A); - /// @fn Tridiagonal Linear System Solver /// @brief Thomas' algorithm for solving tridiagonal linear system (A x = b). /// store solution in b. - /// @param A tridiagonal coeffcient matrix - /// @param b right hand side vector of the tridiagonal system. + /// @param A Tridiagonal coeffcient matrix + /// @param b Right hand side vector of the tridiagonal system. template<typename T> void Solve(TridiagonalMatrix<T> &A, std::vector<T> &b); @@ -66,7 +63,7 @@ namespace tuvx template<typename T> std::vector<T> Dot(const TridiagonalMatrix<T> &A, const std::vector<T> &b); - /// @brief Computes the LP error norm between two vectors. Used for computing + /// @brief Computes the relative error between two vectors. Used for computing /// approximation errors. /// @param x True solution /// @param x_approx Approximated solution diff --git a/test/unit/linear_algebra/test_error_function.cpp b/test/unit/linear_algebra/test_error_function.cpp index 800ee846..3c23e66c 100644 --- a/test/unit/linear_algebra/test_error_function.cpp +++ b/test/unit/linear_algebra/test_error_function.cpp @@ -16,6 +16,7 @@ const unsigned RANDOM_NUMBER_SEED = 1; /// @brief Test the correctness of the error function used for /// testing the Linear approximation solvers with double precision data types. +/// @param ErrorFunctionTest Name of the test suite TEST(ErrorFunctionTest, DoublePrecision) { // same vector should return 0 error From a572368c076d892adbdb61898d56e184ae0a9303 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Tue, 9 Jul 2024 09:22:11 -0600 Subject: [PATCH 48/51] Update src/CMakeLists.txt Co-authored-by: Kyle Shores <kyle.shores44@gmail.com> --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7981493b..6283aef7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -# ############################################################################## +################################################################################ # Photo-decomp tool source # object library From 38e9903ed709065db376dd530e046d1acd4cdf2a Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Tue, 9 Jul 2024 09:22:17 -0600 Subject: [PATCH 49/51] Update src/CMakeLists.txt Co-authored-by: Kyle Shores <kyle.shores44@gmail.com> --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6283aef7..250de666 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -108,4 +108,4 @@ add_subdirectory(quantum_yields) add_subdirectory(radiative_transfer) add_subdirectory(spectral_weights) add_subdirectory(util) -# ############################################################################## +################################################################################ From b6a10f8eacd6c4c304e7ce02d9789da2191ba20d Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <adityad@derecho4.hsn.de.hpc.ucar.edu> Date: Tue, 9 Jul 2024 09:36:46 -0600 Subject: [PATCH 50/51] rolled back format changes --- test/unit/linear_algebra/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/linear_algebra/CMakeLists.txt b/test/unit/linear_algebra/CMakeLists.txt index bde82ed8..436ce7a6 100644 --- a/test/unit/linear_algebra/CMakeLists.txt +++ b/test/unit/linear_algebra/CMakeLists.txt @@ -1,13 +1,13 @@ -################################################################################ +# ############################################################################## # Test utilities include(test_util) -################################################################################ +# ############################################################################## # tests create_standard_cxx_test(NAME tridiagonal_solver SOURCES test_tridiagonal_solver.cpp) create_standard_cxx_test(NAME error_function SOURCES test_error_function.cpp) -################################################################################ +# ############################################################################## From 98d29f65eb30a933605bc32db3a7f54fcafadac4 Mon Sep 17 00:00:00 2001 From: Aditya Dendukuri <dendukuri.aditya123@outlook.com> Date: Wed, 10 Jul 2024 08:16:53 -0600 Subject: [PATCH 51/51] Update src/CMakeLists.txt Co-authored-by: mwaxmonsky <137746677+mwaxmonsky@users.noreply.github.com> --- src/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 250de666..6dd3a25b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,7 +19,8 @@ target_include_directories( message(STATUS "blas libraries: ${BLAS_LIBRARIES}") message(STATUS "lapack libraries: ${LAPACK_LIBRARIES}") -target_link_libraries(tuvx_object PRIVATE PkgConfig::netcdff PkgConfig::netcdfc +target_link_libraries(tuvx_object PRIVATE PkgConfig::netcdff + PkgConfig::netcdfc yaml-cpp::yaml-cpp) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "IntelLLVM")