diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a59b14..80ac2e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: if: runner.os == 'Linux' run: | sudo apt-get update - sudo apt-get install -y build-essential ca-certificates wget + sudo apt-get install -y build-essential ca-certificates wget python3 CMAKE_VERSION=4.4.0 echo "Installing CMake ${CMAKE_VERSION}" wget -qO /tmp/cmake.tar.gz "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz" @@ -47,6 +47,21 @@ jobs: Add-Content -Path $env:GITHUB_PATH -Value $cmakeBin & "$cmakeBin\cmake.exe" --version + - name: Download quick_ci matrices (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y python3 + cd clients/matrices + python3 matrix_downloader.py quick_ci + + - name: Download quick_ci matrices (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + Set-Location clients/matrices + python matrix_downloader.py quick_ci + - name: Configure run: | cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} @@ -79,7 +94,7 @@ jobs: set -e if command -v apt-get >/dev/null 2>&1; then apt-get update - DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential ca-certificates git wget + DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential ca-certificates git wget python3 elif command -v yum >/dev/null 2>&1; then yum -y install gcc gcc-c++ make wget git if ! command -v cmake >/dev/null 2>&1; then @@ -100,6 +115,20 @@ jobs: ln -sfn /tmp/cmake-${CMAKE_VERSION}-linux-x86_64/bin/* /usr/local/bin/ || true cmake --version || true + - name: Download quick_ci matrices + run: | + if command -v apt-get >/dev/null 2>&1; then + apt-get update + apt-get install -y python3 + elif command -v yum >/dev/null 2>&1; then + yum -y install python3 + else + echo "Package manager not found for Python installation" >&2 + exit 1 + fi + cd clients/matrices + python3 matrix_downloader.py quick_ci + - name: Configure run: cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} @@ -144,10 +173,23 @@ jobs: - name: Install coverage dependencies run: | sudo apt-get update - sudo apt-get install -y build-essential ca-certificates wget python3-pip + sudo apt-get install -y build-essential ca-certificates wget python3 python3-pip python3 -m pip install --user gcovr echo "${HOME}/.local/bin" >> $GITHUB_PATH + - name: Download quick_ci matrices + run: | + if command -v python3 >/dev/null 2>&1; then + cd clients/matrices + python3 matrix_downloader.py quick_ci + elif command -v python >/dev/null 2>&1; then + cd clients/matrices + python matrix_downloader.py quick_ci + else + echo "Python interpreter not found" >&2 + exit 1 + fi + - name: Configure coverage build run: | cmake -S . -B build-coverage -DENABLE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug diff --git a/clients/matrices/matrix_downloader.py b/clients/matrices/matrix_downloader.py index e88cd23..1777e31 100644 --- a/clients/matrices/matrix_downloader.py +++ b/clients/matrices/matrix_downloader.py @@ -1,161 +1,165 @@ -import urllib.request -import tarfile import os +import tarfile +import urllib.request + def download_tar_file(url, filepath): print("Downloading ", filepath) urllib.request.urlretrieve(url, filepath) print("Downloading ", filepath, " succeeded") + def extract_tar_file(filepath): print("Extracting ", filepath) with tarfile.open(filepath, "r") as tf: tf.extractall(path=os.path.dirname(filepath)) + def download_and_extract_matrix(url, filepath): download_tar_file(url, filepath) extract_tar_file(filepath) -# SPD -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/1138_bus.tar.gz", "SPD/ll38_bus.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstk01.tar.gz", "SPD/bcsstk01.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstm02.tar.gz", "SPD/bcsstm02.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/bodyy4.tar.gz", "SPD/bodyy4.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/bodyy6.tar.gz", "SPD/bodyy6.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Rothberg/cfd2.tar.gz", "SPD/cfd2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/crystm02.tar.gz", "SPD/crystm02.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/FIDAP/ex5.tar.gz", "SPD/ex5.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv1.tar.gz", "SPD/fv1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv2.tar.gz", "SPD/fv2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv3.tar.gz", "SPD/fv3.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh1em6.tar.gz", "SPD/mesh1em6.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh2em5.tar.gz", "SPD/mesh2em5.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh3em5.tar.gz", "SPD/mesh3em5.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos1.tar.gz", "SPD/nos1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos2.tar.gz", "SPD/nos2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos6.tar.gz", "SPD/nos6.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/ACUSIM/Pres_Poisson.tar.gz", "SPD/Pres_Poisson.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/MaxPlanck/shallow_water1.tar.gz", "SPD/shallow_water1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/MaxPlanck/shallow_water2.tar.gz", "SPD/shallow_water2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schmid/thermal1.tar.gz", "SPD/thermal1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_dM.tar.gz", "SPD/thermomech_dM.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_TC.tar.gz", "SPD/thermomech_TC.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_TK.tar.gz", "SPD/thermomech_TK.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Nasa/nasa1824.tar.gz", "SPD/nasa1824.tar.gz") - - -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/MathWorks/Kuu.tar.gz", "SPD/Kuu.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/gyro_m.tar.gz", "SPD/gyro_m.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/cvxbqp1.tar.gz", "SPD/cvxbqp1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/bcsstk38.tar.gz", "SPD/bcsstk38.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstk17.tar.gz", "SPD/bcsstk17.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/wathen100.tar.gz", "SPD/wathen100.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/gridgena.tar.gz", "SPD/gridgena.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/apache1.tar.gz", "SPD/apache1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/wathen120.tar.gz", "SPD/wathen120.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/crystm03.tar.gz", "SPD/crystm03.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Mulvey/finan512.tar.gz", "SPD/finan512.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/TKK/cbuckle.tar.gz", "SPD/cbuckle.tar.gz") - - - - -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Cylshell/s1rmq4m1.tar.gz", "SPD/s1rmq4m1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/AMD/G2_circuit.tar.gz", "SPD/G2_circuit.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Lourakis/bundle1.tar.gz", "SPD/bundle1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Simon/olafu.tar.gz", "SPD/olafu.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/gyro.tar.gz", "SPD/gyro.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/UTEP/Dubcova2.tar.gz", "SPD/Dubcova2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/msc23052.tar.gz", "SPD/msc23052.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/bcsstk36.tar.gz", "SPD/bcsstk36.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Castrillon/denormal.tar.gz", "SPD/denormal.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/msc10848.tar.gz", "SPD/msc10848.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Simon/raefsky4.tar.gz", "SPD/raefsky4.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Um/2cubes_sphere.tar.gz", "SPD/2cubes_sphere.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Cunningham/qa8fm.tar.gz", "SPD/qa8fm.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Rothberg/cfd1.tar.gz", "SPD/cfd1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/oilpan.tar.gz", "SPD/oilpan.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/vanbody.tar.gz", "SPD/vanbody.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/ct20stif.tar.gz", "SPD/ct20stif.tar.gz") - -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec8.tar.gz", "SPD/shipsec8.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec1.tar.gz", "SPD/shipsec1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/UTEP/Dubcova3.tar.gz", "SPD/Dubcova3.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Wissgott/parabolic_fem.tar.gz", "SPD/parabolic_fem.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/s3dkt3m2.tar.gz", "SPD/s3dkt3m2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/TKK/smt.tar.gz", "SPD/smt.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/ship_003.tar.gz", "SPD/ship_003.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/ship_001.tar.gz", "SPD/ship_001.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Williams/cant.tar.gz", "SPD/cant.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Um/offshore.tar.gz", "SPD/offshore.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Williams/pdb1HYS.tar.gz", "SPD/pdb1HYS.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/s3dkq4m2.tar.gz", "SPD/s3dkq4m2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/thread.tar.gz", "SPD/thread.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec5.tar.gz", "SPD/shipsec5.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/apache2.tar.gz", "SPD/apache2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/McRae/ecology2.tar.gz", "SPD/ecology2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/CEMW/tmt_sym.tar.gz", "SPD/tmt_sym.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/boneS01.tar.gz", "SPD/boneS01.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Williams/consph.tar.gz", "SPD/consph.tar.gz") - -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd6k.tar.gz", "SPD/nd6k.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/bmw7st_1.tar.gz", "SPD/bmw7st_1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/AMD/G3_circuit.tar.gz", "SPD/G3_circuit.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schmid/thermal2.tar.gz", "SPD/thermal2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/x104.tar.gz", "SPD/x104.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/m_t1.tar.gz", "SPD/m_t1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/hood.tar.gz", "SPD/hood.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/crankseg_1.tar.gz", "SPD/crankseg_1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/bmwcra_1.tar.gz", "SPD/bmwcra_1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/pwtk.tar.gz", "SPD/pwtk.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/crankseg_2.tar.gz", "SPD/crankseg_2.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd12k.tar.gz", "SPD/nd12k.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_3_k101.tar.gz", "SPD/af_3_k101.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_0_k101.tar.gz", "SPD/af_0_k101.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_1_k101.tar.gz", "SPD/af_1_k101.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_2_k101.tar.gz", "SPD/af_2_k101.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_4_k101.tar.gz", "SPD/af_4_k101.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell4.tar.gz", "SPD/af_shell4.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell3.tar.gz", "SPD/af_shell3.tar.gz") - - -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell7.tar.gz", "SPD/af_shell7.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell8.tar.gz", "SPD/af_shell8.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/INPRO/msdoor.tar.gz", "SPD/msdoor.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Mazaheri/bundle_adj.tar.gz", "SPD/bundle_adj.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Janna/StocF-1465.tar.gz", "SPD/StocF-1465.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Janna/Fault_639.tar.gz", "SPD/Fault_639.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd24k.tar.gz", "SPD/nd24k.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/inline_1.tar.gz", "SPD/inline_1.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Janna/PFlow_742.tar.gz", "SPD/PFlow_742.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Janna/Emilia_923.tar.gz", "SPD/Emilia_923.tar.gz") -download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/ldoor.tar.gz", "SPD/ldoor.tar.gz") - - - - - - - - -# # Symmetric -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/ash85.tar.gz", "Symmetric/ash85.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/can_268.tar.gz", "Symmetric/can_268.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/dwt_1242.tar.gz", "Symmetric/dwt_1242.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Grund/meg4.tar.gz", "Symmetric/meg4.tar.gz") - -# # Unsymmetric -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/pores_1.tar.gz", "Unsymmetric/pores_1.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Bai/ck104.tar.gz", "Unsymmetric/ck104.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/young1c.tar.gz", "Unsymmetric/young1c.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Bai/olm2000.tar.gz", "Unsymmetric/olm2000.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/arc130.tar.gz", "Unsymmetric/arc130.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/fs_680_3.tar.gz", "Unsymmetric/fs_680_3.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/jpwh_991.tar.gz", "Unsymmetric/jpwh_991.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/HB/plskz362.tar.gz", "Unsymmetric/plskz362.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/DRIVCAV/cavity10.tar.gz", "Unsymmetric/cavity10.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/FIDAP/ex35.tar.gz", "Unsymmetric/ex35.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_dK.tar.gz", "Unsymmetric/thermomech_dK.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Hamm/scircuit.tar.gz", "Unsymmetric/scircuit.tar.gz") -# download_and_extract_matrix("https://suitesparse-collection-website.herokuapp.com/MM/Mallya/lhr01.tar.gz", "Unsymmetric/lhr01.tar.gz") \ No newline at end of file +MATRICES_BY_CATEGORY = { + "quick_ci": [ + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos1.tar.gz", "SPD/nos1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos2.tar.gz", "SPD/nos2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos3.tar.gz", "SPD/nos3.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos4.tar.gz", "SPD/nos4.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos5.tar.gz", "SPD/nos5.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos6.tar.gz", "SPD/nos6.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos7.tar.gz", "SPD/nos7.tar.gz"), + ], + "small": [ + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstm02.tar.gz", "SPD/bcsstm02.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos1.tar.gz", "SPD/nos1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos2.tar.gz", "SPD/nos2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/nos6.tar.gz", "SPD/nos6.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstk01.tar.gz", "SPD/bcsstk01.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh1em6.tar.gz", "SPD/mesh1em6.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/1138_bus.tar.gz", "SPD/1138_bus.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv1.tar.gz", "SPD/fv1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv2.tar.gz", "SPD/fv2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Norris/fv3.tar.gz", "SPD/fv3.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh2em5.tar.gz", "SPD/mesh2em5.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/crystm02.tar.gz", "SPD/crystm02.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/mesh3em5.tar.gz", "SPD/mesh3em5.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/FIDAP/ex5.tar.gz", "SPD/ex5.tar.gz"), + ], + "medium": [ + ("https://suitesparse-collection-website.herokuapp.com/MM/Nasa/nasa1824.tar.gz", "SPD/nasa1824.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/bodyy4.tar.gz", "SPD/bodyy4.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Pothen/bodyy6.tar.gz", "SPD/bodyy6.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/MaxPlanck/shallow_water1.tar.gz", "SPD/shallow_water1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/MaxPlanck/shallow_water2.tar.gz", "SPD/shallow_water2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/ACUSIM/Pres_Poisson.tar.gz", "SPD/Pres_Poisson.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Rothberg/cfd2.tar.gz", "SPD/cfd2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schmid/thermal1.tar.gz", "SPD/thermal1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_dM.tar.gz", "SPD/thermomech_dM.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_TC.tar.gz", "SPD/thermomech_TC.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Botonakis/thermomech_TK.tar.gz", "SPD/thermomech_TK.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/gridgena.tar.gz", "SPD/gridgena.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/cvxbqp1.tar.gz", "SPD/cvxbqp1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/MathWorks/Kuu.tar.gz", "SPD/Kuu.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/gyro_m.tar.gz", "SPD/gyro_m.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/HB/bcsstk17.tar.gz", "SPD/bcsstk17.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/wathen100.tar.gz", "SPD/wathen100.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/crystm03.tar.gz", "SPD/crystm03.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Mulvey/finan512.tar.gz", "SPD/finan512.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/TKK/cbuckle.tar.gz", "SPD/cbuckle.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/wathen120.tar.gz", "SPD/wathen120.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/AMD/G2_circuit.tar.gz", "SPD/G2_circuit.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Cunningham/qa8fm.tar.gz", "SPD/qa8fm.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/gyro.tar.gz", "SPD/gyro.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Castrillon/denormal.tar.gz", "SPD/denormal.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Cylshell/s1rmq4m1.tar.gz", "SPD/s1rmq4m1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/msc23052.tar.gz", "SPD/msc23052.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/bcsstk36.tar.gz", "SPD/bcsstk36.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/msc10848.tar.gz", "SPD/msc10848.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Simon/raefsky4.tar.gz", "SPD/raefsky4.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Lourakis/bundle1.tar.gz", "SPD/bundle1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Um/2cubes_sphere.tar.gz", "SPD/2cubes_sphere.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/UTEP/Dubcova2.tar.gz", "SPD/Dubcova2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Rothberg/cfd1.tar.gz", "SPD/cfd1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/apache1.tar.gz", "SPD/apache1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Simon/olafu.tar.gz", "SPD/olafu.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/bcsstk38.tar.gz", "SPD/bcsstk38.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/vanbody.tar.gz", "SPD/vanbody.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/ct20stif.tar.gz", "SPD/ct20stif.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/oilpan.tar.gz", "SPD/oilpan.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/TKK/smt.tar.gz", "SPD/smt.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec8.tar.gz", "SPD/shipsec8.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/UTEP/Dubcova3.tar.gz", "SPD/Dubcova3.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Wissgott/parabolic_fem.tar.gz", "SPD/parabolic_fem.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/s3dkt3m2.tar.gz", "SPD/s3dkt3m2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/ship_001.tar.gz", "SPD/ship_001.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec1.tar.gz", "SPD/shipsec1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Williams/cant.tar.gz", "SPD/cant.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/ship_003.tar.gz", "SPD/ship_003.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Um/offshore.tar.gz", "SPD/offshore.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Williams/pdb1HYS.tar.gz", "SPD/pdb1HYS.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/s3dkq4m2.tar.gz", "SPD/s3dkq4m2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/thread.tar.gz", "SPD/thread.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/shipsec5.tar.gz", "SPD/shipsec5.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/apache2.tar.gz", "SPD/apache2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/McRae/ecology2.tar.gz", "SPD/ecology2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/CEMW/tmt_sym.tar.gz", "SPD/tmt_sym.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Oberwolfach/boneS01.tar.gz", "SPD/boneS01.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Williams/consph.tar.gz", "SPD/consph.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd6k.tar.gz", "SPD/nd6k.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/bmw7st_1.tar.gz", "SPD/bmw7st_1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/AMD/G3_circuit.tar.gz", "SPD/G3_circuit.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schmid/thermal2.tar.gz", "SPD/thermal2.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/x104.tar.gz", "SPD/x104.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/DNVS/m_t1.tar.gz", "SPD/m_t1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/crankseg_1.tar.gz", "SPD/crankseg_1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/bmwcra_1.tar.gz", "SPD/bmwcra_1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/hood.tar.gz", "SPD/hood.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/crankseg_2.tar.gz", "SPD/crankseg_2.tar.gz"), + ], + "large": [ + ("https://suitesparse-collection-website.herokuapp.com/MM/Boeing/pwtk.tar.gz", "SPD/pwtk.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd12k.tar.gz", "SPD/nd12k.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_0_k101.tar.gz", "SPD/af_0_k101.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_1_k101.tar.gz", "SPD/af_1_k101.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_2_k101.tar.gz", "SPD/af_2_k101.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_3_k101.tar.gz", "SPD/af_3_k101.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_4_k101.tar.gz", "SPD/af_4_k101.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell3.tar.gz", "SPD/af_shell3.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell4.tar.gz", "SPD/af_shell4.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell7.tar.gz", "SPD/af_shell7.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Schenk_AFE/af_shell8.tar.gz", "SPD/af_shell8.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/INPRO/msdoor.tar.gz", "SPD/msdoor.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Mazaheri/bundle_adj.tar.gz", "SPD/bundle_adj.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Janna/StocF-1465.tar.gz", "SPD/StocF-1465.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Janna/Fault_639.tar.gz", "SPD/Fault_639.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/ND/nd24k.tar.gz", "SPD/nd24k.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/inline_1.tar.gz", "SPD/inline_1.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Janna/PFlow_742.tar.gz", "SPD/PFlow_742.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/Janna/Emilia_923.tar.gz", "SPD/Emilia_923.tar.gz"), + ("https://suitesparse-collection-website.herokuapp.com/MM/GHS_psdef/ldoor.tar.gz", "SPD/ldoor.tar.gz"), + ], +} + + +def download_matrices_for_category(category): + normalized_category = category.lower().replace("-", "_") + if normalized_category not in MATRICES_BY_CATEGORY: + raise ValueError( + "Unknown category '{}'. Expected one of: {}".format( + category, ", ".join(MATRICES_BY_CATEGORY.keys()) + ) + ) + + for url, filepath in MATRICES_BY_CATEGORY[normalized_category]: + download_and_extract_matrix(url, filepath) + + +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + download_matrices_for_category(sys.argv[1]) + else: + for category in ("quick_ci", "small", "medium", "large"): + download_matrices_for_category(category) diff --git a/clients/testing/test_functions_krylov.cpp b/clients/testing/test_functions_krylov.cpp index 27c625c..8f5702d 100644 --- a/clients/testing/test_functions_krylov.cpp +++ b/clients/testing/test_functions_krylov.cpp @@ -38,6 +38,10 @@ bool testing::test_krylov(krylov_solver solver_type, Arguments arg) linalg::csr_matrix mat_A; mat_A.read_mtx(arg.filename); + linalg::vector D1(mat_A.get_m()); + linalg::vector D2(mat_A.get_m()); + mat_A.apply_ruiz_scaling(D1, D2, 30, 1e-03); + // Solution vector linalg::vector vec_x(mat_A.get_m()); vec_x.zeros(); diff --git a/clients/testing/test_functions_multiply_by_vector.cpp b/clients/testing/test_functions_multiply_by_vector.cpp index 206b7b9..404f1e0 100644 --- a/clients/testing/test_functions_multiply_by_vector.cpp +++ b/clients/testing/test_functions_multiply_by_vector.cpp @@ -89,14 +89,28 @@ bool testing::test_multiply_by_vector(Arguments arg) // Inline host solution linalg::vector host_y(mat_A.get_m()); host_y.zeros(); + + int max_nnz_per_row = 0; for(int i = 0; i < mat_A.get_m(); ++i) { - for(int j = mat_A.get_row_ptr()[i]; j < mat_A.get_row_ptr()[i + 1]; ++j) + const int start = mat_A.get_row_ptr()[i]; + const int end = mat_A.get_row_ptr()[i + 1]; + + max_nnz_per_row = std::max(max_nnz_per_row, end - start); + + for(int j = start; j < end; ++j) { host_y[i] += mat_A.get_val()[j] * vec_x.get_vec()[mat_A.get_col_ind()[j]]; } } + std::cout << "max_nnz_per_row: " << max_nnz_per_row << std::endl; + + // mat_A.print_matrix("A"); + + // vec_y.print_vector("Computed solution"); + // host_y.print_vector("Reference solution"); + // Compare solutions bool success = check_vector_equality(vec_y, host_y); diff --git a/clients/testing/tests/test_BICGSTAB.yaml b/clients/testing/tests/test_BICGSTAB.yaml index fa0ddcd..5b005bf 100644 --- a/clients/testing/tests/test_BICGSTAB.yaml +++ b/clients/testing/tests/test_BICGSTAB.yaml @@ -1,4 +1,21 @@ Tests: + quick_ci: + precond: [none, jacobi, SOR] + matrix_file: ["matrices/SPD/nos7/nos7.mtx"] + max_iters: [400] + backend: [CPU] + + quick_ci_2: + precond: [jacobi] + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx"] + max_iters: [1500] + backend: [CPU] + small: precond: [none, jacobi] matrix_file: ["matrices/SPD/mesh1em6/mesh1em6.mtx", diff --git a/clients/testing/tests/test_CG.yaml b/clients/testing/tests/test_CG.yaml index 4ca0e40..c436a79 100644 --- a/clients/testing/tests/test_CG.yaml +++ b/clients/testing/tests/test_CG.yaml @@ -1,4 +1,21 @@ Tests: + quick_ci: + precond: [none, jacobi, SOR] + matrix_file: ["matrices/SPD/nos7/nos7.mtx"] + max_iters: [400] + backend: [CPU] + + quick_ci_2: + precond: [jacobi] + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx"] + max_iters: [1500] + backend: [CPU] + small1: precond: [none, jacobi, SOR] matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", diff --git a/clients/testing/tests/test_SOR.yaml b/clients/testing/tests/test_SOR.yaml index b189c14..2caedfe 100644 --- a/clients/testing/tests/test_SOR.yaml +++ b/clients/testing/tests/test_SOR.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [200] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_SSOR.yaml b/clients/testing/tests/test_SSOR.yaml index b189c14..2caedfe 100644 --- a/clients/testing/tests/test_SSOR.yaml +++ b/clients/testing/tests/test_SSOR.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [200] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_gauss_seidel.yaml b/clients/testing/tests/test_gauss_seidel.yaml index b189c14..2caedfe 100644 --- a/clients/testing/tests/test_gauss_seidel.yaml +++ b/clients/testing/tests/test_gauss_seidel.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [200] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_incomplete_LU_factorization_dense.yaml b/clients/testing/tests/test_incomplete_LU_factorization_dense.yaml index 6738acd..2fbe9ca 100644 --- a/clients/testing/tests/test_incomplete_LU_factorization_dense.yaml +++ b/clients/testing/tests/test_incomplete_LU_factorization_dense.yaml @@ -1,8 +1,8 @@ Tests: small: - m: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] + m: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] backend: [CPU, GPU] medium: - m: [200,300,400] + m: [200, 300, 400] backend: [CPU, GPU] diff --git a/clients/testing/tests/test_incomplete_cholesky_factorization_dense.yaml b/clients/testing/tests/test_incomplete_cholesky_factorization_dense.yaml index f35c7a5..92166f0 100644 --- a/clients/testing/tests/test_incomplete_cholesky_factorization_dense.yaml +++ b/clients/testing/tests/test_incomplete_cholesky_factorization_dense.yaml @@ -1,4 +1,9 @@ Tests: + quick_ci: + m: [23, 77, 99, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, + 157, 163, 167, 173, 179, 181, 191, 193, 197, 199] + backend: [CPU] + small: m: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, diff --git a/clients/testing/tests/test_jacobi.yaml b/clients/testing/tests/test_jacobi.yaml index b189c14..2caedfe 100644 --- a/clients/testing/tests/test_jacobi.yaml +++ b/clients/testing/tests/test_jacobi.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [200] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_multiply_by_matrix.yaml b/clients/testing/tests/test_multiply_by_matrix.yaml index 8931bcd..3cb75cd 100644 --- a/clients/testing/tests/test_multiply_by_matrix.yaml +++ b/clients/testing/tests/test_multiply_by_matrix.yaml @@ -1,4 +1,14 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + backend: [CPU] + small: matrix_file: ["matrices/SPD/ex5/ex5.mtx"] backend: [CPU, GPU] diff --git a/clients/testing/tests/test_multiply_by_vector.yaml b/clients/testing/tests/test_multiply_by_vector.yaml index c7555e0..7ba9424 100644 --- a/clients/testing/tests/test_multiply_by_vector.yaml +++ b/clients/testing/tests/test_multiply_by_vector.yaml @@ -1,4 +1,14 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_ruiz_scaling.yaml b/clients/testing/tests/test_ruiz_scaling.yaml index 28461f9..33b3042 100644 --- a/clients/testing/tests/test_ruiz_scaling.yaml +++ b/clients/testing/tests/test_ruiz_scaling.yaml @@ -1,4 +1,16 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [30] + tol: [1e-6] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_symmetric_gauss_seidel.yaml b/clients/testing/tests/test_symmetric_gauss_seidel.yaml index b189c14..2caedfe 100644 --- a/clients/testing/tests/test_symmetric_gauss_seidel.yaml +++ b/clients/testing/tests/test_symmetric_gauss_seidel.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [200] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_symmetric_ruiz_scaling.yaml b/clients/testing/tests/test_symmetric_ruiz_scaling.yaml index 216c43b..877723a 100644 --- a/clients/testing/tests/test_symmetric_ruiz_scaling.yaml +++ b/clients/testing/tests/test_symmetric_ruiz_scaling.yaml @@ -1,4 +1,16 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + max_iters: [30] + tol: [1e-6] + backend: [GPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_transpose_dense.yaml b/clients/testing/tests/test_transpose_dense.yaml index d553248..5d830b2 100644 --- a/clients/testing/tests/test_transpose_dense.yaml +++ b/clients/testing/tests/test_transpose_dense.yaml @@ -1,4 +1,8 @@ Tests: + quick_ci: + m: [35, 56, 78, 90, 100, 120, 150, 200] + backend: [CPU] + small: m: [10, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, diff --git a/clients/testing/tests/test_triangular_solve.yaml b/clients/testing/tests/test_triangular_solve.yaml index 615964b..f0f68f5 100644 --- a/clients/testing/tests/test_triangular_solve.yaml +++ b/clients/testing/tests/test_triangular_solve.yaml @@ -1,4 +1,15 @@ Tests: + quick_ci: + matrix_file: ["matrices/SPD/nos1/nos1.mtx", + "matrices/SPD/nos2/nos2.mtx", + "matrices/SPD/nos3/nos3.mtx", + "matrices/SPD/nos4/nos4.mtx", + "matrices/SPD/nos5/nos5.mtx", + "matrices/SPD/nos6/nos6.mtx", + "matrices/SPD/nos7/nos7.mtx"] + uplo: [lower, upper] + backend: [CPU] + small: matrix_file: ["matrices/SPD/bcsstm02/bcsstm02.mtx", "matrices/SPD/ex5/ex5.mtx", diff --git a/clients/testing/tests/test_tridiagonal_solver.yaml b/clients/testing/tests/test_tridiagonal_solver.yaml index f178392..c6dd338 100644 --- a/clients/testing/tests/test_tridiagonal_solver.yaml +++ b/clients/testing/tests/test_tridiagonal_solver.yaml @@ -1,9 +1,9 @@ Tests: - small: + quick_ci: m: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] n: [2, 3, 4, 5, 6, 7, 8, 9, 10] pivoting_strategy: [none, partial] - backend: [CPU, GPU] + backend: [CPU] small1: m: [20, 40, 75, 110, 150, 312, 625, 1000] diff --git a/library/src/backend/device/cuda/common.cuh b/library/src/backend/device/cuda/common.cuh index c3276f7..b98e16d 100644 --- a/library/src/backend/device/cuda/common.cuh +++ b/library/src/backend/device/cuda/common.cuh @@ -126,16 +126,12 @@ __device__ __forceinline__ void warp_reduction_sum(T* __restrict__ data) } } - - - - - template __device__ __forceinline__ T warp_segmented_reduction_sum(int row, T val) { const int lid = threadIdx.x & (WARPSIZE - 1); +#pragma unroll for(int j = 1; j < WARPSIZE; j <<= 1) { const int left_row = __shfl_up_sync(FULL_MASK, row, j); @@ -153,15 +149,6 @@ __device__ __forceinline__ T warp_segmented_reduction_sum(int row, T val) return val; } - - - - - - - - - template __device__ __forceinline__ void warp_reduction_max(T* __restrict__ data) { diff --git a/library/src/backend/device/cuda/csrmv_kernels.cuh b/library/src/backend/device/cuda/csrmv_kernels.cuh index 6b2ab94..1d86a75 100644 --- a/library/src/backend/device/cuda/csrmv_kernels.cuh +++ b/library/src/backend/device/cuda/csrmv_kernels.cuh @@ -41,23 +41,23 @@ __global__ void csrmv_vector_kernel(int m, const T beta, T* __restrict__ y) { - int tid = threadIdx.x; - int bid = blockIdx.x; - int gid = tid + BLOCKSIZE * bid; + const int tid = threadIdx.x; + const int bid = blockIdx.x; + const int gid = tid + BLOCKSIZE * bid; - int lid = tid & WARPSIZE - 1; - //int wid = tid / WARPSIZE; + const int lid = tid & WARPSIZE - 1; + //const int wid = tid / WARPSIZE; for(int row = gid / WARPSIZE; row < m; row += (BLOCKSIZE / WARPSIZE) * gridDim.x) { - int row_start = csr_row_ptr[row]; - int row_end = csr_row_ptr[row + 1]; + const int row_start = csr_row_ptr[row]; + const int row_end = csr_row_ptr[row + 1]; T sum = static_cast(0); for(int j = row_start + lid; j < row_end; j += WARPSIZE) { - int col = csr_col_ind[j]; - T val = csr_val[j]; + const int col = csr_col_ind[j]; + const T val = csr_val[j]; sum = std::fma(x[col], val, sum); } @@ -78,17 +78,8 @@ __global__ void csrmv_vector_kernel(int m, } } - - - - - - - - -__device__ inline int csr_row_from_index(const int* __restrict__ row_ptr, - int row_ptr_size, - int nnz_index) +__device__ inline int + csr_row_from_index(const int* __restrict__ row_ptr, int row_ptr_size, int nnz_index) { // row_ptr has size m+1 and is non-decreasing // find r such that row_ptr[r] <= nnz_index < row_ptr[r + 1] @@ -111,7 +102,7 @@ __device__ inline int csr_row_from_index(const int* __restrict__ row_ptr, return lo - 1; } -template +template __global__ void csrmv_stream_kernel(int m, int n, int nnz, @@ -129,6 +120,42 @@ __global__ void csrmv_stream_kernel(int m, const int lid = tid & WARPSIZE - 1; const int wid = tid / WARPSIZE; + const int start_row + = (NNZ_PER_THREAD * BLOCKSIZE * bid < nnz) + ? csr_row_from_index(csr_row_ptr, m + 1, NNZ_PER_THREAD * BLOCKSIZE * bid) + : -1; + const int end_row + = (NNZ_PER_THREAD * BLOCKSIZE * (bid + 1) - 1 < nnz) + ? csr_row_from_index(csr_row_ptr, m + 1, NNZ_PER_THREAD * BLOCKSIZE * (bid + 1) - 1) + : -1; + + if(start_row == end_row && end_row != -1) + { + __shared__ T shared[BLOCKSIZE]; + + T sum = static_cast(0); + for(int i = 0; i < NNZ_PER_THREAD; ++i) + { + const int index = NNZ_PER_THREAD * BLOCKSIZE * bid + BLOCKSIZE * i + tid; + + const int col = csr_col_ind[index]; + const T val = csr_val[index]; + + sum = std::fma(x[col], val, sum); + } + + shared[tid] = sum; + __syncthreads(); + + block_reduction_sum(shared, tid); + + if(tid == 0) + { + atomicAdd(&y[start_row], alpha * shared[0]); + } + return; + } + const int start = NNZ_PER_THREAD * (BLOCKSIZE * bid + WARPSIZE * wid); int prev_row = -1; @@ -140,15 +167,16 @@ __global__ void csrmv_stream_kernel(int m, const int index = start + i * WARPSIZE + lid; const int row = (index < nnz) ? csr_row_from_index(csr_row_ptr, m + 1, index) : -1; - const int col = csr_col_ind[index]; - const T val = csr_val[index]; + const int col = (index < nnz) ? csr_col_ind[index] : 0; //nnz - 1; + const T val = (index < nnz) ? csr_val[index] : static_cast(0); - const int left_row = __shfl_sync(0xffffffff, row, lid - 1); - const int right_row = __shfl_sync(0xffffffff, row, lid + 1); + const int left_row = __shfl_sync(FULL_MASK, row, lid - 1); + const int right_row = __shfl_sync(FULL_MASK, row, lid + 1); - const bool predicate = (row != -1 && row == left_row) || (row != -1 && row == right_row); + const bool predicate = (row == -1) || (row != left_row) || (row != right_row) + || (prev_row >= 0 && prev_row != row); - if(__any_sync(0xffffffff, predicate)) + if(__any_sync(FULL_MASK, predicate)) { // write out old values warp_reduction_sum(&sum); @@ -164,7 +192,7 @@ __global__ void csrmv_stream_kernel(int m, sum = x[col] * val; // segmented reduction for current values - sum = warp_segmented_reduction_sum(row, sum); + sum = warp_segmented_reduction_sum(row, sum); if(lid < WARPSIZE - 1) { @@ -180,6 +208,9 @@ __global__ void csrmv_stream_kernel(int m, atomicAdd(&y[row], alpha * sum); } } + + prev_row = -1; + sum = static_cast(0); } else { @@ -188,10 +219,17 @@ __global__ void csrmv_stream_kernel(int m, prev_row = row; } -} - - + // write out final values + warp_reduction_sum(&sum); + if(lid == 0) + { + if(prev_row >= 0) + { + atomicAdd(&y[prev_row], alpha * sum); + } + } +} #endif diff --git a/library/src/backend/device/cuda/cuda_matrix_vector.cu b/library/src/backend/device/cuda/cuda_matrix_vector.cu index 091bf9e..bfa1ceb 100644 --- a/library/src/backend/device/cuda/cuda_matrix_vector.cu +++ b/library/src/backend/device/cuda/cuda_matrix_vector.cu @@ -24,6 +24,8 @@ // //******************************************************************************** +#include + #include "cuda_matrix_vector.h" #include "../../../descriptors/csrmv_descr_internal.h" @@ -128,28 +130,41 @@ void linalg::cuda_csrmv_solve(int m, { ROUTINE_TRACE("linalg::cuda_csrmv_solve"); - int avg_nnz_per_row = nnz / m; + // const int avg_nnz_per_row = nnz / m; - if(avg_nnz_per_row <= 8) - { - csrmv_vector_kernel<256, 4><<<((m - 1) / (256 / 4) + 1), 256>>>( - m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); - } - else if(avg_nnz_per_row <= 16) - { - csrmv_vector_kernel<256, 8><<<((m - 1) / (256 / 8) + 1), 256>>>( - m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); - } - else if(avg_nnz_per_row <= 32) - { - csrmv_vector_kernel<256, 16><<<((m - 1) / (256 / 16) + 1), 256>>>( - m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); - } - else - { - csrmv_vector_kernel<256, 32><<<((m - 1) / (256 / 32) + 1), 256>>>( + // if(avg_nnz_per_row <= 8) + // { + // csrmv_vector_kernel<256, 4><<<((m - 1) / (256 / 4) + 1), 256>>>( + // m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); + // } + // else if(avg_nnz_per_row <= 16) + // { + // csrmv_vector_kernel<256, 8><<<((m - 1) / (256 / 8) + 1), 256>>>( + // m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); + // } + // else if(avg_nnz_per_row <= 32) + // { + // csrmv_vector_kernel<256, 16><<<((m - 1) / (256 / 16) + 1), 256>>>( + // m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); + // } + // else + // { + // csrmv_vector_kernel<256, 32><<<((m - 1) / (256 / 32) + 1), 256>>>( + // m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); + // } + + //int grid_size = ((nnz - 1) / (8 * 256) + 1); + //std::cout << "AAAAAA nnz: " << nnz << " grid_size: " << grid_size << std::endl; + + + + + + CHECK_CUDA(cudaMemset(y, 0, sizeof(T) * m)); // need to call kernel to handle beta + + csrmv_stream_kernel<256, 32, 8><<<((nnz - 1) / (8 * 256) + 1), 256>>>( m, n, nnz, alpha, csr_row_ptr, csr_col_ind, csr_val, x, beta, y); - } + } template void linalg::cuda_matrix_vector_product( diff --git a/library/src/csr_matrix.cpp b/library/src/csr_matrix.cpp index 7f73225..01ab192 100644 --- a/library/src/csr_matrix.cpp +++ b/library/src/csr_matrix.cpp @@ -317,14 +317,10 @@ void csr_matrix::multiply_by_matrix(csr_matrix& C, const csr_matrix& B) const csrgemm_descr* descr = nullptr; create_csrgemm_descr(&descr); - std::cout << "Computing C = A * B using sparse matrix-matrix multiplication..." << std::endl; csrgemm_nnz(*this, B, D, C, csrgemm_algorithm::default_algorithm, descr); - std::cout << "Computing C = A * B using sparse matrix-matrix multiplication..." << std::endl; csrgemm_solve(1.0, *this, B, 0.0, D, C, csrgemm_algorithm::default_algorithm, descr); - std::cout << "Done." << std::endl; - destroy_csrgemm_descr(descr); }