From db14b9a814c1d4ba4a10b09140ad41c1cbb9620d Mon Sep 17 00:00:00 2001 From: Shaoyuteng Date: Wed, 22 Mar 2023 16:28:35 +0800 Subject: [PATCH 1/4] opencoarrays --- package/opencoarrays/2.10.1/install.sh | 11 +++++ .../2.10.1/data.opencoarrays.amd.cpu.config | 46 +++++++++++++++++++ .../2.10.1/data.opencoarrays.arm.cpu.config | 42 +++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100755 package/opencoarrays/2.10.1/install.sh create mode 100644 templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config create mode 100644 templates/OpenCoarrays/2.10.1/data.opencoarrays.arm.cpu.config diff --git a/package/opencoarrays/2.10.1/install.sh b/package/opencoarrays/2.10.1/install.sh new file mode 100755 index 0000000..fe08303 --- /dev/null +++ b/package/opencoarrays/2.10.1/install.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -x +set -e +. ${DOWNLOAD_TOOL} -u https://github.com/sourceryinstitute/OpenCoarrays/releases/download/2.10.1/OpenCoarrays-2.10.1.tar.gz +cd ${JARVIS_TMP} +rm -rf OpenCoarrays-2.10.1 +tar -xvf ${JARVIS_DOWNLOAD}/OpenCoarrays-2.10.1.tar.gz +cd OpenCoarrays-2.10.1 +mkdir -p opencoarrays-build && cd opencoarrays-build +cmake ${JARVIS_TMP}/OpenCoarrays-2.10.1/ -DCMAKE_INSTALL_PREFIX=$1 +make -j7 && make install \ No newline at end of file diff --git a/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config b/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config new file mode 100644 index 0000000..4637fc6 --- /dev/null +++ b/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config @@ -0,0 +1,46 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +./jarvis -install gcc/9.3.0 com +module use ./software/modulefiles +module load gcc/9.3.0 +export CC=`which gcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install openmpi/4.1.2 gcc +module load openmpi/4.1.2 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 + +[ENV] +module purge +module use ./software/modulefiles +module load gcc/9.3.0 +module load openmpi/4.1.2 +# module load hmpi/1.1.1 +module load cmake/3.23.1 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = opencoarrays +build_dir = ${JARVIS_TMP}/OpenCoarrays-2.10.1 +binary_dir = ${JARVIS_LIBS}/gcc9.3.0/hmpi1.1.1/OpenCoarrays/bin +case_dir = ${JARVIS_TMP}/OpenCoarrays-2.10.1/opencoarrays-build + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install opencoarrays/2.10.1 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && ctest --output-on-failure --repeat-until-fail 1 --timeout 200 +# mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums +# /root/hpcrunner/software/mpi/openmpi4-gcc9/4.1.2/bin/mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root xterm -e gdb /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums +#ctest --output-on-failure --repeat-until-fail 1 --timeout 200 || /root/hpcrunner/software/mpi/openmpi4-gcc9/4.1.2/bin/mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums +# ctest --output-on-failure --repeat-until-fail 1 --timeout 200 +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/OpenCoarrays/2.10.1/data.opencoarrays.arm.cpu.config b/templates/OpenCoarrays/2.10.1/data.opencoarrays.arm.cpu.config new file mode 100644 index 0000000..ed91564 --- /dev/null +++ b/templates/OpenCoarrays/2.10.1/data.opencoarrays.arm.cpu.config @@ -0,0 +1,42 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +module use ./software/modulefiles +./jarvis -install kgcc/9.3.1 com +module load kgcc/9.3.1 +export CC=`which kgcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install openmpi/4.1.2 gcc +module load openmpi/4.1.2 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 + +[ENV] +module purge +module use ./software/modulefiles +module load kgcc/9.3.1 +module load openmpi/4.1.2 +module load cmake/3.23.1 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = opencoarrays +build_dir = ${JARVIS_TMP}/OpenCoarrays-2.10.1 +binary_dir = ${JARVIS_LIBS}/kgcc9.3.0/hmpi1.1.1/OpenCoarrays/bin +case_dir = ${JARVIS_TMP}/OpenCoarrays-2.10.1/opencoarrays-build + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install opencoarrays/2.10.1 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && ctest --output-on-failure --repeat-until-fail 1 --timeout 200 + +binary = +nodes = 1 \ No newline at end of file -- Gitee From 1b9c1fb25e264c09c140e423baea78df803b33f7 Mon Sep 17 00:00:00 2001 From: Shaoyuteng Date: Wed, 22 Mar 2023 17:11:58 +0800 Subject: [PATCH 2/4] gcc --- package/gcc/9.3.0/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 package/gcc/9.3.0/install.sh diff --git a/package/gcc/9.3.0/install.sh b/package/gcc/9.3.0/install.sh old mode 100644 new mode 100755 index ce1e008..a6395af --- a/package/gcc/9.3.0/install.sh +++ b/package/gcc/9.3.0/install.sh @@ -9,4 +9,4 @@ cd gcc-9.3.0 sed -i "35s/ftp/http/g" ./contrib/download_prerequisites ./contrib/download_prerequisites ./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared -make -j && make install +make -j6 && make install -- Gitee From 6cc487da0388a72bd4d8e204a0815b27755b5909 Mon Sep 17 00:00:00 2001 From: Shaoyuteng Date: Thu, 23 Mar 2023 23:38:54 +0800 Subject: [PATCH 3/4] final --- ... openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def | 35 + .../openeuler-bisheng2-hmpi1-mumps-5.1.2.def | 35 + ...er-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def | 33 + ...gcc-9.3.1-openmpi4-opencoarrays-2.10.1.def | 34 + .../openeuler-bisheng2-hmpi1-petsc-3.18.1.def | 33 + .../openeuler-gcc9-hmpi1-petsc-3.18.1.def | 33 + .../openeuler-bisheng2-hmpi1-scotch-7.0.1.def | 35 + ...openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def | 35 + .../openeuler-bisheng2-hmpi1-slepc-3.18.1.def | 35 + ...openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def | 35 + ...25\346\212\245\345\221\212\343\200\213.md" | 845 +++++ ...15\346\214\207\345\215\227\343\200\213.md" | 375 +++ ...25\346\212\245\345\221\212\343\200\213.md" | 1290 +++++++ ...15\346\214\207\345\215\227\343\200\213.md" | 369 ++ ...25\346\212\245\345\221\212\343\200\213.md" | 1377 ++++++++ ...15\346\214\207\345\215\227\343\200\213.md" | 362 ++ ...25\346\212\245\345\221\212\343\200\213.md" | 2963 +++++++++++++++++ ...15\346\214\207\345\215\227\343\200\213.md" | 325 ++ ...25\346\212\245\345\221\212\343\200\213.md" | 1876 +++++++++++ ...15\346\214\207\345\215\227\343\200\213.md" | 370 ++ package/mumps/5.1.2/install.sh | 34 + package/petsc/3.18.1/install.sh | 12 + package/slepc/3.18.1/install.sh | 12 + .../2.10.1/data.opencoarrays.amd.cpu.config | 4 - .../mumps/5.1.2/data.mumps.amd.cpu.config | 56 + .../mumps/5.1.2/data.mumps.arm.cpu.config | 55 + .../petsc/3.18.1/data.petsc.amd.cpu.config | 46 + .../petsc/3.18.1/data.petsc.arm.cpu.config | 44 + .../scotch/7.0.1/data.scotch.amd.cpu.config | 46 + .../scotch/7.0.1/data.scotch.arm.cpu.config | 47 + .../slepc/3.18.1/data.slepc.amd.cpu.config | 57 + .../slepc/3.18.1/data.slepc.arm.cpu.config | 56 + test/test-mumps.sh | 16 + test/test-opencoarrays.sh | 16 + test/test-petsc.sh | 14 + test/test-scotch.sh | 16 + test/test-slepc.sh | 16 + 37 files changed, 11038 insertions(+), 4 deletions(-) create mode 100644 container/mumps/ openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def create mode 100644 container/mumps/openeuler-bisheng2-hmpi1-mumps-5.1.2.def create mode 100644 container/opencoarrays/openeuler-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def create mode 100644 container/opencoarrays/openeuler-kgcc-9.3.1-openmpi4-opencoarrays-2.10.1.def create mode 100644 container/petsc/openeuler-bisheng2-hmpi1-petsc-3.18.1.def create mode 100644 container/petsc/openeuler-gcc9-hmpi1-petsc-3.18.1.def create mode 100644 container/scotch/openeuler-bisheng2-hmpi1-scotch-7.0.1.def create mode 100644 container/scotch/openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def create mode 100644 container/slepc/openeuler-bisheng2-hmpi1-slepc-3.18.1.def create mode 100644 container/slepc/openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def create mode 100644 "doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" create mode 100644 "doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" create mode 100644 "doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" create mode 100644 "doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" create mode 100644 "doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" create mode 100644 "doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" create mode 100644 "doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" create mode 100644 "doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" create mode 100644 "doc/slepc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204slepc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" create mode 100644 "doc/slepc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204slepc\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" create mode 100755 package/mumps/5.1.2/install.sh create mode 100755 package/petsc/3.18.1/install.sh create mode 100644 package/slepc/3.18.1/install.sh create mode 100644 templates/mumps/5.1.2/data.mumps.amd.cpu.config create mode 100644 templates/mumps/5.1.2/data.mumps.arm.cpu.config create mode 100644 templates/petsc/3.18.1/data.petsc.amd.cpu.config create mode 100644 templates/petsc/3.18.1/data.petsc.arm.cpu.config create mode 100644 templates/scotch/7.0.1/data.scotch.amd.cpu.config create mode 100644 templates/scotch/7.0.1/data.scotch.arm.cpu.config create mode 100644 templates/slepc/3.18.1/data.slepc.amd.cpu.config create mode 100644 templates/slepc/3.18.1/data.slepc.arm.cpu.config create mode 100644 test/test-mumps.sh create mode 100644 test/test-opencoarrays.sh create mode 100644 test/test-petsc.sh create mode 100644 test/test-scotch.sh create mode 100644 test/test-slepc.sh diff --git a/container/mumps/ openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def b/container/mumps/ openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def new file mode 100644 index 0000000..2567b31 --- /dev/null +++ b/container/mumps/ openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git flex wget vim tar unzip coreutils + # Install base gcc + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/zubinshuo2/hpcrunner.git -b math + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/mumps/5.1.2/data.mumps.amd.cpu.config + # downloads mumps + ./jarvis -d + # install dependency + ./jarvis -dp + # build mumps + ./jarvis -b + # run mumps + ./jarvis -r + # clean downloads directory + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/mumps/openeuler-bisheng2-hmpi1-mumps-5.1.2.def b/container/mumps/openeuler-bisheng2-hmpi1-mumps-5.1.2.def new file mode 100644 index 0000000..0178859 --- /dev/null +++ b/container/mumps/openeuler-bisheng2-hmpi1-mumps-5.1.2.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source init.sh + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git wget unzip make flex tar + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/mumps/5.1.2/data.mumps.arm.cpu.config + # download dependency + ./jarvis -d + # install dependency + ./jarvis -dp + # build mumps + ./jarvis -b + # run test + ./jarvis -r + # clean cache and downloads directory + yum clean all + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/opencoarrays/openeuler-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def b/container/opencoarrays/openeuler-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def new file mode 100644 index 0000000..3e54e4b --- /dev/null +++ b/container/opencoarrays/openeuler-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def @@ -0,0 +1,33 @@ +BootStrap: docker +From: openeuler/openeuler:22.03-lts-sp1 + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git flex wget vim tar unzip coreutils + # Install base gcc + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/shaoyuteng/hpcrunner.git + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config + # install dependency + ./jarvis -dp + # build opencoarrays + ./jarvis -b + # run opencoarrays + ./jarvis -r + # clean downloads directory + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/opencoarrays/openeuler-kgcc-9.3.1-openmpi4-opencoarrays-2.10.1.def b/container/opencoarrays/openeuler-kgcc-9.3.1-openmpi4-opencoarrays-2.10.1.def new file mode 100644 index 0000000..f405df7 --- /dev/null +++ b/container/opencoarrays/openeuler-kgcc-9.3.1-openmpi4-opencoarrays-2.10.1.def @@ -0,0 +1,34 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source init.sh + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git wget unzip make flex tar + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/shaoyuteng/hpcrunner.git + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/OpenCoarrays/2.10.1/data.opencoarrays.arm.cpu.config + # install dependency + ./jarvis -dp + # build opencoarrays + ./jarvis -b + # run test + ./jarvis -r + # clean cache and downloads directory + yum clean all + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/petsc/openeuler-bisheng2-hmpi1-petsc-3.18.1.def b/container/petsc/openeuler-bisheng2-hmpi1-petsc-3.18.1.def new file mode 100644 index 0000000..e068455 --- /dev/null +++ b/container/petsc/openeuler-bisheng2-hmpi1-petsc-3.18.1.def @@ -0,0 +1,33 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source init.sh + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git wget unzip make flex tar hostname + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/petsc/3.18.1/data.petsc.arm.cpu.config + # install dependency + ./jarvis -dp + # build petsc + ./jarvis -b + # run test + ./jarvis -r + # clean cache and downloads directory + yum clean all + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/petsc/openeuler-gcc9-hmpi1-petsc-3.18.1.def b/container/petsc/openeuler-gcc9-hmpi1-petsc-3.18.1.def new file mode 100644 index 0000000..b90a04b --- /dev/null +++ b/container/petsc/openeuler-gcc9-hmpi1-petsc-3.18.1.def @@ -0,0 +1,33 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git flex wget vim tar unzip coreutils + # Install base gcc + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran hostname + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner.git + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/petsc/3.18.1/data.petsc.amd.cpu.config + # install dependency + ./jarvis -dp + # build petsc + ./jarvis -b + # run petsc + ./jarvis -r + # clean downloads directory + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/scotch/openeuler-bisheng2-hmpi1-scotch-7.0.1.def b/container/scotch/openeuler-bisheng2-hmpi1-scotch-7.0.1.def new file mode 100644 index 0000000..50cf404 --- /dev/null +++ b/container/scotch/openeuler-bisheng2-hmpi1-scotch-7.0.1.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source init.sh + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git wget unzip make flex tar + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/scotch/7.0.1/data.scotch.arm.cpu.config + # download dependency + ./jarvis -d + # install dependency + ./jarvis -dp + # build scotch + ./jarvis -b + # run test + ./jarvis -r + # clean cache and downloads directory + yum clean all + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/scotch/openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def b/container/scotch/openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def new file mode 100644 index 0000000..9e82cc7 --- /dev/null +++ b/container/scotch/openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git flex wget vim tar unzip coreutils + # Install base gcc + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner.git + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/scotch/7.0.1/data.scotch.amd.cpu.config + # downloads scotch + ./jarvis -d + # install dependency + ./jarvis -dp + # build scotch + ./jarvis -b + # run scotch + ./jarvis -r + # clean downloads directory + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/slepc/openeuler-bisheng2-hmpi1-slepc-3.18.1.def b/container/slepc/openeuler-bisheng2-hmpi1-slepc-3.18.1.def new file mode 100644 index 0000000..ecdb85c --- /dev/null +++ b/container/slepc/openeuler-bisheng2-hmpi1-slepc-3.18.1.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source init.sh + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git wget unzip make flex tar hostname + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/slepc/3.18.1/data.slepc.arm.cpu.config + # download dependency + ./jarvis -d + # install dependency + ./jarvis -dp + # build slepc + ./jarvis -b + # run test + ./jarvis -r + # clean cache and downloads directory + yum clean all + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git a/container/slepc/openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def b/container/slepc/openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def new file mode 100644 index 0000000..6adca0b --- /dev/null +++ b/container/slepc/openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def @@ -0,0 +1,35 @@ +BootStrap: docker +From: openeuler/openeuler + +%environment + source /etc/profile || true + source /etc/profile.d/modules.sh + cd /hpcrunner + source env.sh + +%post + # Install the necessary development environment + yum install -y environment-modules git flex wget vim tar unzip coreutils + # Install base gcc + yum install -y gcc gcc-c++ gcc-gfortran glibc-devel make libgfortran hostname + source /etc/profile || true + git config --global http.sslVerify false + git clone https://gitee.com/openeuler/hpcrunner.git + cd hpcrunner + source ./init.sh + ./jarvis -i + # Switch config + ./jarvis -use templates/slepc/3.18.1/data.slepc.amd.cpu.config + # downloads slepc + ./jarvis -d + # install dependency + ./jarvis -dp + # build slepc + ./jarvis -b + # run slepc + ./jarvis -r + # clean downloads directory + rm -rf downloads + +%labels + Author Zu \ No newline at end of file diff --git "a/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" "b/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" new file mode 100644 index 0000000..d030c09 --- /dev/null +++ "b/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" @@ -0,0 +1,845 @@ +# 《基于openEuler的mumps软件测试报告》 + +## 1. 规范性自检 + +对项目使用fprettify对文件进行格式化 + +fprettify是一个现代Fortran代码的自动格式化程序,它采用严格的空白格式,用Python编写。 + +对于当前项目,检查代码规范性,可以通过使用fprettify对所有源码进行重新格式化,然后使用git工具查看文件修改。 + +### 1.1 选择统计文件类型 + +统计项目文件类型及其文件数量,通过Python脚本自动进行统计并进行排序: + +```python +# -*- coding: utf-8 -*- + +import os + +me = __file__ +print("分析文件夹:" + os.getcwd()) + +def getAllFiles(targetDir): + files = [] + listFiles = os.listdir(targetDir) + for file in listFiles: + path = os.path.join(targetDir, file) + if os.path.isdir(path): + files.extend(getAllFiles(path)) + elif os.path.isfile(path) and path != me: + files.append(path) + return files + +all_files=getAllFiles(os.curdir) +type_dict=dict() + +for file in all_files: + if os.path.isdir(file): + type_dict.setdefault("文件夹", 0) + type_dict["文件夹"]+=1 + else: + ext=os.path.splitext(file)[1] + type_dict.setdefault(ext, 0) + type_dict[ext]+=1 + +type_dict["空"] = type_dict.pop("") +sort_dict = sorted(type_dict.items(), key = lambda a: a[1], reverse = True) + +for each_type in sort_dict: + print("当前文件夹下共有后缀名为[%s]的文件%d个" %(each_type[0], each_type[1])) +``` + +在mumps项目根目录下运行,得到统计结果如下(排除自身): + +```shell +/root/MUMPS_5.1.2 +当前文件夹下共有[]的文件579个 +当前文件夹下共有[.F]的文件385个 +当前文件夹下共有[.h]的文件40个 +当前文件夹下共有[.c]的文件36个 +当前文件夹下共有[.sample]的文件13个 +当前文件夹下共有[.SEQ]的文件12个 +当前文件夹下共有[.m]的文件11个 +当前文件夹下共有[.PAR]的文件9个 +当前文件夹下共有[.sce]的文件6个 +当前文件夹下共有[.sci]的文件5个 +当前文件夹下共有[.xml]的文件3个 +当前文件夹下共有[.html]的文件3个 +当前文件夹下共有[.pdf]的文件1个 +当前文件夹下共有[.f]的文件1个 +当前文件夹下共有[.dtd]的文件1个 +当前文件夹下共有[.htm]的文件1个 +当前文件夹下共有[.generic]的文件1个 +当前文件夹下共有[.inc]的文件1个 +当前文件夹下共有[.mat]的文件1个 +``` + +主要源码文件后缀名为`F`,`h`,`c`以及部分C语言文件。由此判断该项目主要语言为C++/C。 + +### 1.2 统计源码代码量 + +统计行数: + +```shell +find ./ -regex ".*\.F\|.*\.cpp|.*\.c" | xargs wc -l +``` + +行数统计后结果输出如下: + +```shell +350231 total +``` + +### 1.3 统计不符合要求的总行数 + +对源代码文件(后缀名为`F`,`h`,`c`)进行fprettify代码样式格式化,格式化结果如下: + +```shell +[root@host- src]# fprettify -r src/ +[root@host- src]# git commit -m "fomat update" +[master b0a0ea8] fomat update + 44 files changed, 1044 insertions(+), 1044 deletions(-) + rewrite src/ana_omp_m.F (97%) + rewrite src/cfac_omp_m.F (97%) + rewrite src/cfac_process_bf.F (97%) + rewrite src/clr_type.F (94%) + rewrite src/cmumps_iXamax.F (99%) + rewrite src/cmumps_save_restore.F (97%) + rewrite src/cmumps_save_restore_files.F (97%) + rewrite src/cmumps_struc_def.F (97%) + rewrite src/comp_tps_m.F (97%) + rewrite src/cstatic_ptr_m.F (71%) + rewrite src/dfac_omp_m.F (97%) + rewrite src/dfac_process_bf.F (97%) + rewrite src/dlr_type.F (94%) + rewrite src/dmumps_iXamax.F (98%) + rewrite src/dmumps_save_restore.F (97%) + rewrite src/dmumps_save_restore_files.F (97%) + rewrite src/dmumps_struc_def.F (97%) + rewrite src/domp_tps_m.F (97%) + rewrite src/dstatic_ptr_m.F (70%) + rewrite src/fac_future_niv2_mod.F (97%) + rewrite src/fac_ibct_data_m.F (97%) + rewrite src/mumps_comm_ibcast.F (97%) + rewrite src/mumps_l0_omp_m.F (90%) + rewrite src/mumps_type_size.F (92%) + rewrite src/mumps_version.F (98%) + rewrite src/omp_tps_common_m.F (97%) + rewrite src/sfac_omp_m.F (97%) + rewrite src/sfac_process_bf.F (97%) + rewrite src/slr_type.F (94%) + rewrite src/smumps_iXamax.F (98%) + rewrite src/smumps_save_restore.F (97%) + rewrite src/smumps_save_restore_files.F (97%) + rewrite src/smumps_struc_def.F (97%) + rewrite src/somp_tps_m.F (97%) + rewrite src/sstatic_ptr_m.F (72%) + rewrite src/zfac_omp_m.F (97%) + rewrite src/zfac_process_bf.F (97%) + rewrite src/zlr_type.F (94%) + rewrite src/zmumps_iXamax.F (99%) + rewrite src/zmumps_save_restore.F (97%) + rewrite src/zmumps_save_restore_files.F (97%) + rewrite src/zmumps_struc_def.F (97%) + rewrite src/zomp_tps_m.F (97%) + rewrite src/zstatic_ptr_m.F (70%) +``` + +### 1.4.统计结果 + +综上信息,项目中代码规范性自检检查结果为 + +通过率 : 99.702% 1-1044/350231*100% + +不通过率 : 0.628% 1044/166350*100% + +## 2. 功能性测试 + +### 2.1 测试案例 + +mumps提供了运行的不同example,需要用户在编译后自行进入各个测试案例目录运行。部分测试程序需要外部输入文件,mumps已在对应目录提供。 + +example文件如下: + +```shell +~/MUMPS_5.1.2 |master ✓| → tree examples/ +examples/ +├── c_example.c +├── csimpletest.F +├── dsimpletest.F +├── input_simpletest_cmplx +├── input_simpletest_real +├── Makefile +├── multiple_arithmetics_example.F +├── README +├── ssimpletest.F +└── zsimpletest.F +``` + +案例测试程序对应程序如下: + +```fortran +C +C This file is part of MUMPS 5.1.2, released +C on Mon Oct 2 07:37:01 UTC 2017 +C + PROGRAM MUMPS_TEST + IMPLICIT NONE + INCLUDE 'mpif.h' + INCLUDE 'smumps_struc.h' + TYPE (SMUMPS_STRUC) mumps_par + INTEGER IERR, I + INTEGER(8) I8 + CALL MPI_INIT(IERR) +C Define a communicator for the package. + mumps_par%COMM = MPI_COMM_WORLD +C Initialize an instance of the package +C for L U factorization (sym = 0, with working host) + mumps_par%JOB = -1 + mumps_par%SYM = 0 + mumps_par%PAR = 1 + CALL SMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF +C Define problem on the host (processor 0) + IF ( mumps_par%MYID .eq. 0 ) THEN + READ(5,*) mumps_par%N + READ(5,*) mumps_par%NNZ + ALLOCATE( mumps_par%IRN ( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%JCN ( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%A( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%RHS ( mumps_par%N ) ) + DO I8 = 1, mumps_par%NNZ + READ(5,*) mumps_par%IRN(I8),mumps_par%JCN(I8),mumps_par%A(I8) + END DO + DO I = 1, mumps_par%N + READ(5,*) mumps_par%RHS(I) + END DO + END IF +C Call package for solution + mumps_par%JOB = 6 + CALL SMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF +C Solution has been assembled on the host + IF ( mumps_par%MYID .eq. 0 ) THEN + WRITE( 6, * ) ' Solution is ',(mumps_par%RHS(I),I=1,mumps_par%N) + END IF +C Deallocate user data + IF ( mumps_par%MYID .eq. 0 )THEN + DEALLOCATE( mumps_par%IRN ) + DEALLOCATE( mumps_par%JCN ) + DEALLOCATE( mumps_par%A ) + DEALLOCATE( mumps_par%RHS ) + END IF +C Destroy the instance (deallocate internal data structures) + mumps_par%JOB = -2 + CALL SMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF + 500 CALL MPI_FINALIZE(IERR) + STOP + END +``` + +输入文件: + +```shell +5 :N +12 :NZ +1 2 3.0 +2 3 -3.0 +4 3 2.0 +5 5 1.0 +2 1 3.0 +1 1 2.0 +5 2 4.0 +3 4 2.0 +2 5 6.0 +3 2 -1.0 +1 3 4.0 +3 3 1.0 :values +20.0 +24.0 +9.0 +6.0 +13.0 :RHS +``` + +### 2.2 功能测试 + +mumps仅作为一个框架,只生成对应的库文件和头文件,而在examples目录中提供了各种方向的测试程序,需要用户在编译后自行进入各个测试案例目录运行。部分测试程序需要外部输入文件,mumps已在对应目录提供。 + +```shell +make all +``` + +- 进行测试 + +```shell +# 测试命令 +#!/bin/bash + +export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +MPIRUN="mpirun -np 3 --mca plm_rsh_agent sh --mca opal_warn_on_missing_libcuda 0 --oversubscribe" +${MPIRUN} ./ssimpletest < input_simpletest_real +``` + +- 测试结果 + +```shell +Entering SMUMPS 5.1.2 with JOB, N, NNZ = 6 5 12 + executing #MPI = 3, without OMP + + ================================================= + ================================================= +L U Solver for unsymmetric matrices +Type of parallelism: Working host + + ****** ANALYSIS STEP ******** + + ... Structural symmetry (in percent)= 92 + Average density of rows/columns = 2 + ... No column permutation + Ordering based on AMF + +Leaving analysis phase with ... +INFOG(1) = 0 +INFOG(2) = 0 + -- (20) Number of entries in factors (estim.) = 15 + -- (3) Storage of factors (REAL, estimated) = 15 + -- (4) Storage of factors (INT , estimated) = 65 + -- (5) Maximum frontal size (estimated) = 3 + -- (6) Number of nodes in the tree = 3 + -- (32) Type of analysis effectively used = 1 + -- (7) Ordering option effectively used = 2 +ICNTL(6) Maximum transversal option = 0 +ICNTL(7) Pivot order option = 7 +Percentage of memory relaxation (effective) = 20 +Number of level 2 nodes = 0 +Number of split nodes = 0 +RINFOG(1) Operations during elimination (estim)= 1.900D+01 + ** Rank of proc needing largest memory in IC facto : 0 + ** Estimated corresponding MBYTES for IC facto : 1 + ** Estimated avg. MBYTES per work. proc at facto (IC) : 1 + ** TOTAL space in MBYTES for IC factorization : 3 + ** Rank of proc needing largest memory for OOC facto : 0 + ** Estimated corresponding MBYTES for OOC facto : 1 + ** Estimated avg. MBYTES per work. proc at facto (OOC) : 1 + ** TOTAL space in MBYTES for OOC factorization : 3 + ELAPSED TIME IN ANALYSIS DRIVER= 0.0022 + + ****** FACTORIZATION STEP ******** + + + GLOBAL STATISTICS PRIOR NUMERICAL FACTORIZATION ... + NUMBER OF WORKING PROCESSES = 3 + OUT-OF-CORE OPTION (ICNTL(22)) = 0 + REAL SPACE FOR FACTORS = 15 + INTEGER SPACE FOR FACTORS = 65 + MAXIMUM FRONTAL SIZE (ESTIMATED) = 3 + NUMBER OF NODES IN THE TREE = 3 + MEMORY ALLOWED (MB -- 0: N/A ) = 0 + RELATIVE THRESHOLD FOR PIVOTING, CNTL(1) = 0.1000D-01 + Convergence error after scaling for ONE-NORM (option 7/8) = 0.38D+00 + Maximum effective relaxed size of S = 475 + Average effective relaxed size of S = 469 + ELAPSED TIME FOR MATRIX DISTRIBUTION = 0.0000 + ** Memory relaxation parameter ( ICNTL(14) ) : 20 + ** Rank of processor needing largest memory in facto : 0 + ** Space in MBYTES used by this processor for facto : 1 + ** Avg. Space in MBYTES per working proc during facto : 1 + + ELAPSED TIME FOR FACTORIZATION = 0.0023 + Maximum effective space used in S (KEEP8(67)) 12 + Average effective space used in S (KEEP8(67)) 5 + ** EFF Min: Rank of processor needing largest memory : 0 + ** EFF Min: Space in MBYTES used by this processor : 1 + ** EFF Min: Avg. Space in MBYTES per working proc : 1 + + GLOBAL STATISTICS + RINFOG(2) OPERATIONS IN NODE ASSEMBLY = 2.000D+00 + ------(3) OPERATIONS IN NODE ELIMINATION= 1.900D+01 + INFOG (9) REAL SPACE FOR FACTORS = 15 + INFOG(10) INTEGER SPACE FOR FACTORS = 65 + INFOG(11) MAXIMUM FRONT SIZE = 3 + INFOG(29) NUMBER OF ENTRIES IN FACTORS = 15 + INFOG(12) NUMBER OF OFF DIAGONAL PIVOTS = 0 + INFOG(13) NUMBER OF DELAYED PIVOTS = 0 + INFOG(14) NUMBER OF MEMORY COMPRESS = 0 + ELAPSED TIME IN FACTORIZATION DRIVER= 0.0031 + + + ****** SOLVE & CHECK STEP ******** + + + STATISTICS PRIOR SOLVE PHASE ........... + NUMBER OF RIGHT-HAND-SIDES = 1 + BLOCKING FACTOR FOR MULTIPLE RHS = 1 + ICNTL (9) = 1 + --- (10) = 0 + --- (11) = 0 + --- (20) = 0 + --- (21) = 0 + --- (30) = 0 + ** Rank of processor needing largest memory in solve : 0 + ** Space in MBYTES used by this processor for solve : 0 + ** Avg. Space in MBYTES per working proc during solve : 0 + + Global statistics + TIME to build/scatter RHS = 0.000093 + TIME in solution step (fwd/bwd) = 0.000231 + .. TIME in forward (fwd) step = 0.000133 + .. TIME in backward (bwd) step = 0.000090 + TIME to gather solution(cent.sol)= 0.000005 + TIME to copy/scale RHS (dist.sol)= 0.000000 + ELAPSED TIME IN SOLVE DRIVER= 0.0010 + Solution is 1.00000048 2.00000024 3.00000000 4.00000000 4.99999952 + +Entering SMUMPS 5.1.2 with JOB = -2 + executing #MPI = 3, without OMP + +Entering DMUMPS 5.1.2 with JOB, N, NNZ = 6 5 12 + executing #MPI = 3, without OMP + + ================================================= + ================================================= +L U Solver for unsymmetric matrices +Type of parallelism: Working host + + ****** ANALYSIS STEP ******** + + ... Structural symmetry (in percent)= 92 + Average density of rows/columns = 2 + ... No column permutation + Ordering based on AMF + +Leaving analysis phase with ... +INFOG(1) = 0 +INFOG(2) = 0 + -- (20) Number of entries in factors (estim.) = 15 + -- (3) Storage of factors (REAL, estimated) = 15 + -- (4) Storage of factors (INT , estimated) = 65 + -- (5) Maximum frontal size (estimated) = 3 + -- (6) Number of nodes in the tree = 3 + -- (32) Type of analysis effectively used = 1 + -- (7) Ordering option effectively used = 2 +ICNTL(6) Maximum transversal option = 0 +ICNTL(7) Pivot order option = 7 +Percentage of memory relaxation (effective) = 20 +Number of level 2 nodes = 0 +Number of split nodes = 0 +RINFOG(1) Operations during elimination (estim)= 1.900D+01 + ** Rank of proc needing largest memory in IC facto : 0 + ** Estimated corresponding MBYTES for IC facto : 1 + ** Estimated avg. MBYTES per work. proc at facto (IC) : 1 + ** TOTAL space in MBYTES for IC factorization : 3 + ** Rank of proc needing largest memory for OOC facto : 0 + ** Estimated corresponding MBYTES for OOC facto : 1 + ** Estimated avg. MBYTES per work. proc at facto (OOC) : 1 + ** TOTAL space in MBYTES for OOC factorization : 3 + ELAPSED TIME IN ANALYSIS DRIVER= 0.0006 + + ****** FACTORIZATION STEP ******** + + + GLOBAL STATISTICS PRIOR NUMERICAL FACTORIZATION ... + NUMBER OF WORKING PROCESSES = 3 + OUT-OF-CORE OPTION (ICNTL(22)) = 0 + REAL SPACE FOR FACTORS = 15 + INTEGER SPACE FOR FACTORS = 65 + MAXIMUM FRONTAL SIZE (ESTIMATED) = 3 + NUMBER OF NODES IN THE TREE = 3 + MEMORY ALLOWED (MB -- 0: N/A ) = 0 + RELATIVE THRESHOLD FOR PIVOTING, CNTL(1) = 0.1000D-01 + Convergence error after scaling for ONE-NORM (option 7/8) = 0.38D+00 + Maximum effective relaxed size of S = 475 + Average effective relaxed size of S = 469 + ELAPSED TIME FOR MATRIX DISTRIBUTION = 0.0000 + ** Memory relaxation parameter ( ICNTL(14) ) : 20 + ** Rank of processor needing largest memory in facto : 0 + ** Space in MBYTES used by this processor for facto : 1 + ** Avg. Space in MBYTES per working proc during facto : 1 + + ELAPSED TIME FOR FACTORIZATION = 0.0012 + Maximum effective space used in S (KEEP8(67)) 12 + Average effective space used in S (KEEP8(67)) 5 + ** EFF Min: Rank of processor needing largest memory : 0 + ** EFF Min: Space in MBYTES used by this processor : 1 + ** EFF Min: Avg. Space in MBYTES per working proc : 1 + + GLOBAL STATISTICS + RINFOG(2) OPERATIONS IN NODE ASSEMBLY = 2.000D+00 + ------(3) OPERATIONS IN NODE ELIMINATION= 1.900D+01 + INFOG (9) REAL SPACE FOR FACTORS = 15 + INFOG(10) INTEGER SPACE FOR FACTORS = 65 + INFOG(11) MAXIMUM FRONT SIZE = 3 + INFOG(29) NUMBER OF ENTRIES IN FACTORS = 15 + INFOG(12) NUMBER OF OFF DIAGONAL PIVOTS = 0 + INFOG(13) NUMBER OF DELAYED PIVOTS = 0 + INFOG(14) NUMBER OF MEMORY COMPRESS = 0 + ELAPSED TIME IN FACTORIZATION DRIVER= 0.0019 + + + ****** SOLVE & CHECK STEP ******** + + + STATISTICS PRIOR SOLVE PHASE ........... + NUMBER OF RIGHT-HAND-SIDES = 1 + BLOCKING FACTOR FOR MULTIPLE RHS = 1 + ICNTL (9) = 1 + --- (10) = 0 + --- (11) = 0 + --- (20) = 0 + --- (21) = 0 + --- (30) = 0 + ** Rank of processor needing largest memory in solve : 0 + ** Space in MBYTES used by this processor for solve : 0 + ** Avg. Space in MBYTES per working proc during solve : 0 + + Global statistics + TIME to build/scatter RHS = 0.000062 + TIME in solution step (fwd/bwd) = 0.000247 + .. TIME in forward (fwd) step = 0.000170 + .. TIME in backward (bwd) step = 0.000055 + TIME to gather solution(cent.sol)= 0.000004 + TIME to copy/scale RHS (dist.sol)= 0.000000 + ELAPSED TIME IN SOLVE DRIVER= 0.0006 + Solution is 0.99999999999999989 2.0000000000000000 3.0000000000000004 3.9999999999999996 4.9999999999999991 + +Entering DMUMPS 5.1.2 with JOB = -2 + executing #MPI = 3, without OMP +``` + +模型验证且运行成功,测试通过。 + +## 3.性能测试 + +### 3.1.测试平台信息对比 + +| | arm信息 | x86信息 | +| -------- | -------------------------------- | --------------------- | +| 操作系统 | openEuler 22.03 (LTS) | openEuler 22.03 (LTS) | +| 内核版本 | 5.10.0-60.18.0.50.oe2203.aarch64 | 5.15.79.1.oe1.x86_64 | + +### 3.2.测试软件环境信息对比 + +| | arm信息 | x86信息 | +| --------- | ------------- | --------- | +| gcc | bisheng 2.1.0 | gcc 9.3.0 | +| mpi | hmpi1.1.1 | hmpi1.1.1 | +| CMake | 3.23.1 | 3.23.1 | +| OpenBLAS | 0.3.18 | 0.3.18 | +| lapack | 3.8.0 | 3.8.0 | +| scalapack | 2.1.0 | 2.1.0 | + +### 3.3.测试硬件性能信息对比 + +| | arm信息 | x86信息 | +| ------ | ----------- | -------- | +| cpu | Kunpeng 920 | | +| 核心数 | 16 | 4 | +| 内存 | 32 GB | 8 GB | +| 磁盘io | 1.3 GB/s | 400 MB/s | +| 虚拟化 | KVM | KVM | + +### 3.4.测试选择的案例 + +example/ 目录下的文件 csimpletest + +测试文件如下 + +```fortran +C +C This file is part of MUMPS 5.1.2, released +C on Mon Oct 2 07:37:01 UTC 2017 +C + PROGRAM MUMPS_TEST + IMPLICIT NONE + INCLUDE 'mpif.h' + INCLUDE 'cmumps_struc.h' + TYPE (CMUMPS_STRUC) mumps_par + INTEGER IERR, I + INTEGER(8) I8 + CALL MPI_INIT(IERR) +C Define a communicator for the package. + mumps_par%COMM = MPI_COMM_WORLD +C Initialize an instance of the package +C for L U factorization (sym = 0, with working host) + mumps_par%JOB = -1 + mumps_par%SYM = 0 + mumps_par%PAR = 1 + CALL CMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF +C Define problem on the host (processor 0) + IF ( mumps_par%MYID .eq. 0 ) THEN + READ(5,*) mumps_par%N + READ(5,*) mumps_par%NNZ + ALLOCATE( mumps_par%IRN ( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%JCN ( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%A( mumps_par%NNZ ) ) + ALLOCATE( mumps_par%RHS ( mumps_par%N ) ) + DO I8 = 1, mumps_par%NNZ + READ(5,*) mumps_par%IRN(I8),mumps_par%JCN(I8),mumps_par%A(I8) + END DO + DO I = 1, mumps_par%N + READ(5,*) mumps_par%RHS(I) + END DO + END IF +C Call package for solution + mumps_par%JOB = 6 + CALL CMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF +C Solution has been assembled on the host + IF ( mumps_par%MYID .eq. 0 ) THEN + WRITE( 6, * ) ' Solution is ',(mumps_par%RHS(I),I=1,mumps_par%N) + END IF +C Deallocate user data + IF ( mumps_par%MYID .eq. 0 )THEN + DEALLOCATE( mumps_par%IRN ) + DEALLOCATE( mumps_par%JCN ) + DEALLOCATE( mumps_par%A ) + DEALLOCATE( mumps_par%RHS ) + END IF +C Destroy the instance (deallocate internal data structures) + mumps_par%JOB = -2 + CALL CMUMPS(mumps_par) + IF (mumps_par%INFOG(1).LT.0) THEN + WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", + & " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), + & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) + GOTO 500 + END IF + 500 CALL MPI_FINALIZE(IERR) + STOP + END +``` + +输入文件 + +```shell +5 : N +12 : NZ +1 2 (3.0,0.0) +2 3 (-3.0,0.0) +4 3 (2.0,0.0) +5 5 (1.0,0.0) +2 1 (3.0,0.0) +1 1 (2.0,0.0) +5 2 (4.0,0.0) +3 4 (2.0,0.0) +2 5 (6.0,0.0) +3 2 (-1.0,0.0) +1 3 (4.0,0.0) +3 3 (1.0,0.0) +(20.0,0.0) +(24.0,0.0) +(9.0,0.0) +(6.0,0.0) +(13.0,0.0) : RHS + +``` + +### 3.5.单线程 + +单线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ------ | +| 实际CPU时间 | 0.160s | 0.188s | +| 用户时间 | 0.064s | 0.063s | + +### 3.6.多线程 + +多线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ----- | +| 线程数 | 4 | 4 | +| 实际CPU时间 | 0.159s | 0.204 | +| 用户时间 | 0.197s | 0.168 | + +arm多线程时间耗费数据表: + +| 线程 | 1 | 2 | 4 | 8 | +| :------------ | ----- | ----- | ----- | ----- | +| 用户时间(s) | 0.160 | 0.155 | 0.159 | 0.174 | +| 用户态时间(s) | 0.064 | 0.099 | 0.197 | 0.407 | +| 内核态时间(s) | 0.053 | 0.082 | 0.127 | 0.257 | + +x86多线程时间耗费数据表: + +| 线程 | 1 | 2 | 3 | 4 | +| --------------- | ----- | ----- | ----- | ----- | +| 用户时间 (s) | 0.188 | 0.195 | 0.216 | 0.204 | +| 用户态时间(s) | 0.063 | 0.079 | 0.150 | 0.168 | +| 内核态时间(s) | 0.163 | 0.281 | 0.424 | 0.520 | + +由上表可知,在线程逐渐增加的情况下,所减少的用户时间并非线性关系,线程数增加后,运算用时并未显著下降,且系统调用的时间有较为明显的上升趋势。 + +### 3.7.测试总结 + +性能测试arm平台均在x86平台50%以上,且随着线程数的增加,两个平台的对于同一个应用的所耗费的时间差距逐渐减少。 + +且线程增加并不会无限制减少应用的实际耗费时间,在合理的范围内分配线程数才能更好的利用算力资源。 + +## 4.精度测试 + +### 4.1.所选测试案例 + +example/ 目录下的文件 c_example.c + +使用 C 接口的示例程序 + +- MUMPS 的双实数算术版本,dmumps_c。 +- 我们解决系统 A x = RHS 与 +- A = diag(1 2) 和 RHS = [1 4]^T +- 解是 [1 2]^T */ + +测试文件如下 + +```c +/* + * + * This file is part of MUMPS 5.1.2, released + * on Mon Oct 2 07:37:01 UTC 2017 + * + */ +/* Example program using the C interface to the + * double real arithmetic version of MUMPS, dmumps_c. + * We solve the system A x = RHS with + * A = diag(1 2) and RHS = [1 4]^T + * Solution is [1 2]^T */ +#include +#include +#include "mpi.h" +#include "dmumps_c.h" +#define JOB_INIT -1 +#define JOB_END -2 +#define USE_COMM_WORLD -987654 + +#if defined(MAIN_COMP) +/* + * Some Fortran compilers (COMPAQ fort) define main inside + * their runtime library while a Fortran program translates + * to MAIN_ or MAIN__ which is then called from "main". This + * is annoying because MAIN__ has no arguments and we must + * define argc/argv arbitrarily !! + */ +int MAIN__(); +int MAIN_() + { + return MAIN__(); + } + +int MAIN__() +{ + int argc=1; + char * name = "c_example"; + char ** argv ; +#else +int main(int argc, char ** argv) +{ +#endif + DMUMPS_STRUC_C id; + MUMPS_INT n = 2; + MUMPS_INT8 nnz = 2; + MUMPS_INT irn[] = {1,2}; + MUMPS_INT jcn[] = {1,2}; + double a[2]; + double rhs[2]; + + MUMPS_INT myid, ierr; + + int error = 0; +#if defined(MAIN_COMP) + argv = &name; +#endif + ierr = MPI_Init(&argc, &argv); + ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid); + /* Define A and rhs */ + rhs[0]=1.0;rhs[1]=4.0; + a[0]=1.0;a[1]=2.0; + + /* Initialize a MUMPS instance. Use MPI_COMM_WORLD */ + id.comm_fortran=USE_COMM_WORLD; + id.par=1; id.sym=0; + id.job=JOB_INIT; + dmumps_c(&id); + + /* Define the problem on the host */ + if (myid == 0) { + id.n = n; id.nnz =nnz; id.irn=irn; id.jcn=jcn; + id.a = a; id.rhs = rhs; + } +#define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ + /* No outputs */ + id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; + + /* Call the MUMPS package (analyse, factorization and solve). */ + id.job=6; + dmumps_c(&id); + if (id.infog[0]<0) { + printf(" (PROC %d) ERROR RETURN: \tINFOG(1)= %d\n\t\t\t\tINFOG(2)= %d\n", + myid, id.infog[0], id.infog[1]); + error = 1; + } + + /* Terminate instance. */ + id.job=JOB_END; + dmumps_c(&id); + if (myid == 0) { + if (!error) { + printf("Solution is : (%8.2f %8.2f)\n", rhs[0],rhs[1]); + } else { + printf("An error has occured, please check error code returned by MUMPS.\n"); + } + } + ierr = MPI_Finalize(); + return 0; +} +``` + +通过Makefile进行编译 +运行选项如下: + +```bash +make clean all +MPIRUN="mpirun -np 3 --mca plm_rsh_agent sh --mca opal_warn_on_missing_libcuda 0 --oversubscribe" +${MPIRUN} ./c_example +``` + +### 4.2.获取对比数据 + +arm 运行结果 + +```bash +Solution is : ( 1.00 2.00) +``` + +### 4.3.测试总结 + +从arm输出结果可以看出测试通过,满足example/README中的结果。 diff --git "a/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" "b/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" new file mode 100644 index 0000000..0bf05d1 --- /dev/null +++ "b/doc/ mumps/5.1.2/\343\200\212\345\237\272\344\272\216openEuler\347\232\204mumps\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" @@ -0,0 +1,375 @@ +# 《基于openEuler的MUMPS软件移植指南》 + +## 1.介绍 + +- MUMPS("MUltifrontal Massively Parallel Solver")是一个用于求解线性方程组的软件包。 + +- 官网地址: + +- 特性: + + - 实数或复数算术(单精度或双精度) + - 平行因式分解和求解阶段 + - (也可使用单处理器版本) + - 脱离核心的数值阶段 + - 迭代细化和逆向误差分析 + - 各种矩阵输入格式集合式、分布式、元素式格式 + - 部分因式分解和Schur互补矩阵(集中式或二维块状循环式),具有减少/压缩的右手边 + +## 2.环境要求 + +- 操作系统:OpenEuler arm/x86 (本文档以 x86 架构为例) + +## 3.配置编译环境 + +配置环境指导,手动进行配置依赖环境。 + +### 3.1.环境总览 + +- 编译器: gcc + +- MPI:hmpi + +- 其他类库:`CMake`, `OpenBLAS`, `zlib`, `lapack`, `scalapack` + + 具体版本和下载地址如下 + +| 名称 | 版本 | 软件下载地址 | +| --------- | ------ | ---------------------------------------------------------------------------------------------- | +| hmpi | 1.1.1 | | +| gcc | 9.3.0 | | +| CMake | 3.23.1 | | +| OpenBLAS | 0.3.18 | | +| zlib | 1.2.12 | | +| lapack | 3.8.0 | | +| scalapack | 2.1.0 | | + +### 3.2.创建文件夹 + +```bash +mkdir -p $HOME/build +mkdir -p $HOME/install +mkdir -p $HOME/tmp +``` + +### 3.3.安装预设 + +设置环境变量,方便修改自定义安装目录 + +- 编译目录为 $HOME/build , 根据实际情况进行修改 +- 软件安装目录为 $HOME/install , 根据实际情况进行修改 +- 下载目录为 $HOME/tmp , 根据实际情况进行修改 + +```bash +#为了方便自定义软件安装目录 +#环境变量DEP_INSTALL_DIR将在后文中作为软件安装目录的根目录 +export DEP_INSTALL_DIR=$HOME/install +#环境变量DEP_BUILD_DIR将在后文中作为编译的根目录 +export DEP_BUILD_DIR=$HOME/build +#环境变量DEP_DOWNLOAD_DIR将在后文中作为下载文件的保存目录 +export DEP_DOWNLOAD_DIR=$HOME/tmp + +#注: 以上变量只在一次会话中有效。如果中途断开ssh会话,则在后续的安装过程中不会生效,需要重新运行 +``` + +### 3.4.安装环境依赖和gcc编译器 + +```bash +#环境依赖 +yum -y install wget tar libatomic + +#安装bisheng编译器 +wget -P $DEP_DOWNLOAD_DIR https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz +tar -xf $DEP_DOWNLOAD_DIR/gcc-9.3.0.tar.gz -C $DEP_INSTALL_DIR +sed -i "35s/ftp/http/g" ./contrib/download_prerequisites +./contrib/download_prerequisites +./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared +make -j && make install +#设置环境变量 +echo "export PATH=$DEP_INSTALL_DIR/gcc-9.3.0/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` +``` + +## 3.5.下载并编译hmpi + +```bash +yum -y install libstdc++ libstdc++-devel +yum -y install unzip make autoconf automake git libtool +#下载解压源码文件 +wget https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/xucg/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/hmpi/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip + +cd $DEP_BUILD_DIR +unzip -q $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip +cp -rf xucg-1.1.1-huawei/* hucx-1.1.1-huawei/src/ucg/ + +#编译hucx +cd $DEP_BUILD_DIR/hucx-1.1.1-huawei +./autogen.sh +./contrib/configure-opt --prefix=$DEP_INSTALL_DIR/hmpi/hucx CFLAGS="-DHAVE___CLEAR_CACHE=1" --disable-numa --without-java +for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done +for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done +make -j +make install + +yum -y install flex +#编译hmpi +cd $DEP_BUILD_DIR/hmpi-1.1.1-huawei +./autogen.pl +./configure --prefix=$DEP_INSTALL_DIR/hmpi --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$DEP_INSTALL_DIR/hmpi/hucx +make -j +make install + +echo "export PATH=$DEP_INSTALL_DIR/hmpi/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort +``` + +## 3.6.下载并编译`CMake`, `OpenBLAS`, `zlib`, `lapack`, `scalapack` + +```bash +# 下载CMake +wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O $DEP_DOWNLOAD_DIR/cmake-3.23.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/cmake-3.23.1-linux-x86_64.tar.gz -C $DEP_INSTALL_DIR/cmake --strip-components=1 +echo "export PATH=$DEP_INSTALL_DIR/cmake/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译OpenBLAS +wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.18.tar.gz -O $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz +tar -xzvf $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/OpenBLAS-0.3.18 +make -j +make PREFIX=$DEP_INSTALL_DIR/OpenBLAS install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/OpenBLAS/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译zlib +wget https://zlib.net/fossils/zlib-1.2.12.tar.gz -O $DEP_DOWNLOAD_DIR/zlib-1.2.12.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/zlib-1.2.12.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/zlib-1.2.12 +CC= CXX= ./configure --prefix=$DEP_INSTALL_DIR/zlib +make -j +make install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/zlib/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译lapack +wget https://www.cp2k.org/static/downloads/lapack-3.8.0.tgz -O $DEP_DOWNLOAD_DIR/lapack-3.8.0.tgz +tar -xvf $DEP_DOWNLOAD_DIR/lapack-3.8.0.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/lapack-3.8.0 +./bootstrap.sh +mkdir build && cd build +cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_LIBDIR=$DEP_INSTALL_DIR/lapack +make -j +make install -j +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/lapack/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译scalapack +wget http://www.netlib.org/scalapack/scalapack-2.1.0.tgz -O $DEP_DOWNLOAD_DIR/scalapack-2.1.0.tgz +tar -xvf $DEP_DOWNLOAD_DIR/scalapack-2.1.0.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/scalapack-2.1.0 +mkdir build && cd build +cmake \ +-DCMAKE_INSTALL_PREFIX=$DEP_INSTALL_DIR/scalapack \ +-DBUILD_SHARED_LIBS=ON \ +-DBLAS_LIBRARIES=$DEP_INSTALL_DIR/OpenBLAS/lib/libopenblas.so \ +-DLAPACK_LIBRARIES=$DEP_INSTALL_DIR/lapack/lib/liblapack.so \ +-DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 \ +.. / +make -j +make install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/scalapack/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +``` + +## 4.编译MUMPS + +### 4.1.下载并编译 MUMPS + +获取 MUMPS软件源码并解压文件 + +```bash + +# 下载源码文件 +wget http://graal.ens-lyon.fr/MUMPS/MUMPS_5.1.2.tar.gz -O $DEP_DOWNLOAD_DIR/MUMPS_5.1.2.tar.gz +# 解压源码文件 +tar -xvf $DEP_DOWNLOAD_DIR/MUMPS_5.1.2.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/MUMPS_5.1.2 +#编译源码 +mkdir -p lib +cp Make.inc/Makefile.inc.generic ./Makefile.inc +sed -i 's/f90/mpifort/g' ./Makefile.inc +sed -i 's/CC = cc/CC = mpicc/g' ./Makefile.inc +sed -i '94c LIBEXT = .so' ./Makefile.inc +sed -i '107c AR = $(CC) -shared $(OPTC) -o' ./Makefile.inc +sed -i '115c LAPACK = -Wl,-rpath,$DEP_INSTALL_DIR/lapack/ -L$DEP_INSTALL_DIR/lapack/ -llapack' ./Makefile.inc +sed -i '118c SCALAP = -Wl,-rpath,$DEP_INSTALL_DIR/scalapack/lib/ -L$DEP_INSTALL_DIR/scalapack/lib/ -lscalapack' ./Makefile.inc +sed -i '121c INCPAR = -I$DEP_INSTALL_DIR/hmpi/include' ./Makefile.inc +sed -i '124c LIBPAR = $(SCALAP) $(LAPACK) -L$DEP_INSTALL_DIR/hmpi/lib -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi' ./Makefile.inc +sed -i '134c LIBBLAS = -Wl,-rpath,$DEP_INSTALL_DIR/openblas/lib -L$DEP_INSTALL_DIR/openblas/lib -lopenblas' ./Makefile.inc +sed -i '153c OPTF = -DALLOW_NON_INIT ${CFLAGS} -fPIC -Wno-argument-mismatch' ./Makefile.inc +sed -i '154c OPTC = ${CFLAGS} -fPIC' ./Makefile.inc +sed -i '155c OPTL = ${CFLAGS} -fPIC' ./Makefile.inc +sed -i '71c cp $(LPORDDIR)/libpord$(LIBEXT) `pwd`/lib; \\' ./Makefile +make alllib all +``` + +### 4.2. 运行测试文件 + +运行MUMPS项目测试文件 + +```bash +cd $DEP_BUILD_DIR/MUMPS_5.1.2/example +export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +make clean all +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$DEP_BUILD_DIR/MUMPS_5.1.2/lib +${MPIRUN} ./ssimpletest < input_simpletest_real +${MPIRUN} ./dsimpletest < input_simpletest_real +${MPIRUN} ./csimpletest < input_simpletest_cmplx +${MPIRUN} ./zsimpletest < input_simpletest_cmplx +${MPIRUN} ./c_example +${MPIRUN} ./multiple_arithmetics_example +``` + +## 附A:使用hpcrunner进行一键安装MUMPS + +推荐使用hpcrunner进行安装MUMPS + +### 1.克隆仓库 + +```bash +git clone https://gitee.com/openeuler/hpcrunner.git +``` + +## 2.初始化hpcrunner 和 安装必要软件包 + +初始化项目助手 + +```bash +cd hpcrunner +source init.sh +``` + +安装必要软件包 + +**arm / x86 需要的软件包不同,根据实际环境进行选择** + +```bash +# arm +yum install -y environment-modules git wget unzip make flex tar +# x86 +yum install -y environment-modules git wget unzip make flex tar +yum install -y gcc gcc-c++ gcc-gfortran glibc-devel libgfortran +yum install -y tcsh tcl lsof tk bc +``` + +### 3.选择平台对应配置文件 + +- arm平台的配置文件为 `templates/mumps/5.1.2/data.mumps.arm.cpu.config` + + ```bash + ./jarvis -use templates/mumps/5.1.2/data.mumps.arm.cpu.config + ``` + +- x86 平台的配置文件为 `templates/mumps/5.1.2/data.mumps.amd.cpu.config` + + ```bash + ./jarvis -use templates/mumps/5.1.2/data.mumps.amd.cpu.config + ``` + +### 4.下载mumps源码 + +```bash +./jarvis -d +``` + +### 5.一键配置依赖环境 + +```bash +./jarvis -dp +``` + +### 6.一键进行编译 + +```bash +./jarvis -b +``` + +### 7.一键进行运行测试 + +```bash +./jarvis -r +``` + +## 附B:使用singularity运行容器 + +### 使用教程 + +### 下载容器镜像 + +通过链接下载: + +[百度云盘](https://pan.baidu.com/s/1UjHiv6DN_oOVXcuohP5Uqg?pwd=vxit) + +或者扫码下载: + +![百度云](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAAP3aGbAAAJ7ElEQVR4nO3dQY4kNxIAwe6F/v/l0UXY0xYx4FKh8JbZdTCV2VlZDh4C5PevX7++AAr+80/fAMDvEiwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMv64+D/f39/P72PMpw0LD3/UYY/Du0fx/APvrvXWkgd4YcmXePdHdX+Md3+vFRaQIVhAhmABGYIFZAgWkCFYQIZgARmCBWTcDI4eLDlH+mKa7u7O76YHu9Ohd57PlG74fpdbcufPX3UrLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyHg8OHrQnZa8m3u8s3yQcsMI6NnF33V355OTxht2WD2YHFK1wgIyBAvIECwgQ7CADMECMgQLyBAsIEOwgIy5wdHlJqfp7gYpNwzKTnr7ADdMbJ4t2SN0OSssIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIMDj6l+c7cD6/1t1tfLrW8zs3fvk797DkhemywgIyBAvIECwgQ7CADMECMgQLyBAsIEOwgIy5wdEfOfzWPZ/9+adNTkteXGvDsO4Sy2/vzAoLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyHg+OLjnl/MLdHOCS/3UwdnT7hj/qcK0lf9TzRzHzaXtYYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQMZ3evvBGfuPF387JbhkkPLO8kfB/8kKC8gQLCBDsIAMwQIyBAvIECwgQ7CAjLmTnzfsana41vNhq+XHOx8s2fttbPxt8ozuO2MzX88v9PwDrbCADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBjxQZ+kzOWYxu8HUyOI/7bvt+Le1iyS1/3zZx8gFZYQIZgARmCBWQIFpAhWECGYAEZggVkCBaQsWJw9LmLcbX9O46O3caPfCXu/MhDv5dMOxscBX44wQIyBAvIECwgQ7CADMECMgQLyBAsIOPx4OiSo703nN+9ZNDukyXf1HMXg8H7N+e8+8CLC+2fGbbCAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CAjLkdRyfPCn87Gjc5ArphvnHDcOP1tS7YNvZ3LrTkrbDCAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CAjD/eftyP3Jxzcs7zubFB2SVP6WLH0f3ToWO/nbuvY/KnbYUFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZN4Ojz+cAnw+eje3QeGfDiODBkg1C7x7Fp3/a8GDP3r6Bk1vXTv52rLCADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBjxY6jk9camxJcvo3qwZIR0LfXWvK2TJ7q/taG39SXFRYQIlhAhmABGYIFZAgWkCFYQIZgARmCBWTcDI5umAM8G5tf3bBX6vk2/vELDbv4u57PlD7/X2OW396XFRYQIlhAhmABGYIFZAgWkCFYQIZgARmPN/CbHJsamxm5u9CPfBQHk4NdG3ZhnBzBu3hKz89gX8IKC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMr43jIpNnhz7yZIJxrHNESe/9yXbOl5Ysrffwdu9Gyd/BXfXssICMgQLyBAsIEOwgAzBAjIEC8gQLCBDsICMxzuOPh8hW/KBYzbc3uQc4Ni+rJMv0vO51rfv8+TtPWeFBWQIFpAhWECGYAEZggVkCBaQIVhAhmABGY93HF2y1+KG8ctJywcL77x9lybflucPcMNms5ODsgdWWECGYAEZggVkCBaQIVhAhmABGYIFZAgWkHGz4+iS87vHBgsPlpz6/XY6dHLsdmz3y/2zxN3pUEfVA/wPggVkCBaQIVhAhmABGYIFZAgWkCFYQMbjHUcvb2JwXO3iQs8t2bzxEztw/s6FJk+xv/jADb+pM4OjwA8nWECGYAEZggVkCBaQIVhAhmABGYIFZNzsOPrc5AzexYUOlo9EPvd85vD5Y98wU3pnbAfdDXOt16ywgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwg42bH0clhvyW7I/I3GTsAfclemstf2g0b3p5ZYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQMbNjqP7p8veTu5NbsM49r+WTzCejX2/z5/S/i09l7PCAjIEC8gQLCBDsIAMwQIyBAvIECwg42YOa/mE0fX/ujA5zTR2MvDze7izfMJow+t3uNb+M8nv7tAKC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMm4GR5fYcF70kmnJsQ38uuOIzy80+YFv3+e7Cy2Z47XCAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CAjO+LebAl59C+HX3cMIZ69namdP83deft+/z2Qudr/cjjyg/sOAr8cIIFZAgWkCFYQIZgARmCBWQIFpAhWEDGzeDo6eN2jwh+Dc7gvb2H58aeXuI2PlkyLbnhpb3zfMjcCgvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjJujqp/vi3h3f9actj6J89v7+0M3uTt3Xn7gZM7cN7ZsJHvhpHmMyssIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvImNtxdHLm8OJay2/v+gMvbLiH820s/343WP6OXbPCAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CAjJvB0e506Pl/Xeg+ig1Pb/Jak9/U2Hn0zy2ZDj2wwgIyBAvIECwgQ7CADMECMgQLyBAsIEOwgIybo+rvpssmZ9LGpmHvbBgsXH6y/PUHfnq2S77EDdda/k2dWWEBGYIFZAgWkCFYQIZgARmCBWQIFpAhWEDGzeDohq0Rr40NFh7cDam+3Rhzw/Dq2du/9/kzf36tOxc7yr690DArLCBDsIAMwQIyBAvIECwgQ7CADMECMm7msA6WnBz7dk5n0uSh0G/v4flR0m+nmfbPnd0Z+8Ut+WlbYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQMbjwdGDDSORkxfaP3M4Zmw69GDJ1oN3NrxLG6Z/v6ywgBDBAjIEC8gQLCBDsIAMwQIyBAvIECwgY25wdLnnw29vDy6+/sC3JwMvmaEd24x0ybTkwYYdZSdZYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQIbB0b/cTdN1Z0qfDzc+n7HcsM1md6Z08n2eZIUFZAgWkCFYQIZgARmCBWQIFpAhWECGYAEZc4OjSwbPPlkyIjg2tHk3sblkx9G3ltze89ds5tPO/+v5r94KC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMh4Pji6ZwRuz/BD2O5MbZk4+wE+WDFKObb46+SN9/sJYYQEZggVkCBaQIVhAhmABGYIFZAgWkCFYQMb38o1AAf7LCgvIECwgQ7CADMECMgQLyBAsIEOwgAzBAjIEC8gQLCBDsIAMwQIyBAvIECwgQ7CADMECMgQLyPgTEwanYgjj78sAAAAASUVORK5CYII=) + +#### 1.安装singularity + +安装singularity, + +具体步骤如下 + +```bash +mkdir -p ~/install +mkdir -p ~/build + +#安装编译所需依赖 +yum -y install libatomic libstdc++ libstdc++-devel libseccomp-devel glib2-devel gcc squashfs-tools tar + +#安装bisheng编译器 +cd ~/build +wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz +tar -C ~/install -xf bisheng-compiler-2.1.0-aarch64-linux.tar.gz +echo "export PATH=$HOME/install/bisheng-compiler-2.1.0-aarch64-linux/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` + +#安装go编译器 +cd ~/build +wget https://go.dev/dl/go1.19.linux-arm64.tar.gz +tar -C ~/install -xf go1.19.linux-arm64.tar.gz +echo "export PATH=$HOME/install/go/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +#安装singularity +cd ~/build +wget https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2.tar.gz +tar -xf singularity-ce-3.10.2.tar.gz +cd singularity-ce-3.10.2 +./mconfig --prefix=$HOME/install/singularity +make -C ./builddir +make -C ./builddir install +echo "export PATH=$HOME/install/singularity/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +``` + +#### 2.构建镜像 + +```shell +# x86 +singularity build ./name-of-image.sif openeuler-gcc-9.3.0-hmpi1-mumps-5.1.2.def +# arm +singularity build ./name-of-image.sif openeuler-bisheng2-hmpi1-mumps-5.1.2.def +# 转换为沙盒 +singularity build --sandbox image-sandbox name-of-image.sif +``` + +#### 3.在沙盒中运行 + +```shell +#进入沙盒 +singularity shell -w image-sandbox +#在沙盒中运行内置的测试案例 +cd /hpcrunner +./jarvis -r +``` diff --git "a/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" "b/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" new file mode 100644 index 0000000..7df8a6b --- /dev/null +++ "b/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" @@ -0,0 +1,1290 @@ +# 《基于openEuler的opencoarrays软件测试报告》 + +## 1.规范性自检 +使用对项目Clang-Format对文件进行格式化 + +Clang-Format是一个广泛使用的C代码格式化器。我们在使用编辑器的缩进(TAB)功能时,由于不同编辑器的差别,有的插入的是制表符,有的是2个空格,有的是4个空格。这样如果别人用另一个编辑器来阅读程序时,可能会由于缩进的不同,导致阅读效果一团糟。为了解决这个问题,使用Clang-Format,它可以自动重新缩进,并手动指定空格的数量,自动格式化源文件。它是可以通过命令行使用,也可以作为插件,在其他IDE中使用。 + +文件格式化配置参考文件`.clang-format`,文件内容如下 + +```clang-format +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + - Regex: '.*' + Priority: 1 + SortPriority: 0 +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentCaseLabels: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +Standard: Latest +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseCRLF: false +UseTab: Never +... +``` + +### 1.1.选择统计文件类型 + +统计项目文件类型及其文件数量 + +使用python编写脚本文件 + +```python +# -*- coding: utf-8 -*- + +import os + +print (os.getcwd()) + +def getAllFiles(targetDir): + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(getAllFiles(path)) + elif os.path.isfile(path): + files.append(path) + return files + +all_files=getAllFiles(os.curdir) +type_dict=dict() + +for each_file in all_files: + if os.path.isdir(each_file): + type_dict.setdefault("文件夹",0) + type_dict["文件夹"]+=1 + else: + ext=os.path.splitext(each_file)[1] + type_dict.setdefault(ext,0) + type_dict[ext]+=1 + +for each_type in type_dict.keys(): + print ("当前文件夹下共有[%s]的文件%d个" %(each_type,type_dict[each_type])) +``` + +在opencoarrays项目根目录下运行,运行结果如下 + +```bash +/root/hpcrunner/tmp/OpenCoarrays-2.10.1 +当前文件夹下共有[]的文件128个 +当前文件夹下共有[.inst]的文件1个 +当前文件夹下共有[.in]的文件10个 +当前文件夹下共有[.ts]的文件101个 +当前文件夹下共有[.x64]的文件2个 +当前文件夹下共有[.md]的文件9个 +当前文件夹下共有[.f90]的文件91个 +当前文件夹下共有[.py]的文件1个 +当前文件夹下共有[.smod]的文件2个 +当前文件夹下共有[.cmake]的文件302个 +当前文件夹下共有[.mod]的文件13个 +当前文件夹下共有[.log]的文件3个 +当前文件夹下共有[.marks]的文件26个 +当前文件夹下共有[.1]的文件2个 +当前文件夹下共有[.3]的文件1个 +当前文件夹下共有[.stamp]的文件11个 +当前文件夹下共有[.out]的文件2个 +当前文件夹下共有[.sh]的文件42个 +当前文件夹下共有[.internal]的文件16个 +当前文件夹下共有[.so]的文件1个 +当前文件夹下共有[.with_modules]的文件1个 +当前文件夹下共有[.diff]的文件1个 +当前文件夹下共有[.pbs]的文件3个 +当前文件夹下共有[.F]的文件1个 +当前文件夹下共有[.sh-usage]的文件7个 +当前文件夹下共有[.bin]的文件5个 +当前文件夹下共有[.check_cache]的文件1个 +当前文件夹下共有[.make]的文件321个 +当前文件夹下共有[.h]的文件3个 +当前文件夹下共有[.F90]的文件40个 +当前文件夹下共有[.o]的文件20个 +当前文件夹下共有[.a]的文件5个 +当前文件夹下共有[.c]的文件10个 +当前文件夹下共有[.d]的文件4个 +当前文件夹下共有[.build]的文件11个 +当前文件夹下共有[.txt]的文件65个 +``` + +主要源码文件后缀名为F,h,c以及部分C语言文件。由此判断该项目主要语言为C++/C。 + +### 1.2.统计源码总行数 + +统计所有源码文件的代码行数 + +```bash +find ./ -regex ".*\.c\|.*\.h|.*\.hpp\|.*\.cpp\|.*\.py\|.*\.sh\|.*\.F90" | xargs wc -l +``` + +统计结果 + +```bash +24788 total +``` + +### 1.3.统计不符合要求的总行数 + +对文件后缀名为c, h, 的所有文件进行格式, 的所有文件进行格式 通过git与clang-format结合的方式进行统计 + +```bash +[root@host-10-208-134-176 OpenCoarrays-2.10.1]# find . -regex '.*\.\(c\|h\)' | xargs clang-format -style=LLVM -i +[root@host-10-208-134-176 OpenCoarrays-2.10.1]# git add . +[root@host-10-208-134-176 OpenCoarrays-2.10.1]# git commit -m "format" +[master fb93b05] format + 12 files changed, 9716 insertions(+), 10912 deletions(-) + rewrite OpenCoarrys/OpenCoarrays-2.10.1/doc/sample-compiler-output.c (75%) + rewrite OpenCoarrys/OpenCoarrays-2.10.1/opencoarrays-build/CMakeFiles/3.23.1/CompilerIdC/CMakeCCompilerId.c (72%) + rewrite OpenCoarrys/OpenCoarrays-2.10.1/src/runtime-libraries/gasnet/gasnet.c (68%) + rewrite OpenCoarrys/OpenCoarrays-2.10.1/src/runtime-libraries/openshmem/openshmem_caf.c (71%) +``` + +### 1.4.统计结果 + +综上信息,项目中代码规范性自检检查结果为 + +通过率 : 55.979% 1-10912/24788*100% + +不通过率 : 44.021% 10912/24788*100% + +## 2.功能性测试 + +### 2.1.所选测试案例 + +opencoarrays内置了大量的单元测试,可以使用其进行单元测试文件内容。 + +单元测试文件列表(部分)如下 + +```bash +[root@host-10-208-134-176 src]# tree tests +tests +├── CMakeLists.txt +├── installation +│   ├── CMakeLists.txt +│   ├── installation-scripts.sh +│   ├── installation-scripts.sh-usage +│   └── test-stack.sh +├── integration +│   ├── CMakeLists.txt +│   ├── coarrayHelloWorld +│   │   ├── CMakeLists.txt +│   │   └── hello_multiverse.F90 +│   ├── dist_transpose +│   │   ├── CMakeLists.txt +│   │   ├── coarray_distributed_transpose.F90 +│   │   ├── Makefile_NS_GASNET +│   │   ├── walltime.o +│   │   └── walltime.x64 +│   ├── events +│   │   ├── async-hello.F90 +│   │   └── CMakeLists.txt +│   └── pde_solvers +│   ├── CMakeLists.txt +│   ├── coarrayBurgers +│   │   ├── CMakeLists.txt +│   │   ├── global_field.F90 +│   │   ├── include-files +│   │   │   ├── cray_capabilities.txt +│   │   │   ├── gfortran4.8_capabilities.txt +│   │   │   ├── gfortran_capabilities.txt +│   │   │   ├── ibm_capabilities.txt +│   │   │   ├── intel_capabilities.txt +│   │   │   ├── nag_capabilities.txt +│   │   │   ├── portlandgroup_capabilities.txt +│   │   │   ├── tau_cray_capabilities.txt +│   │   │   └── tau_intel_capabilities.txt +│   │   ├── library +│   │   │   ├── co_object_interface.F90 +│   │   │   ├── ForTrilinos_assertion_utility.F90 +│   │   │   ├── ForTrilinos_error.F90 +│   │   │   └── object_interface.F90 +│   │   ├── local_field.F90 +│   │   ├── main.F90 +│   │   ├── Makefile.inst +│   │   ├── run.sh +│   │   └── scripts +│   │   ├── coarrayBurgers_cce_multiple.pbs +│   │   ├── coarrayBurgers_cce.pbs +│   │   ├── coarrayBurgers_cce_tau.pbs +│   │   ├── run.sh +│   │   ├── run.sh.with_modules +│   │   └── run_troubleshooting.sh +│   ├── coarrayHeatSimplified +│   │   ├── CMakeLists.txt +│   │   ├── global_field.f90 +│   │   ├── local_field.f90 +│   │   └── main.f90 +│   ├── include-files +│   │   ├── cray_capabilities.txt +│   │   ├── gfortran_capabilities.txt +│   │   ├── ibm_capabilities.txt +│   │   ├── intel_capabilities.txt +│   │   ├── nag_capabilities.txt +│   │   ├── portlandgroup_capabilities.txt +│   │   ├── tau_cray_capabilities.txt +│   │   └── tau_intel_capabilities.txt +│   ├── library +│   │   ├── CMakeLists.txt +│   │   ├── co_object_interface.F90 +│   │   ├── ForTrilinos_assertion_utility.F90 +│   │   ├── ForTrilinos_error.F90 +│   │   ├── object_interface.F90 +│   │   └── parse_command_line.f90 +│   ├── navier-stokes +│   │   ├── CMakeLists.txt +│   │   ├── coarray-shear_coll.F90 +│   │   ├── coarray-shear_coll_lock.f90 +│   │   ├── coarray-shear.f90 +│   │   ├── libfft_avx.a +│   │   ├── libfft_sse.a +│   │   ├── Makefile_NS_GASNET +│   │   ├── mpi-shear.f90 +│   │   └── walltime.o +│   └── README.md +├── performance +│   ├── BurgersMPI +│   │   ├── CMakeLists.txt +│   │   ├── input_file.F90 +│   │   ├── kind_parameters.F90 +│   │   ├── main.F90 +│   │   ├── mpi_module.F90 +│   │   ├── mpi_share.F90 +│   │   ├── periodic_2nd_order.F90 +│   │   └── shared.F90 +│   ├── CMakeLists.txt +│   ├── mpi_dist_transpose +│   │   ├── CMakeLists.txt +│   │   ├── mpi_distributed_transpose.F90 +│   │   ├── walltime.o +│   │   └── walltime.x64 +│   └── psnap +│   ├── cafpsnap.f90 +│   ├── CMakeLists.txt +│   └── timemeasure.c +├── regression +│   ├── CMakeLists.txt +│   └── reported +│   ├── CMakeLists.txt +│   ├── issue-172-wrong-co_reduce.F90 +│   ├── issue-172-wrong-co_reduce-int64.F90 +│   ├── issue-172-wrong-co_reduce-int8.F90 +│   ├── issue-243-source-allocation-no-sync.f90 +│   ├── issue-292-convert-type-before-put.f90 +│   ├── issue-322-non-coarray-vector-idx-lhs.f90 +│   ├── issue-422-send.F90 +│   ├── issue-422-send-get.F90 +│   ├── issue-488-multi-dim-cobounds.f90 +│   ├── issue-493-coindex-slice.f90 +│   ├── issue-503-multidim-array-broadcast.f90 +│   ├── issue-503-non-contig-red-ndarray.f90 +│   ├── issue-511-incorrect-shape.f90 +│   ├── issue-515-mimic-mpi-gatherv.f90 +│   ├── issue-552-send_by_ref-singleton.f90 +│   ├── issue-700-allow-multiple-scalar-dim-array-gets.f90 +│   └── issue-762-mpi-crashing-on-exit.f90 +├── UH_CAF_perf_validation_suite_v1.0.1.txt +├── unit +│   ├── CMakeLists.txt +│   ├── collectives +│   │   ├── CMakeLists.txt +│   │   ├── co_broadcast_allocatable_components.f90 +│   │   ├── co_broadcast_alloc_mixed.f90 +│   │   ├── co_broadcast_derived_type.f90 +│   │   ├── co_broadcast.F90 +│   │   ├── co_max.F90 +│   │   ├── co_min.F90 +│   │   ├── co_reduce.F90 +│   │   ├── co_reduce_res_im.F90 +│   │   ├── co_reduce_string.f90 +│   │   └── co_sum.F90 +│   ├── events +│   │   ├── allocatable_p2p_event_post.f90 +│   │   ├── CMakeLists.txt +│   │   └── static_event_post_issue_293.f90 +│   ├── extensions +│   │   └── CMakeLists.txt +│   ├── fail_images +│   │   ├── CMakeLists.txt +│   │   ├── image_fail_and_failed_images_test_1.f90 +│   │   ├── image_fail_and_get_test_1.f90 +│   │   ├── image_fail_and_status_test_1.f90 +│   │   ├── image_fail_and_stopped_images_test_1.f90 +│   │   ├── image_fail_and_sync_test_1.f90 +│   │   ├── image_fail_and_sync_test_2.f90 +│   │   ├── image_fail_and_sync_test_3.f90 +│   │   ├── image_fail_test_1.f90 +│   │   └── image_status_test_1.f90 +│   ├── init_register +│   │   ├── allocate_as_barrier.f90 +│   │   ├── allocate_as_barrier_proc.f90 +│   │   ├── async_comp_alloc_2.f90 +│   │   ├── async_comp_alloc.f90 +│   │   ├── CMakeLists.txt +│   │   ├── comp_allocated_1.f90 +│   │   ├── comp_allocated_2.f90 +│   │   ├── initialize_mpi.F90 +│   │   ├── register_alloc_comp_1.f90 +│   │   ├── register_alloc_comp_2.f90 +│   │   ├── register_alloc_comp_3.f90 +│   │   ├── register_alloc_vector.f90 +│   │   ├── register.f90 +│   │   └── register_vector.f90 +│   ├── send-get +│   │   ├── alloc_comp_get_convert_nums.f90 +│   │   ├── alloc_comp_multidim_shape.F90 +│   │   ├── alloc_comp_send_convert_nums.f90 +│   │   ├── CMakeLists.txt +│   │   ├── get_array_test.f90 +│   │   ├── get_convert_char_array.f90 +│   │   ├── get_convert_nums.f90 +│   │   ├── get_static_array.f90 +│   │   ├── get_with_offset_1d.f90 +│   │   ├── get_with_vector_index.f90 +│   │   ├── old_get_array_test.f90 +│   │   ├── sameloc.f90 +│   │   ├── send_array_test.f90 +│   │   ├── send_convert_char_array.f90 +│   │   ├── send_convert_nums.f90 +│   │   ├── sendget_convert_char_array.f90 +│   │   ├── sendget_convert_nums.f90 +│   │   ├── send-strided-self.f90 +│   │   ├── send_with_vector_index.f90 +│   │   ├── strided_get.f90 +│   │   ├── strided_sendget.f90 +│   │   └── whole_get_array.f90 +│   ├── simple +│   │   ├── CMakeLists.txt +│   │   ├── increment_neighbor.f90 +│   │   ├── random_init.f90 +│   │   ├── syncimages2.c +│   │   └── testAtomics.f90 +│   ├── sync +│   │   ├── CMakeLists.txt +│   │   ├── duplicate_syncimages.f90 +│   │   ├── syncall.f90 +│   │   ├── sync_image_ring_abort_on_stopped_image.f90 +│   │   ├── syncimages2.f90 +│   │   ├── syncimages.f90 +│   │   └── syncimages_status.f90 +│   └── teams +│   ├── CMakeLists.txt +│   ├── get-communicator.F90 +│   ├── sync-team.f90 +│   ├── team-number.f90 +│   ├── teams_coarray_get_by_ref.f90 +│   ├── teams_coarray_get.f90 +│   ├── teams_coarray_send_by_ref.f90 +│   ├── teams_coarray_send.f90 +│   ├── teams_coarray_sendget.f90 +│   ├── teams_send.f90 +│   └── teams_subset.f90 +└── utilities + ├── CMakeLists.txt + ├── oc_assertions_implementation.F90 + ├── oc_assertions_interface.F90 + └── opencoarrays_object_interface.f90 +``` + +在项目根目录下执行命令来运行单元测试和确定性测试 + +```bash + export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && ctest --output-on-failure --repeat-until-fail 1 --timeout 200 +``` + +### 2.2.运行结果 + +```bash +Test project /root/hpcrunner/tmp/OpenCoarrays-2.10.1/opencoarrays-build + Start 1: initialize_mpi + 1/81 Test #1: initialize_mpi ................................... Passed 0.13 sec + Start 2: register + 2/81 Test #2: register ......................................... Passed 0.12 sec + Start 3: register_vector + 3/81 Test #3: register_vector .................................. Passed 0.12 sec + Start 4: register_alloc_vector + 4/81 Test #4: register_alloc_vector ............................ Passed 0.12 sec + Start 5: allocate_as_barrier + 5/81 Test #5: allocate_as_barrier .............................. Passed 1.12 sec + Start 6: allocate_as_barrier_proc + 6/81 Test #6: allocate_as_barrier_proc ......................... Passed 1.13 sec + Start 7: register_alloc_comp_1 + 7/81 Test #7: register_alloc_comp_1 ............................ Passed 0.12 sec + Start 8: register_alloc_comp_2 + 8/81 Test #8: register_alloc_comp_2 ............................ Passed 0.12 sec + Start 9: register_alloc_comp_3 + 9/81 Test #9: register_alloc_comp_3 ............................ Passed 0.12 sec + Start 10: async_comp_alloc +10/81 Test #10: async_comp_alloc ................................. Passed 0.13 sec + Start 11: async_comp_alloc_2 +11/81 Test #11: async_comp_alloc_2 ............................... Passed 0.12 sec + Start 12: comp_allocated_1 +12/81 Test #12: comp_allocated_1 ................................. Passed 0.12 sec + Start 13: comp_allocated_2 +13/81 Test #13: comp_allocated_2 ................................. Passed 0.12 sec + Start 14: alloc_comp_get_convert_nums +14/81 Test #14: alloc_comp_get_convert_nums ...................... Passed 0.13 sec + Start 15: team_number +15/81 Test #15: team_number ...................................... Passed 0.13 sec + Start 16: teams_subset +16/81 Test #16: teams_subset ..................................... Passed 0.12 sec + Start 17: get_communicator +17/81 Test #17: get_communicator ................................. Passed 0.12 sec + Start 18: teams_coarray_get +18/81 Test #18: teams_coarray_get ................................ Passed 0.13 sec + Start 19: teams_coarray_get_by_ref +19/81 Test #19: teams_coarray_get_by_ref ......................... Passed 0.13 sec + Start 20: teams_coarray_send +20/81 Test #20: teams_coarray_send ............................... Passed 0.13 sec + Start 21: teams_coarray_send_by_ref +21/81 Test #21: teams_coarray_send_by_ref ........................ Passed 0.13 sec + Start 22: teams_coarray_sendget +22/81 Test #22: teams_coarray_sendget ............................ Passed 0.13 sec + Start 23: sync_team +23/81 Test #23: sync_team ........................................ Passed 0.13 sec + Start 24: alloc_comp_multidim_shape +24/81 Test #24: alloc_comp_multidim_shape ........................ Passed 0.51 sec + Start 25: send_convert_nums +25/81 Test #25: send_convert_nums ................................ Passed 0.13 sec + Start 26: sendget_convert_nums +26/81 Test #26: sendget_convert_nums ............................. Passed 0.13 sec + Start 27: sendget_convert_char_array +27/81 Test #27: sendget_convert_char_array ....................... Passed 0.13 sec + Start 28: send_convert_char_array +28/81 Test #28: send_convert_char_array .......................... Passed 0.12 sec + Start 29: alloc_comp_send_convert_nums +29/81 Test #29: alloc_comp_send_convert_nums ..................... Passed 0.13 sec + Start 30: get_array +30/81 Test #30: get_array ........................................ Passed 0.96 sec + Start 31: get_self +31/81 Test #31: get_self ......................................... Passed 0.13 sec + Start 32: get_convert_nums +32/81 Test #32: get_convert_nums ................................. Passed 0.13 sec + Start 33: get_convert_char_array +33/81 Test #33: get_convert_char_array ........................... Passed 0.12 sec + Start 34: get_with_offset_1d +34/81 Test #34: get_with_offset_1d ............................... Passed 0.12 sec + Start 35: whole_get_array +35/81 Test #35: whole_get_array .................................. Passed 0.13 sec + Start 36: strided_get +36/81 Test #36: strided_get ...................................... Passed 0.13 sec + Start 37: get_static_array +37/81 Test #37: get_static_array ................................. Passed 0.12 sec + Start 38: send_array +38/81 Test #38: send_array ....................................... Passed 0.99 sec + Start 39: convert-before-put +39/81 Test #39: convert-before-put ............................... Passed 0.12 sec + Start 40: send_with_vector_index +40/81 Test #40: send_with_vector_index ........................... Passed 0.13 sec + Start 41: strided_sendget +41/81 Test #41: strided_sendget .................................. Passed 0.13 sec + Start 42: get_with_vector_index +42/81 Test #42: get_with_vector_index ............................ Passed 0.13 sec + Start 43: co_sum +43/81 Test #43: co_sum ........................................... Passed 0.13 sec + Start 44: co_broadcast +44/81 Test #44: co_broadcast ..................................... Passed 0.13 sec + Start 45: co_broadcast_derived_type +45/81 Test #45: co_broadcast_derived_type ........................ Passed 0.12 sec + Start 46: co_min +46/81 Test #46: co_min ........................................... Passed 0.13 sec + Start 47: co_max +47/81 Test #47: co_max ........................................... Passed 0.12 sec + Start 48: co_reduce +48/81 Test #48: co_reduce ........................................ Passed 0.13 sec + Start 49: co_reduce_res_im +49/81 Test #49: co_reduce_res_im ................................. Passed 0.13 sec + Start 50: co_reduce_string +50/81 Test #50: co_reduce_string ................................. Passed 0.13 sec + Start 51: syncimages_status +51/81 Test #51: syncimages_status ................................ Passed 0.13 sec + Start 52: sync_ring_abort_np3 +52/81 Test #52: sync_ring_abort_np3 .............................. Passed 0.12 sec + Start 53: sync_ring_abort_np7 +53/81 Test #53: sync_ring_abort_np7 .............................. Passed 0.13 sec + Start 54: simpleatomics +54/81 Test #54: simpleatomics .................................... Passed 0.13 sec + Start 55: syncall +55/81 Test #55: syncall .......................................... Passed 1.14 sec + Start 56: syncimages +56/81 Test #56: syncimages ....................................... Passed 0.14 sec + Start 57: syncimages2 +57/81 Test #57: syncimages2 ...................................... Passed 0.13 sec + Start 58: duplicate_syncimages +58/81 Test #58: duplicate_syncimages ............................. Passed 0.14 sec + Start 59: hello_multiverse +59/81 Test #59: hello_multiverse ................................. Passed 0.13 sec + Start 60: coarray_burgers_pde +60/81 Test #60: coarray_burgers_pde .............................. Passed 0.25 sec + Start 61: co_heat +61/81 Test #61: co_heat .......................................... Passed 0.61 sec + Start 62: asynchronous_hello_world +62/81 Test #62: asynchronous_hello_world ......................... Passed 0.13 sec + Start 63: source-alloc-no-sync +63/81 Test #63: source-alloc-no-sync ............................. Passed 0.14 sec + Start 64: put-allocatable-coarray-comp +64/81 Test #64: put-allocatable-coarray-comp ..................... Passed 0.13 sec + Start 65: get-put-allocatable-comp +65/81 Test #65: get-put-allocatable-comp ......................... Passed 0.12 sec + Start 66: allocatable_p2p_event_post +66/81 Test #66: allocatable_p2p_event_post ....................... Passed 0.12 sec + Start 67: static_event_post_issue_293 +67/81 Test #67: static_event_post_issue_293 ...................... Passed 0.12 sec + Start 68: co_reduce-factorial +68/81 Test #68: co_reduce-factorial .............................. Passed 0.13 sec + Start 69: co_reduce-factorial-int8 +69/81 Test #69: co_reduce-factorial-int8 ......................... Passed 0.13 sec + Start 70: co_reduce-factorial-int64 +70/81 Test #70: co_reduce-factorial-int64 ........................ Passed 0.13 sec + Start 71: issue-493-coindex-slice +71/81 Test #71: issue-493-coindex-slice .......................... Passed 0.14 sec + Start 72: issue-488-multi-dim-cobounds-true +72/81 Test #72: issue-488-multi-dim-cobounds-true ................ Passed 0.14 sec + Start 73: issue-488-multi-dim-cobounds-false +73/81 Test #73: issue-488-multi-dim-cobounds-false ............... Passed 0.14 sec + Start 74: issue-503-multidim-array-broadcast +74/81 Test #74: issue-503-multidim-array-broadcast ............... Passed 0.13 sec + Start 75: issue-503-non-contig-red-ndarray +75/81 Test #75: issue-503-non-contig-red-ndarray ................. Passed 0.14 sec + Start 76: issue-552-send_by_ref-singleton +76/81 Test #76: issue-552-send_by_ref-singleton .................. Passed 0.13 sec + Start 77: issue-511-incorrect-shape +77/81 Test #77: issue-511-incorrect-shape ........................ Passed 0.12 sec + Start 78: issue-515-mimic-mpi-gatherv +78/81 Test #78: issue-515-mimic-mpi-gatherv ...................... Passed 0.12 sec + Start 79: issue-700-allow-multiple-scalar-dim-array-gets +79/81 Test #79: issue-700-allow-multiple-scalar-dim-array-gets ... Passed 0.12 sec + Start 80: issue-762-mpi-crashing-on-exit +80/81 Test #80: issue-762-mpi-crashing-on-exit ................... Passed 0.12 sec + Start 81: test-installation-scripts.sh +81/81 Test #81: test-installation-scripts.sh ..................... Passed 0.36 sec + +100% tests passed, 0 tests failed out of 81 +``` + +测试结果 + +单元测试运行正常,说明各类型函数和功能都响应正常。测试通过。 + +## 3.性能测试 + +### 3.1.测试平台信息对比 + +| | arm信息 | x86信息 | +| -------- | -------------------------------- | --------------------- | +| 操作系统 | openEuler 22.03 (LTS) | openEuler 22.03 (LTS) | +| 内核版本 | 4.19.90-2012.4.0.0053.oe1.aarch64 | 4.19.90-2109.1.0.0108.oe1.x86_64 | + +### 3.2.测试软件环境信息对比 + +| | arm信息 | x86信息 | +| --- | ------------- | --------- | +| gcc | kgcc 9.3.1 | gcc 9.3.0 | +| mpi | openmpi 4.1.2 | openmpi 4.1.2 | +| cmake | 3.23.1 | 3.23.1 | +| opencoarrays | 2.10.1 | 2.10.1 | + + +### 3.3.测试硬件性能信息对比 + +| | arm信息 | x86信息 | +| ------ | ----------- | -------- | +| cpu | Kunpeng 920 | | +| 核心数 | 16 | 4 | +| 内存 | 32 GB | 8 GB | +| 磁盘io | 1.3 GB/s | 400 MB/s | +| 虚拟化 | KVM | KVM | + +### 3.4.测试选择的案例 + +src/tests下的performance目录,它包含BurgersMPI, mpi_dist_transpose, psnap. + +```bash +[root@host-10-208-134-176 BurgersMPI]# ls +CMakeLists.txt input_file.F90 kind kind_parameters.mod mpi_module.F90 periodic_2nd_order.F90 +input input_file.mod kind_parameters.F90 main.F90 mpi_share.F90 shared.F90 +``` + +```bash +[root@host-10-208-134-176 psnap]# ls +cafpsnap.f90 CMakeLists.txt timemeasure.c +``` + +```bash +[root@host-10-208-134-176 mpi_dist_transpose]# ls +CMakeLists.txt mpi_distributed_transpose.F90 walltime.o walltime.x64 +``` + +### 3.5.单线程 + +单线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ---------- | -------- | +| 实际CPU时间 | 0m0.004s | 0m0.050s | +| 用户时间 | 0m0.0018s | 0m0.040s | + +### 3.6.多线程 + +多线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ---------- | --------- | +| 线程数 | 4 | 4 | +| 实际CPU时间 | 0m0.004s | 0m0.055s | +| 用户时间 | 0m0.0016s | 0m0.009s | + +arm多线程时间耗费数据表: + +| 线程 | 1 | 2 | 3 | 4 | +| :------------ | -------- | ------- | ------- | -------- | +| 用户时间(s) | 0m0.004s | 0m0.004s | 0m0.004s | 0m0.004s | +| 用户态时间(s) | 0m0.0018s | 0m0.0022s | 0m0.003s | 0m0.0016s | +| 内核态时间(s) | 0m0.0016s | 0m0.0016s | 0m0.000s | 0m0.0024s | + +x86多线程时间耗费数据表: + +| 线程 | 1 | 2 | 3 | 4 | +| --------------- | ------ | ------ | ------- | ------- | +| 用户时间 (s) | 0m0.050s | 0m0.052s | 0m0.053s | 0m0.055s | +| 用户态时间(s) | 0m0.009s | 0m0.010s | 0m0.011s | 0m0.015s | +| 内核态时间(s) | 0m0.040s | 0m0.038s | 0m0.042s | 0m0.040s | + +由上表可知,在线程逐渐增加的情况下,用户时间线性减少,线程数增加后,用户态时间增多,内核态时间并未显著下降。 + +### 3.9.测试总结 + +性能测试arm平台与x86平台相差较多,且随着线程数的增加,两个平台的对于同一个应用的所耗费的时间差距逐渐减少。 + +且线程增加并不会过多减少应用的实际耗费时间,在合理的范围内分配线程数才能更好的利用算力资源。 + +## 4.精度测试 + +### 4.1.所选测试案例 + +选择OpenCoarrays-2.10.1中send-get目录下的测试用例。 + +```bash +!! Thoroughly test get, i.e. foo = bar[N] in all variants +!! +!! Do simple tests for get(). These test comprise +!! +!! FOO = BAR [N] +!! +!! where +!! +!! FOO BAR images +!! scalar scalar N == me +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! array(1:5) scalar +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! array(1:5) array(1:5) +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! array(1:3) array(::2) +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! array(4:5) array(2::2) +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! array(1:3) array(3:1:-1) +!! int(k e [1,4]) int(k e [1,4]) +!! real(k e [4,8]) real(k e [4,8]) +!! int(k e [1,4]) real(k e [4,8]) +!! real(k e [4,8]) int(k e [1,4]) +!! +!! all of the above but for N != me +!! +!! And may be some other, I've forgotten. +!! +!! Author: Andre Vehreschild, 2017 + +program get_convert_nums + + implicit none + + real(kind=4), parameter :: tolerance4 = 1.0e-4 + real(kind=8), parameter :: tolerance4to8 = 1.0E-4 + real(kind=8), parameter :: tolerance8 = 1.0E-6 + + type t + integer(kind=1), allocatable :: int_scal_k1 + integer(kind=4), allocatable :: int_scal_k4 + real(kind=4) , allocatable :: real_scal_k4 + real(kind=8) , allocatable :: real_scal_k8 + integer(kind=1), allocatable, dimension(:) :: int_k1 + integer(kind=4), allocatable, dimension(:) :: int_k4 + real(kind=4) , allocatable, dimension(:) :: real_k4 + real(kind=8) , allocatable, dimension(:) :: real_k8 + end type t + + integer(kind=1) :: int_scal_k1 + integer(kind=4) :: int_scal_k4 + real(kind=4) :: real_scal_k4 + real(kind=8) :: real_scal_k8 + + integer(kind=1), dimension(1:5) :: int_k1 + integer(kind=4), dimension(1:5) :: int_k4 + real(kind=4) , dimension(1:5) :: real_k4 + real(kind=8) , dimension(1:5) :: real_k8 + + type(t), save, codimension[*] :: obj + + logical :: error_printed=.false. + + associate(me => this_image(), np => num_images()) + if (np < 2) error stop 'Can not run with less than 2 images.' + + allocate(obj%int_scal_k1, SOURCE=INT(42, 1)) ! allocate syncs here + allocate(obj%int_scal_k4, SOURCE=42) ! allocate syncs here + allocate(obj%int_k1(5), SOURCE=INT([ 5, 4, 3, 2, 1], 1)) ! allocate syncs here + allocate(obj%int_k4(5), SOURCE=[ 5, 4, 3, 2, 1]) ! allocate syncs here + + allocate(obj%real_scal_k4, SOURCE=37.042) ! allocate syncs here + allocate(obj%real_scal_k8, SOURCE=REAL(37.042, 8)) ! allocate syncs here + allocate(obj%real_k4(1:5), SOURCE=[ 5.1, 4.2, 3.3, 2.4, 1.5]) ! allocate syncs here + allocate(obj%real_k8(1:5), SOURCE=REAL([ 5.1, 4.2, 3.3, 2.4, 1.5], 8)) ! allocate syncs here + + ! First check send/copy to self + if (me == 1) then + int_scal_k1 = obj[1]%int_scal_k1 + print *, int_scal_k1 + if (obj%int_scal_k1 /= int_scal_k1) call print_and_register('get scalar int kind=1 from kind=1 self failed.') + + int_scal_k4 = obj[1]%int_scal_k4 + print *, int_scal_k4 + if (obj%int_scal_k4 /= int_scal_k4) call print_and_register( 'get scalar int kind=4 to kind=4 self failed.') + + int_scal_k4 = obj[1]%int_scal_k1 + print *, int_scal_k4 + if (obj%int_scal_k4 /= int_scal_k4) call print_and_register( 'get scalar int kind=1 to kind=4 self failed.') + + int_scal_k1 = obj[1]%int_scal_k4 + print *, int_scal_k1 + if (obj%int_scal_k1 /= int_scal_k1) call print_and_register( 'get scalar int kind=4 to kind=1 self failed.') + + int_k1(:) = obj[1]%int_k1(:) + print *, int_k1 + if (any(obj%int_k1 /= int_k1)) call print_and_register( 'get int kind=1 to kind=1 self failed.') + + int_k4(:) = obj[1]%int_k4(:) + print *, int_k4 + if (any(obj%int_k4 /= int_k4)) call print_and_register( 'get int kind=4 to kind=4 self failed.') + + int_k4(:) = obj[1]%int_k1(:) + print *, int_k4 + if (any(obj%int_k4 /= int_k4)) call print_and_register( 'get int kind=1 to kind=4 self failed.') + + int_k1(:) = obj[1]%int_k4(:) + print *, int_k1 + if (any(obj%int_k1 /= int_k1)) call print_and_register( 'get int kind=4 to kind=1 self failed.') + else if (me == 2) then ! Do the real copy to self checks on image 2 + real_scal_k4 = obj[2]%real_scal_k4 + print *, real_scal_k4 + if (abs(obj%real_scal_k4 - real_scal_k4) > tolerance4) & + call print_and_register( 'get scalar real kind=4 to kind=4 self failed.') + + + real_scal_k8 = obj[2]%real_scal_k8 + print *, real_scal_k8 + if (abs(obj%real_scal_k8 - real_scal_k8) > tolerance8) & + call print_and_register( 'get scalar real kind=8 to kind=8 self failed.') + + + real_scal_k8 = obj[2]%real_scal_k4 + print *, real_scal_k8 + if (abs(obj%real_scal_k8 - real_scal_k8) > tolerance4to8) & + call print_and_register( 'get scalar real kind=4 to kind=8 self failed.') + + + real_scal_k4 = obj[2]%real_scal_k8 + print *, real_scal_k4 + if (abs(obj%real_scal_k4 - real_scal_k4) > tolerance4) & + call print_and_register( 'get scalar real kind=8 to kind=4 self failed.') + + real_k4(:) = obj[2]%real_k4(:) + print *, real_k4 + if (any(abs(obj%real_k4 - real_k4) > tolerance4)) call print_and_register( 'get real kind=4 to kind=4 self failed.') + + real_k8(:) = obj[2]%real_k8(:) + print *, real_k8 + if (any(abs(obj%real_k8 - real_k8) > tolerance8)) call print_and_register( 'get real kind=8 to kind=8 self failed.') + + real_k8(:) = obj[2]%real_k4(:) + print *, real_k8 + if (any(abs(obj%real_k8 - real_k8) > tolerance4to8)) call print_and_register( 'get real kind=4 to kind=8 self failed.') + + real_k4(:) = obj[2]%real_k8(:) + print *, real_k4 + if (any(abs(obj%real_k4 - real_k4) > tolerance4)) call print_and_register( 'get real kind=8 to kind=4 self failed.') + end if + + sync all + if (me == 1) then + int_scal_k1 = obj[2]%int_scal_k1 + print *, int_scal_k1 + if (obj%int_scal_k1 /= int_scal_k1) call print_and_register( 'get scalar int kind=1 to kind=1 to image 2 failed.') + + int_scal_k4 = obj[2]%int_scal_k4 + print *, int_scal_k4 + if (obj%int_scal_k4 /= int_scal_k4) call print_and_register( 'get scalar int kind=4 to kind=4 to image 2 failed.') + + int_k1(:) = obj[2]%int_k1(:) + print *, int_k1 + if (any(obj%int_k1 /= int_k1)) call print_and_register( 'get int kind=1 to kind=1 to image 2 failed.') + + int_k4(:) = obj[2]%int_k4(:) + print *, int_k4 + if (any(obj%int_k4 /= int_k4)) call print_and_register( 'get int kind=4 to kind=4 to image 2 failed.') + + else if (me == 2) then + real_scal_k4 = obj[1]%real_scal_k4 + print *, real_scal_k4 + if (abs(obj%real_scal_k4 - real_scal_k4) > tolerance4) & + call print_and_register( 'get scalar real kind=4 to kind=4 to image 2 failed.') + + real_scal_k8 = obj[1]%real_scal_k8 + print *, real_scal_k8 + if (abs(obj%real_scal_k8 - real_scal_k8) > tolerance8) & + call print_and_register( 'get scalar real kind=8 to kind=8 to image 2 failed.') + + real_k4(:) = obj[1]%real_k4(:) + print *, real_k4 + if (any(abs(obj%real_k4 - real_k4) > tolerance4)) call print_and_register( 'get real kind=4 to kind=4 to image 2 failed.') + + real_k8(:) = obj[1]%real_k8(:) + print *, real_k8 + if (any(abs(obj%real_k8 - real_k8) > tolerance8)) call print_and_register( 'get real kind=8 to kind=8 to image 2 failed.') + end if + + sync all + if (me == 1) then + int_scal_k4 = obj[2]%int_scal_k1 + print *, int_scal_k4 + if (obj%int_scal_k4 /= int_scal_k4) call print_and_register( 'get scalar int kind=1 to kind=4 to image 2 failed.') + + int_scal_k1 = obj[2]%int_scal_k4 + print *, int_scal_k1 + if (obj%int_scal_k1 /= int_scal_k1) call print_and_register( 'get scalar int kind=4 to kind=1 to image 2 failed.') + + int_k4(:) = obj[2]%int_k1(:) + print *, int_k4 + if (any(obj%int_k4 /= int_k4)) call print_and_register( 'get int kind=1 to kind=4 to image 2 failed.') + + int_k1(:) = obj[2]%int_k4(:) + print *, int_k1 + if (any(obj%int_k1 /= int_k1)) call print_and_register( 'get int kind=4 to kind=1 to image 2 failed.') + + elseif (me == 2) then + real_scal_k8 = obj[1]%real_scal_k4 + print *, real_scal_k8 + if (abs(obj%real_scal_k8 - real_scal_k8) > tolerance4to8) & + call print_and_register( 'get scalar real kind=4 to kind=8 to image 2 failed.') + + real_scal_k4 = obj[1]%real_scal_k8 + print *, real_scal_k4 + if (abs(obj%real_scal_k4 - real_scal_k4) > tolerance4) & + call print_and_register( 'get scalar real kind=8 to kind=4 to image 2 failed.') + + real_k8(:) = obj[1]%real_k4(:) + print *, real_k8 + if (any(abs(obj%real_k8 - real_k8) > tolerance4to8)) & + call print_and_register( 'get real kind=4 to kind=8 to image 2 failed.') + + real_k4(:) = obj[1]%real_k8(:) + print *, real_k4 + if (any(abs(obj%real_k4 - real_k4) > tolerance4)) call print_and_register( 'get real kind=8 to kind=4 to image 2 failed.') + end if + + ! Scalar to array replication + sync all + if (me == 1) then + int_k4(:) = obj[2]%int_scal_k4 + print *, int_k4 + if (any(obj%int_scal_k4 /= int_k4)) call print_and_register( 'get int scal kind=4 to array kind=4 to image 2 failed.') + + int_k1(:) = obj[2]%int_scal_k1 + print *, int_k1 + if (any(obj%int_scal_k1 /= int_k1)) call print_and_register( 'get int scal kind=1 to array kind=1 to image 2 failed.') + + else if (me == 2) then + real_k8(:) = obj[1]%real_scal_k8 + print *, real_k8 + if (any(abs(obj%real_scal_k8 - real_k8) > tolerance8)) & + call print_and_register( 'get real kind=8 to array kind=8 to image 2 failed.') + + real_k4(:) = obj[1]%real_scal_k4 + print *, real_k4 + if (any(abs(obj%real_scal_k4 - real_k4) > tolerance4)) & + call print_and_register( 'get real kind=4 to array kind=4 to image 2 failed.') + end if + + ! and with kind conversion + sync all + if (me == 1) then + int_k4(:) = obj[2]%int_scal_k1 + print *, int_k4 + if (any(obj%int_scal_k4 /= int_k4)) call print_and_register( 'get int scal kind=1 to array kind=4 to image 2 failed.') + + int_k1(:) = obj[2]%int_scal_k4 + print *, int_k1 + if (any(obj%int_scal_k1 /= int_k1)) call print_and_register( 'get int scal kind=4 to array kind=1 to image 2 failed.') + + else if (me == 2) then + real_k8(:) = obj[1]%real_scal_k4 + print *, real_k8 + if (any(abs(obj%real_scal_k8 - real_k8) > tolerance8)) & + call print_and_register( 'get real kind=4 to array kind=8 to image 2 failed.') + + real_k4(:) = obj[1]%real_scal_k8 + print *, real_k4 + if (any(abs(obj%real_scal_k4 - real_k4) > tolerance4)) & + call print_and_register( 'get real kind=8 to array kind=4 to image 2 failed.') + end if + + ! and with type conversion + sync all + if (me == 1) then + int_k4(:) = obj[2]%real_scal_k4 + print *, int_k4 + if (any(int_k4 /= INT(obj%real_scal_k4, 4))) & + call print_and_register( 'get real scal kind=4 to int array kind=4 to image 2 failed.') + + int_k1(:) = obj[2]%real_scal_k4 + print *, int_k1 + if (any(int_k1 /= INT(obj%real_scal_k4, 1))) & + call print_and_register( 'get real scal kind=1 to int array kind=1 to image 2 failed.') + + else if (me == 2) then + real_k8(:) = obj[1]%int_scal_k4 + print *, real_k8 + if (any(abs(real_k8 - obj%int_scal_k4) > tolerance4to8)) & + call print_and_register( 'get int kind=4 to real array kind=8 to image 2 failed.') + + + real_k4(:) = obj[1]%int_scal_k4 + print *, real_k4 + if (any(abs(real_k4 - obj%int_scal_k4) > tolerance4)) & + call print_and_register( 'get int kind=4 to real array kind=4 to image 2 failed.') + end if + + sync all + + ! Now with strides + + ! Transfer to other image now. + sync all + int_k4 = -1 + int_k1 = INT(-1, 1) + real_k8 = -1.0 + real_k4 = REAL(-1.0, 4) + + sync all + if (me == 1) then + int_k4(1:3) = obj[2]%int_k4(::2) + print *, int_k4 + if (any(int_k4 /= [obj%int_k4(1), obj%int_k4(3), obj%int_k4(5), -1, -1])) & + & call print_and_register( 'strided get int kind=4 to kind=4 to image 2 failed.') + + int_k1(3:5) = obj[2]%int_k1(::2) + print *, int_k1 + if (any(int_k1 /= [INT(-1, 1), INT(-1, 1), obj%int_k1(1), obj%int_k1(3), obj%int_k1(5)])) & + & call print_and_register( 'strided get int kind=1 to kind=1 to image 2 failed.') + + real_k8(1:3) = obj[2]%real_k8(::2) + print *, real_k8 + if (any(abs(real_k8 - [obj%real_k8(1), obj%real_k8(3), obj%real_k8(5), REAL(-1.0, 8), REAL(-1.0, 8)]) > tolerance8)) & + & call print_and_register( 'strided get real kind=8 to kind=8 to image 2 failed.') + + real_k4(3:5) = obj[2]%real_k4(::2) + print *, real_k4 + if (any(abs(real_k4 - [-1.0, -1.0, obj%real_k4(1), obj%real_k4(3), obj%real_k4(5)]) > tolerance4)) & + & call print_and_register( 'strided get real kind=4 to kind=4 to image 2 failed.') + end if + + ! now with strides and kind conversion + sync all + int_k4 = -1 + int_k1 = -1 + real_k4 = -1.0 + real_k8 = -1.0 + obj%int_k4 = [105, 104, 103, 102, 101] + obj%int_k1 = INT([15, 14, 13, 12, 11], 1) + obj%real_k8 = [5.1, 4.2, 3.3, 2.4, 1.5] + obj%real_k4 = REAL([-5.1, -4.2, -3.3, -2.4, -1.5], 4) + sync all + if (me == 1) then + int_k4(1:3) = obj[2]%int_k1(::2) + print *, int_k4 + if (any(int_k4 /= [15, 13, 11, -1, -1])) call print_and_register( 'strided get int kind=1 to kind=4 to image 2 failed.') + + int_k1(1:3) = obj[2]%int_k4(::2) + print *, int_k1 + if (any(int_k1 /= INT([105, 103, 101, -1, -1], 1))) & + & call print_and_register( 'strided get int kind=4 to kind=1 to image 2 failed.') + + real_k8(1:3) = obj[2]%real_k4(::2) + print *, real_k8 + if (any(abs(real_k8 - [-5.1, -3.3, -1.5, -1.0, -1.0]) > tolerance8)) & + & call print_and_register( 'strided get real kind=4 to kind=8 to image 2 failed.') + + real_k4(1:3) = obj[2]%real_k8(::2) + print *, real_k4 + if (any(abs(real_k4 - REAL([5.1, 3.3, 1.5, -1.0, -1.0], 4)) > tolerance4)) & + & call print_and_register( 'strided get real kind=8 to kind=4 to image 2 failed.') + + else if (me == 2) then + ! now with strides and type conversion + int_k4(1:3) = obj[1]%real_k8(::2) + print *, int_k4 + if (any(int_k4 /= [5, 3, 1, -1, -1])) call print_and_register( 'strided get real kind=4 to int kind=4 to image 2 failed.') + + int_k1(1:3) = obj[1]%real_k4(::2) + print *, int_k1 + if (any(int_k1 /= INT([-5, -3, -1, -1, -1], 1))) & + & call print_and_register( 'strided get real kind=4 to int kind=1 to image 2 failed.') + + real_k8(1:3) = obj[1]%int_k4(::2) + print *, real_k8 + if (any(abs(real_k8 - [105.0, 103.0, 101.0, -1.0, -1.0]) > tolerance8)) & + & call print_and_register( 'strided get int kind=4 to real kind=8 to image 2 failed.') + + real_k4(1:3) = obj[1]%int_k1(::2) + print *, real_k4 + if (any(abs(real_k4 - [15.0, 13.0, 11.0, -1.0, -1.0]) > tolerance4)) & + & call print_and_register( 'strided get int kind=1 to real kind=4 to image 2 failed.') + end if + + if (error_printed) error stop + if (me==2) sync images(1) + if (me==1) then + sync images(2) + print *, "Test passed." + end if + end associate + + +contains + + subroutine print_and_register(error_message) + use iso_fortran_env, only : error_unit + character(len=*), intent(in) :: error_message + write(error_unit,*) error_message + error_printed=.true. + end subroutine + +end program get_convert_nums + +! vim:ts=2:sts=2:sw=2: +``` + +```bash +cafrun -np 2 alloc_comp_get_convert_nums +Test passed. +``` + +```bash +program comp_allocated_1 + + implicit none + integer, parameter :: success = 0 + type :: subType + real, allocatable :: r_comp + end type + + type :: T + type(subType), dimension(:), allocatable :: arr + end type + + type(T), codimension[*] :: obj + + call assert(num_images() .GE. 2, 'Need at least two images.') + + associate(me => this_image()) + if (me == 1) then + call assert(.NOT. allocated(obj[2]%arr), 'obj%arr on image 2 allocated.') + end if + + sync all + + if (me == 2) then + allocate(obj%arr(3)) + allocate(obj%arr(2)%r_comp, source=13.7) + print *, 'Image 2: memory allocated.' + end if + + sync all + + if (me == 1) then + call assert(allocated(obj[2]%arr), 'obj%arr on image 2 not allocated.') + call assert(.NOT. allocated(obj[2]%arr(1)%r_comp), 'obj%arr(1)%r_comp should not be allocated') + call assert(allocated(obj[2]%arr(2)%r_comp), 'obj%arr(2)%r_comp should be allocated') + call assert(.NOT. allocated(obj[2]%arr(3)%r_comp), 'obj%arr(3)%r_comp should not be allocated') + print *,'Test passed.' + end if + sync all + end associate +contains + subroutine assert(assertion,description,stat) + logical, intent(in) :: assertion + character(len=*), intent(in) :: description + integer, intent(out), optional:: stat + integer, parameter :: failure=1 + if (assertion) then + if (present(stat)) stat=success + else + if (present(stat)) then + stat=failure + else + error stop "Assertion "// description //" failed." + end if + end if + end subroutine +end program + +! vim:sw=4:ts=4:sts=4: +``` + +```bash +cafrun -n 2 comp_allocated_1 +Test passed. +``` + +从输出结果可以看出测试通过,满足opencoarrays所要求的精度范围。 \ No newline at end of file diff --git "a/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" "b/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" new file mode 100644 index 0000000..524f6cb --- /dev/null +++ "b/doc/opencoarrays/\343\200\212\345\237\272\344\272\216openEuler\347\232\204opencoarrays\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" @@ -0,0 +1,369 @@ +# 《基于openEuler的opencoarrays软件移植指南》 + +## 1.介绍 + +- OpenCoarrays支持GNU Compiler Collection (GCC) Fortran编译器 (gfortran) 通过提供并行应用程序二进制接口 (ABI) 抽象出底层通信库。因此,OpenCoarrays能够支持Fortran的并行编程功能,通常称为 “Coarray Fortran”,不直接引用后端通信 库:消息传递接口 (MPI)。这确保了 Fortran 程序和Fortran编译器可以利用其他通信 无需昂贵的重构的库。 + +- 官网地址: + +- GITHUB托管地址: + +## 2.环境要求 + +- 操作系统:OpenEuler arm/x86 (本文档以 x86 架构为例) + +## 3.配置编译环境 + +配置环境指导,手动进行配置依赖环境。 + +### 3.1.环境总览 + +- 编译器: gcc + +- MPI:hmpi + +- 其他类库:`CMake`, `OpenBLAS`, `HDF5`, `BOOST`, `FFTW`, `Python3`, `LibXml2` + + 具体版本和下载地址如下 + +| 名称 | 版本 | 软件下载地址 | +| -------- | ------ | ---------------------------------------------------------------------------------------------- | +| hmpi | 1.1.1 | | +| gcc | 9.3.0 | | +| CMake | 3.23.1 | | +| OpenBLAS | 0.3.18 | | +| HDF5 | 1.10.1 | | +| BOOST | 1.72.0 | | +| FFTW | 3.3.10 | | +| Python3 | 3.7.10 | | +| LibXml2 | 2.10.1 | | + +### 3.2.创建文件夹 + +```bash +mkdir -p $HOME/build +mkdir -p $HOME/install +mkdir -p $HOME/tmp +``` + +### 3.3.安装预设 + +设置环境变量,方便修改自定义安装目录 + +- 编译目录为 $HOME/build , 根据实际情况进行修改 +- 软件安装目录为 $HOME/install , 根据实际情况进行修改 +- 下载目录为 $HOME/tmp , 根据实际情况进行修改 + +```bash +#为了方便自定义软件安装目录 +#环境变量DEP_INSTALL_DIR将在后文中作为软件安装目录的根目录 +export DEP_INSTALL_DIR=$HOME/install +#环境变量DEP_BUILD_DIR将在后文中作为编译的根目录 +export DEP_BUILD_DIR=$HOME/build +#环境变量DEP_DOWNLOAD_DIR将在后文中作为下载文件的保存目录 +export DEP_DOWNLOAD_DIR=$HOME/tmp + +#注: 以上变量只在一次会话中有效。如果中途断开ssh会话,则在后续的安装过程中不会生效,需要重新运行 +``` + +### 3.4.安装环境依赖和gcc编译器 + +```bash +#环境依赖 +yum -y install wget tar libatomic + +#安装bisheng编译器 +wget -P $DEP_DOWNLOAD_DIR https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz +tar -xf $DEP_DOWNLOAD_DIR/gcc-9.3.0.tar.gz -C $DEP_INSTALL_DIR +sed -i "35s/ftp/http/g" ./contrib/download_prerequisites +./contrib/download_prerequisites +./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared +make -j && make install +#设置环境变量 +echo "export PATH=$DEP_INSTALL_DIR/gcc-9.3.0/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` +``` + +## 3.5.下载并编译hmpi + +```bash +yum -y install libstdc++ libstdc++-devel +yum -y install unzip make autoconf automake git libtool +#下载解压源码文件 +wget https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/xucg/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/hmpi/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip + +cd $DEP_BUILD_DIR +unzip -q $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip +cp -rf xucg-1.1.1-huawei/* hucx-1.1.1-huawei/src/ucg/ + +#编译hucx +cd $DEP_BUILD_DIR/hucx-1.1.1-huawei +./autogen.sh +./contrib/configure-opt --prefix=$DEP_INSTALL_DIR/hmpi/hucx CFLAGS="-DHAVE___CLEAR_CACHE=1" --disable-numa --without-java +for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done +for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done +make -j +make install + +yum -y install flex +#编译hmpi +cd $DEP_BUILD_DIR/hmpi-1.1.1-huawei +./autogen.pl +./configure --prefix=$DEP_INSTALL_DIR/hmpi --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$DEP_INSTALL_DIR/hmpi/hucx +make -j +make install + +echo "export PATH=$DEP_INSTALL_DIR/hmpi/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort +``` + +## 3.6.下载并编译`CMake`, `OpenBLAS`, `HDF5`, `BOOST`, `FFTW`, `Python3`, `LibXml2` + +```bash +# 下载CMake +wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O $DEP_DOWNLOAD_DIR/cmake-3.23.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/cmake-3.23.1-linux-x86_64.tar.gz -C $DEP_INSTALL_DIR/cmake --strip-components=1 +echo "export PATH=$DEP_INSTALL_DIR/cmake/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译OpenBLAS +wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.18.tar.gz -O $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz +tar -xzvf $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/OpenBLAS-0.3.18 +make -j +make PREFIX=$DEP_INSTALL_DIR/OpenBLAS install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/OpenBLAS/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译HDF5 +wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1.tar.gz -O $DEP_DOWNLOAD_DIR/hdf5-1.10.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/hdf5-1.10.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/hdf5-1.10.1 +#CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort -Wno-incompatible-pointer-types-discards-qualifiers +./configure --prefix=$DEP_INSTALL_DIR/hdf5 --enable-fortran --enable-static=yes --enable-parallel --enable-shared +make -j +make install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/hdf5/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译BOOST +wget https://boostorg.jfrog.io/artifactory/main/release/1.72.0/source/boost_1_72_0.tar.gz -O $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/boost_1_72_0.tar.gz +cd boost_1_72_0 +./bootstrap.sh +./b2 install --prefix=$DEP_INSTALL_DIR/boost +echo "export BOOST_ROOT=$DEP_INSTALL_DIR/boost/" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/boost/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译FFTW +wget http://www.fftw.org/fftw-3.3.10.tar.gz -O $DEP_DOWNLOAD_DIR/fftw-3.3.10.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/fftw-3.3.10.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/fftw-3.3.10 +./configure --prefix=$DEP_INSTALL_DIR/fftw MPICC=mpicc --enable-shared --enable-threads --enable-openmp --enable-mpi +make -j install +echo "export PATH=$DEP_INSTALL_DIR/fftw/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/fftw/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译Python3 +yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel +wget https://repo.huaweicloud.com/python/3.7.10/Python-3.7.10.tgz -O $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz +tar -zxvf $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/Python-3.7.10 +./configure --prefix=$DEP_INSTALL_DIR/python3 +make -j +make install +echo "export PATH=$DEP_INSTALL_DIR/python3/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/python3/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译LibXml2 +wget https://github.com/GNOME/libxml2/archive/v2.10.1.tar.gz -O $DEP_DOWNLOAD_DIR/libxml2-2.10.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/libxml2-2.10.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/libxml2-2.10.1 +./autogen.sh +./configure --prefix=$DEP_INSTALL_DIR/libxml2 CFLAGS='-O2 -fno-semantic-interposition' +make -j +make install + +``` + +## 4.编译opencoarrays + +### 4.1.下载并编译opencoarrays + +获取opencoarrays软件源码并解压文件 + +```bash + +# 下载源码文件 +wget https://github.com/opencoarrays/opencoarrays/archive/refs/tags/v3.13.0.tar.gz -O $DEP_DOWNLOAD_DIR/opencoarrays-2.10.1.tar.gz +# 解压源码文件 +tar -xvf $DEP_DOWNLOAD_DIR/opencoarrays-2.10.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/opencoarrays-2.10.1/build +#编译源码 +cmake \ +-DCMAKE_BUILD_TYPE=Release \ +-DLIBXML2_INCLUDE_DIR=$DEP_INSTALL_DIR/libxml2/include \ +-DLIBXML2_LIBRARY=$DEP_INSTALL_DIR/libxml2/lib/libxml2.so \ +.. +make -j +make instal +``` + +### 4.2. 运行测试文件 + +运行opencoarrays项目测试文件 + +```bash +cd $DEP_BUILD_DIR/opencoarrays-2.10.1/build +export OMPI_ALLOW_RUN_AS_ROOT=1; +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1; +ctest -R unit # 单元测试 +ctest -R deterministic -LE unstable # 确定性测试 +ctest -R short -LE unstable # 快速测试(测试结果符合统计学规律,在少数情况下会失败) +``` + +## 附A:使用hpcrunner进行一键安装opencoarrays + +推荐使用hpcrunner进行安装opencoarrays + +### 1.克隆仓库 + +```bash +git clone https://gitee.com/openeuler/hpcrunner.git +``` + +## 2.初始化hpcrunner 和 安装必要软件包 + +初始化项目助手 + +```bash +cd hpcrunner +source init.sh +``` + +安装必要软件包 + +**arm / x86 需要的软件包不同,根据实际环境进行选择** + +```bash +# arm +yum install -y environment-odules git wget unzip make flex tar +# x86 +yum install -y environment-modules git wget unzip make flex tar +yum install -y gcc gcc-c++ gcc-gfortran glibc-devel libgfortran +yum install -y tcsh tcl lsof tk bc +``` + +### 3.选择平台对应配置文件 + +- arm平台的配置文件为 `templates/opencoarrays/3.13.0/data.opencoarrays.arm.cpu.config` + + ```bash + ./jarvis -use templates/opencoarrays/3.13.0/data.opencoarrays.arm.cpu.config + ``` + +- x86 平台的配置文件为 `templates/opencoarrays/3.13.0/data.opencoarrays.amd.cpu.config` + + ```bash + ./jarvis -use templates/opencoarrays/3.13.0/data.opencoarrays.amd.cpu.config + ``` + +### 4.下载opencoarrays源码 + +```bash +./jarvis -d +``` + +### 5.一键配置依赖环境 + +```bash +./jarvis -dp +``` + +### 6.一键进行编译 + +```bash +./jarvis -b +``` + +### 7.一键进行运行测试 + +```bash +./jarvis -r +``` + +## 附B:使用singularity运行容器 + +### 使用教程 + +### 下载容器镜像 + +通过链接下载: + +[百度云盘](链接:https://pan.baidu.com/s/1z9I20KlUjzrjcefyzCEfZQ?pwd=5okr) + +或者扫码下载: + +![百度云](data:image/png;base64,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) + +#### 1.安装singularity + +安装singularity, + +具体步骤如下 + +```bash +mkdir -p ~/install +mkdir -p ~/build + +#安装编译所需依赖 +yum -y install libatomic libstdc++ libstdc++-devel libseccomp-devel glib2-devel gcc squashfs-tools tar + +#安装bisheng编译器 +cd ~/build +wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz +tar -C ~/install -xf bisheng-compiler-2.1.0-aarch64-linux.tar.gz +echo "export PATH=$HOME/install/bisheng-compiler-2.1.0-aarch64-linux/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` + +#安装go编译器 +cd ~/build +wget https://go.dev/dl/go1.19.linux-arm64.tar.gz +tar -C ~/install -xf go1.19.linux-arm64.tar.gz +echo "export PATH=$HOME/install/go/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +#安装singularity +cd ~/build +wget https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2.tar.gz +tar -xf singularity-ce-3.10.2.tar.gz +cd singularity-ce-3.10.2 +./mconfig --prefix=$HOME/install/singularity +make -C ./builddir +make -C ./builddir install +echo "export PATH=$HOME/install/singularity/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +``` + +#### 2.构建镜像 + +```shell +# x86 +singularity build ./name-of-image.sif openeuler-gcc-9.3.0-hmpi1-opencoarrays-2.10.1.def +# arm +singularity build ./name-of-image.sif openeuler-bisheng2-hmpi1-opencoarrays-2.10.1.def +# 转换为沙盒 +singularity build --sandbox image-sandbox name-of-image.sif +``` + +#### 3.在沙盒中运行 + +```shell +#进入沙盒 +singularity shell -w image-sandbox +#在沙盒中运行内置的测试案例 +cd /hpcrunner +./jarvis -r +``` \ No newline at end of file diff --git "a/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" "b/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" new file mode 100644 index 0000000..ad1a8af --- /dev/null +++ "b/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" @@ -0,0 +1,1377 @@ +# 《基于openEuler的petsc软件测试报告》 + +## 1.规范性自检 + +项目使用了Clang-Format对文件进行格式化 + +Clang-Format是一个广泛使用的C++代码格式化器。我们在使用编辑器的缩进(TAB)功能时,由于不同编辑器的差别,有的插入的是制表符,有的是2个空格,有的是4个空格。这样如果别人用另一个编辑器来阅读程序时,可能会由于缩进的不同,导致阅读效果一团糟。为了解决这个问题,使用C++开发了一个插件,它可以自动重新缩进,并手动指定空格的数量,自动格式化源文件。它是可以通过命令行使用,也可以作为插件,在其他IDE中使用。 + +文件格式化配置参考文件`.clang-format`,文件内容如下 + +```clang-format +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: Left +AlignConsecutiveMacros: Consecutive +AlignConsecutiveAssignments: Consecutive +AlignConsecutiveBitFields: Consecutive +AlignConsecutiveDeclarations: Consecutive +AlignEscapedNewlines: DontAlign +AlignOperands: AlignAfterOperator +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability + - PETSC_EXTERN + - PETSC_INTERN + - PETSC_UNUSED + - PETSC_RESTRICT + - PETSC_SINGLE_LIBRARY_INTERN + - PETSC_ATTRIBUTE_FORMAT + - PETSC_ATTRIBUTE_MPI_TYPE_TAG + - PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE + - PETSC_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE + - PETSC_ATTRIBUTE_COLD +BinPackArguments: true +BinPackParameters: true +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: true + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +# BreakBeforeConceptDeclarations: Allowed +BreakBeforeInheritanceComma: false +BreakInheritanceList: AfterColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 250 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: +# - BOOST_FOREACH +IfMacros: + #- PetscCheck + #- PetscAssert +IncludeBlocks: Preserve +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: BeforeHash +IndentExternBlock: NoIndent +IndentRequires: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PackConstructorInitializers: NextLine +PenaltyBreakAssignment: 1000000 +PenaltyBreakBeforeFirstCallParameter: 1000000 +PenaltyBreakComment: 300000 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 0 +PenaltyReturnTypeOnItsOwnLine: 1000000 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Right +PPIndentWidth: -1 +ReferenceAlignment: Pointer +ReflowComments: false +ShortNamespaceLines: 0 +SortIncludes: Never +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatementsExceptControlMacros +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +SeparateDefinitionBlocks: Leave +BitFieldColonSpacing: Both +Standard: Latest +StatementAttributeLikeMacros: + - PETSC_EXTERN + - PETSC_INTERN + - PETSC_NODISCARD +StatementMacros: + - PetscKernel_A_gets_transpose_A_DECLARE + - PETSC_RETURNS + - PETSC_DECLTYPE_AUTO_RETURNS + - PETSC_NOEXCEPT_AUTO_RETURNS + - PETSC_DECLTYPE_NOEXCEPT_AUTO_RETURNS + - PETSC_UNUSED +TabWidth: 2 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - PetscStringize + - PetscStringize_ +TypenameMacros: + - khash_t +``` + +对于当前项目,检查代码规范性,可以通过使用Clang-Format对所有源码进行重新格式化,然后使用git查看文件修改。 + +统计代码不规范内容。 + +### 1.1.选择统计文件类型 + +统计项目文件类型及其文件数量 + +使用python编写脚本文件 + +```python +import os + +print(os.getcwd()) + +def getAllFiles(targetDir): + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(getAllFiles(path)) + elif os.path.isfile(path): + files.append(path) + return files + +all_files = getAllFiles(os.curdir) +type_dict = dict() + +for each_file in all_files: + if os.path.isdir(each_file): + type_dict.setdefault("directory", 0) + type_dict["directory"] += 1 + else: + ext = os.path.splitext(each_file)[1] + type_dict.setdefault(ext, 0) + type_dict[ext] += 1 + +for each_type in dict(sorted(type_dict.items(), reverse=True, key=lambda item: item[1])).keys(): + print("当前文件夹下共有[%s]的文件%d个" % (each_type, type_dict[each_type])) +``` + +在petsc项目根目录下运行,运行结果如下 + +```bash +⋊> ~/hpcrunner/tmp/petsc-3.18.1 python3 ../count.py +/root/hpcrunner/tmp/petsc-3.18.1 +当前文件夹下共有[.sh]的文件5750个 +当前文件夹下共有[.out]的文件5263个 +当前文件夹下共有[.c]的文件2682个 +当前文件夹下共有[]的文件1963个 +当前文件夹下共有[.o]的文件1479个 +当前文件夹下共有[.d]的文件1479个 +当前文件夹下共有[.py]的文件513个 +当前文件夹下共有[.h]的文件450个 +当前文件夹下共有[.pyc]的文件204个 +当前文件夹下共有[.F90]的文件183个 +当前文件夹下共有[.pxd]的文件151个 +当前文件夹下共有[.cxx]的文件88个 +当前文件夹下共有[.m]的文件60个 +当前文件夹下共有[.h90]的文件56个 +当前文件夹下共有[.mod]的文件49个 +当前文件夹下共有[.pyx]的文件49个 +当前文件夹下共有[.pxi]的文件39个 +当前文件夹下共有[.hpp]的文件33个 +当前文件夹下共有[.cu]的文件30个 +当前文件夹下共有[.msh]的文件26个 +当前文件夹下共有[.txt]的文件19个 +当前文件夹下共有[.exo]的文件17个 +当前文件夹下共有[.cpp]的文件16个 +当前文件夹下共有[.js]的文件15个 +当前文件夹下共有[.geo]的文件13个 +当前文件夹下共有[.yaml]的文件12个 +当前文件夹下共有[.so]的文件9个 +当前文件夹下共有[.log]的文件8个 +当前文件夹下共有[.testout]的文件7个 +当前文件夹下共有[.patch]的文件7个 +当前文件夹下共有[.xib]的文件6个 +当前文件夹下共有[.yml]的文件6个 +当前文件夹下共有[.inp]的文件6个 +当前文件夹下共有[.pbxproj]的文件5个 +当前文件夹下共有[.rst]的文件5个 +当前文件夹下共有[.opts]的文件5个 +当前文件夹下共有[.cfg]的文件4个 +当前文件夹下共有[.1]的文件4个 +当前文件夹下共有[.plist]的文件4个 +当前文件夹下共有[.bin]的文件4个 +当前文件夹下共有[.pch]的文件3个 +当前文件夹下共有[.tmp]的文件3个 +当前文件夹下共有[.err]的文件3个 +当前文件夹下共有[.h5m]的文件3个 +当前文件夹下共有[.counts]的文件3个 +当前文件夹下共有[.dat]的文件3个 +当前文件夹下共有[.in]的文件3个 +当前文件夹下共有[.mtx]的文件3个 +当前文件夹下共有[.cas]的文件3个 +当前文件夹下共有[.petsc]的文件3个 +当前文件夹下共有[.f90]的文件3个 +当前文件夹下共有[.bash]的文件2个 +当前文件夹下共有[.swift]的文件2个 +当前文件夹下共有[.png]的文件2个 +当前文件夹下共有[.pc]的文件2个 +当前文件夹下共有[.json]的文件2个 +当前文件夹下共有[.data]的文件2个 +当前文件夹下共有[.inf]的文件2个 +当前文件夹下共有[.mat]的文件2个 +当前文件夹下共有[.egads]的文件2个 +当前文件夹下共有[.stp]的文件2个 +当前文件夹下共有[.h5]的文件2个 +当前文件夹下共有[.msh2]的文件2个 +当前文件夹下共有[.egadslite]的文件2个 +当前文件夹下共有[.cgns]的文件2个 +当前文件夹下共有[.med]的文件2个 +当前文件夹下共有[.igs]的文件2个 +当前文件夹下共有[.msh4]的文件2个 +当前文件夹下共有[.user]的文件2个 +当前文件夹下共有[.md]的文件2个 +当前文件夹下共有[.H]的文件2个 +当前文件夹下共有[.tex]的文件2个 +当前文件夹下共有[.zig]的文件2个 +当前文件夹下共有[.i]的文件2个 +当前文件夹下共有[.pyf]的文件2个 +当前文件夹下共有[.csh]的文件1个 +当前文件夹下共有[.common]的文件1个 +当前文件夹下共有[.exe]的文件1个 +当前文件夹下共有[.dll]的文件1个 +当前文件夹下共有[.mplstyle]的文件1个 +当前文件夹下共有[.uni]的文件1个 +当前文件夹下共有[.test]的文件1个 +当前文件夹下共有[.rtf]的文件1个 +当前文件夹下共有[.strings]的文件1个 +当前文件夹下共有[.storyboard]的文件1个 +当前文件夹下共有[.mode1v3]的文件1个 +当前文件夹下共有[.pbxuser]的文件1个 +当前文件夹下共有[.db]的文件1个 +当前文件夹下共有[.18]的文件1个 +当前文件夹下共有[.pkl]的文件1个 +当前文件夹下共有[.mk]的文件1个 +当前文件夹下共有[.bz2]的文件1个 +当前文件夹下共有[.xmf]的文件1个 +当前文件夹下共有[.supp]的文件1个 +当前文件夹下共有[.bmp]的文件1个 +当前文件夹下共有[.xsl]的文件1个 +当前文件夹下共有[.3d]的文件1个 +当前文件夹下共有[.2d]的文件1个 +当前文件夹下共有[.pdf]的文件1个 +当前文件夹下共有[.template]的文件1个 +当前文件夹下共有[.java]的文件1个 +当前文件夹下共有[.options]的文件1个 +当前文件夹下共有[.f2py]的文件1个 +当前文件夹下共有[.ini]的文件1个 +``` + +查看上述结果可知主要源码文件后缀名为 `cpp`,`c`,`h`,`py`,`sh`,`c`,`csh`,`cc`,`pl`。 + +### 1.2.统计源码总行数 + +统计所有源码文件的代码行数 + +```bash + find ./ -regex ".*\.hpp\|.*\.h\|.*\.cpp"\|.*\.py"\|.*\.sh"\|.*\.c"\|.*\.csh"\|.*\.cc"\|.*\.pl" \ + | xargs wc -l +``` + +统计结果 + +```bash + 96861 total +``` + +### 1.3.统计不符合要求的总行数 + +对文件后缀名为 `cpp`,`hpp`,`h`,`py`,`sh`,`c`,`csh`,`cc`,`pl`, 的所有文件进行格式 +通过git与clang-format结合的方式进行统计 + +```bash +[root@host- src]# find . -regex '.*\.\(cpp\|hpp\)' -exec clang-format -style=./src/.clang-format -i {} \; +[root@host- src]# git commit -m "fomat update" +[main 065d27269a1] fomat update + 29 files changed, 1402 insertions(+), 1393 deletions(-) + rewrite src/dm/dt/fe/interface/ftn-custom/zfef.c (72%) + rewrite src/dm/dt/fv/interface/ftn-custom/zfvf.c (82%) + rewrite src/dm/dt/interface/ftn-custom/zdsf.c (83%) + rewrite src/dm/dt/interface/ftn-custom/zdtfef.c (69%) + rewrite src/dm/impls/da/f90-custom/zda1f90.c (81%) + rewrite src/dm/impls/da/ftn-custom/zda1f.c (63%) + rewrite src/dm/impls/da/ftn-custom/zda2f.c (68%) + rewrite src/dm/impls/da/ftn-custom/zda3f.c (70%) + rewrite src/dm/impls/da/ftn-custom/zdacornf.c (84%) + rewrite src/dm/impls/da/ftn-custom/zdaf.c (72%) + rewrite src/dm/impls/da/ftn-custom/zdaghostf.c (80%) + rewrite src/dm/impls/da/ftn-custom/zdaindexf.c (64%) + rewrite src/dm/impls/da/ftn-custom/zdasubf.c (71%) + rewrite src/dm/impls/plex/tests/ex1f90.F90 (95%) + rewrite src/dm/impls/plex/tests/ex2f90.F90 (97%) + rewrite src/dm/impls/plex/tests/ex48f90.F90 (92%) + rewrite src/dm/impls/plex/tests/ex97f90.F90 (87%) +``` + +### 1.4.统计结果 + +综上信息,项目中代码规范性自检检查结果为 + +通过率 : 98.56% 1-1393/96861*100% + +不通过率 : 1.44% 1393/96861*100% + +## 2.功能性测试 + +### 2.1.所选测试案例 + +petsc内置了大量的单元测试,可以使用其进行单元测试文件内容。 + +单元测试文件列表(部分)如下 + +```bash +[root@host- build]# root@zubinshuo-PC 11:46:26 ~/petsc |main ↑1 ✓| → tree src/mat/tests/ +src/mat/tests/ +├── bench_spmv.c +├── cJSON.c +├── cJSON.h +├── ex100.c +├── ex101.c +├── ex180.c +├── ex181.c +├── ex182.c +├── ex183.c +├── ex184.c +├── ex185.c +├── ex18.c +├── ex190.c +├── ex191.c +├── ex192.c +├── ex193.c +├── ex194.c +├── ex195.c +├── ex196f90.F90 +├── ex197.c +├── ex198.c +├── ex199.c +├── ex19.c +├── ex1.c +├── ex1k.kokkos.cxx +├── ex200.c +├── ex201f.F90 +├── ex202.c +├── ex203.c +├── ex204.c +├── ex205.c +├── ex206.c +├── ex207.c +├── ex208.c +├── ex209.c +├── ex209f.F90 +├── ex20.c +├── ex210.c +├── ex235.c +├── ex236.c +├── ex237.c +├── ex253.c +├── ex254.c +├── ex255.c +├── ex256.c +├── ex257.c +├── ex258.c +├── ex25.c +├── ex26.c +├── ex27.c +├── ex28.c +├── ex29.c +├── ex2.c +├── ex2k.kokkos.cxx +├── ex300.c +├── ex301.c +├── ex30.c +├── ex31.c +├── ex32.c +├── ex33.c +├── ex34.c +├── ex94.c +├── ex95.c +├── ex96.c +├── ex97.c +├── ex98.c +├── ex99.c +├── ex9.c +├── makefile +├── mmio.c +├── mmio.h +├── mmloader.c +├── mmloader.h +└── output + ├── bench_spmv_1.out + ├── empty.out + ├── ex100_1.out + ├── ex10_1.out + ├── ex101.out + ├── ex15_1.out + ├── ex170_4.out + ├── ex171_1.out + ├── ex171f_1.out + ├── ex17_1.out + ├── ex172.out + ├── ex173_1.out + ├── ex174_dense.out + ├── ex174_elemental.out + ├── ex174.out + ├── ex174_sbaij.out + ├── ex175.out + ├── ex177.out + ├── ex178_1.out + ├── ex178_2.out + ├── ex178_5.out + ├── ex179_1.out + ├── ex180_1.out + ├── ex18_0.out + ├── ex18_10.out + ├── ex18_11.out + ├── ex181_1.out + ├── ex18_12.out + ├── ex181_2.out + ├── ex18_13.out + ├── ex18_14.out + ├── ex18_15.out + ├── ex18_16.out + ├── ex18_17.out + ├── ex18_1.out + ├── ex181.out + ├── ex182_10.out + ├── ex182_11.out + ├── ex207_2.out + ├── ex208_1.out + ├── ex208_2.out + ├── ex208_baij_2.out + ├── ex208_baij.out + ├── ex208_dense_2.out + ├── ex208_dense.out + ├── ex209_1.out + ├── ex209_2.out + ├── ex209f_1.out + ├── ex210_1.out + ├── ex2_11_A_aijcusparse.out + ├── ex2_11_A.out + ├── ex2_11_B.out + ├── ex21_1.out + ├── ex212_1.out + ├── ex2_12_A.out + ├── ex2_12_B.out + ├── ex212f_1.out + ├── ex213_1.out + ├── ex214_1.out + ├── ex214_2.out + ├── ex215.out + ├── ex218_1.out + ├── ex219f_1.out + ├── ex219f_2.out + ├── ex220_1.out + ├── ex221_1.out + ├── ex2_21_aijcusparse.out + ├── ex2_21.out + ├── ex22_1.out + ├── ex222_null.out + ├── ex2_22.out + ├── ex2_23.out + ├── ex2_24.out + ├── ex225_1.out + ├── ex226_1.out + ├── ex226_2.out + ├── ex226_3.out +... + +``` + +在项目根目录下执行命令来运行单元测试和确定性测试 + +```bash +export OMPI_ALLOW_RUN_AS_ROOT=1 +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +make test +``` + +### 2.2.运行结果 + +```bash +[root@host- build]# make test + CLINKER arch-linux-c-debug/tests/sys/classes/draw/tests/ex6 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_1.counts + ok sys_classes_draw_tests-ex6_1 + ok diff-sys_classes_draw_tests-ex6_1 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_2.counts + ok sys_classes_draw_tests-ex6_2 + ok diff-sys_classes_draw_tests-ex6_2 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_3.counts + ok sys_classes_draw_tests-ex6_3 + ok diff-sys_classes_draw_tests-ex6_3 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_4.counts + ok sys_classes_draw_tests-ex6_4 + ok diff-sys_classes_draw_tests-ex6_4 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_5.counts + ok sys_classes_draw_tests-ex6_5 + ok diff-sys_classes_draw_tests-ex6_5 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_6.counts + ok sys_classes_draw_tests-ex6_6 + ok diff-sys_classes_draw_tests-ex6_6 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_7.counts + ok sys_classes_draw_tests-ex6_7 + ok diff-sys_classes_draw_tests-ex6_7 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex6_8.counts + ok sys_classes_draw_tests-ex6_8 + ok diff-sys_classes_draw_tests-ex6_8 + CC arch-linux-c-debug/tests/sys/classes/draw/tests/ex7.o + CLINKER arch-linux-c-debug/tests/sys/classes/draw/tests/ex7 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex7_1.counts + ok sys_classes_draw_tests-ex7_1 + ok diff-sys_classes_draw_tests-ex7_1 + CC arch-linux-c-debug/tests/sys/classes/draw/tests/ex9.o + CLINKER arch-linux-c-debug/tests/sys/classes/draw/tests/ex9 + TEST arch-linux-c-debug/tests/counts/sys_classes_draw_tests-ex9_1.counts + ok sys_classes_draw_tests-ex9_1 + ok diff-sys_classes_draw_tests-ex9_1 + CC arch-linux-c-debug/tests/sys/classes/random/tests/ex3.o + CLINKER arch-linux-c-debug/tests/sys/classes/random/tests/ex3 + TEST arch-linux-c-debug/tests/counts/sys_classes_random_tests-ex3_1.counts + ok sys_classes_random_tests-ex3_1 + ok diff-sys_classes_random_tests-ex3_1 + CC arch-linux-c-debug/tests/sys/classes/random/tutorials/ex1.o + CLINKER arch-linux-c-debug/tests/sys/classes/random/tutorials/ex1 + TEST arch-linux-c-debug/tests/counts/sys_classes_random_tutorials-ex1_1.counts + ok sys_classes_random_tutorials-ex1_1 + ok diff-sys_classes_random_tutorials-ex1_1 + TEST arch-linux-c-debug/tests/counts/sys_classes_random_tutorials-ex1_2.counts + ok sys_classes_random_tutorials-ex1_2 + ok diff-sys_classes_random_tutorials-ex1_2 + TEST arch-linux-c-debug/tests/counts/sys_classes_random_tutorials-ex1_3.counts + ok sys_classes_random_tutorials-ex1_3 + ok diff-sys_classes_random_tutorials-ex1_3 + CC arch-linux-c-debug/tests/sys/classes/random/tutorials/ex2.o + CLINKER arch-linux-c-debug/tests/sys/classes/random/tutorials/ex2 + TEST arch-linux-c-debug/tests/counts/sys_classes_random_tutorials-ex2_1.counts + ok sys_classes_random_tutorials-ex2_1 + ok diff-sys_classes_random_tutorials-ex2_1 + CC arch-linux-c-debug/tests/sys/classes/viewer/tests/ex3.o + CLINKER arch-linux-c-debug/tests/sys/classes/viewer/tests/ex3 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex3_1.counts + ok sys_classes_viewer_tests-ex3_1 + ok diff-sys_classes_viewer_tests-ex3_1 + CC arch-linux-c-debug/tests/sys/classes/viewer/tests/ex4.o + CLINKER arch-linux-c-debug/tests/sys/classes/viewer/tests/ex4 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex4_1.counts + ok sys_classes_viewer_tests-ex4_1 + ok diff-sys_classes_viewer_tests-ex4_1 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex4_2.counts + ok sys_classes_viewer_tests-ex4_2 + ok diff-sys_classes_viewer_tests-ex4_2 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex4_3.counts + ok sys_classes_viewer_tests-ex4_3 + ok diff-sys_classes_viewer_tests-ex4_3 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex4_4.counts + ok sys_classes_viewer_tests-ex4_4 + ok diff-sys_classes_viewer_tests-ex4_4 + CC arch-linux-c-debug/tests/sys/classes/viewer/tests/ex5.o + CLINKER arch-linux-c-debug/tests/sys/classes/viewer/tests/ex5 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex5_1.counts + ok sys_classes_viewer_tests-ex5_1 + ok diff-sys_classes_viewer_tests-ex5_1 + CC arch-linux-c-debug/tests/sys/classes/viewer/tests/ex6.o + CLINKER arch-linux-c-debug/tests/sys/classes/viewer/tests/ex6 + TEST arch-linux-c-debug/tests/counts/sys_classes_viewer_tests-ex6_nsize-1_stdio.counts + ok diff-tao_bound_tutorials-plate2f_2 + FC arch-linux-c-debug/tests/tao/leastsquares/tutorials/chwirut1f.o + FLINKER arch-linux-c-debug/tests/tao/leastsquares/tutorials/chwirut1f + TEST arch-linux-c-debug/tests/counts/tao_leastsquares_tutorials-chwirut1f_1.counts + ok tao_leastsquares_tutorials-chwirut1f_1 + ok diff-tao_leastsquares_tutorials-chwirut1f_1 + FC arch-linux-c-debug/tests/tao/leastsquares/tutorials/chwirut2f.o + FLINKER arch-linux-c-debug/tests/tao/leastsquares/tutorials/chwirut2f + TEST arch-linux-c-debug/tests/counts/tao_leastsquares_tutorials-chwirut2f_1.counts + ok tao_leastsquares_tutorials-chwirut2f_1 + ok diff-tao_leastsquares_tutorials-chwirut2f_1 + FC arch-linux-c-debug/tests/tao/unconstrained/tutorials/eptorsion2f.o + FLINKER arch-linux-c-debug/tests/tao/unconstrained/tutorials/eptorsion2f + TEST arch-linux-c-debug/tests/counts/tao_unconstrained_tutorials-eptorsion2f_1.counts + ok tao_unconstrained_tutorials-eptorsion2f_1 + ok diff-tao_unconstrained_tutorials-eptorsion2f_1 + TEST arch-linux-c-debug/tests/counts/tao_unconstrained_tutorials-eptorsion2f_2.counts + ok tao_unconstrained_tutorials-eptorsion2f_2 + ok diff-tao_unconstrained_tutorials-eptorsion2f_2 + TEST arch-linux-c-debug/tests/counts/tao_unconstrained_tutorials-eptorsion2f_3.counts + ok tao_unconstrained_tutorials-eptorsion2f_3 + ok diff-tao_unconstrained_tutorials-eptorsion2f_3 + FC arch-linux-c-debug/tests/tao/unconstrained/tutorials/rosenbrock1f.o + FLINKER arch-linux-c-debug/tests/tao/unconstrained/tutorials/rosenbrock1f + TEST arch-linux-c-debug/tests/counts/tao_unconstrained_tutorials-rosenbrock1f_1.counts + ok tao_unconstrained_tutorials-rosenbrock1f_1 + ok diff-tao_unconstrained_tutorials-rosenbrock1f_1 + RM test-rm-tao.F90 + RM test-rm-tao.kokkos.cxx + RM test-rm-tao.hip.cpp + RM test-rm-tao.sycl.cxx + RM test-rm-tao.raja.cxx + +# ------------- +# Summary +# ------------- +# success 8612/11030 tests (78.1%) +# failed 0/11030 tests (0.0%) +# todo 243/11030 tests (2.2%) +# skip 2175/11030 tests (19.7%) +# +# Wall clock time for tests: 2414 sec +# Approximate CPU time (not incl. build time): 2086.940000000073 sec +# +# Timing summary (actual test time / total CPU time): +# snes_tutorials-ex56_0: 70.95 sec / 71.15 sec +# dm_tests-ex36_3dp1: 47.82 sec / 64.56 sec +# snes_tutorials-ex17_3d_q3_trig_elas: 30.62 sec / 30.74 sec +# ksp_ksp_tutorials-ex42_tut_3: 28.67 sec / 28.93 sec +# mat_tests-ex89_allatonce_merged_3D: 27.37 sec / 27.69 sec +total time used: 2416s +SUCCESSFULLY EXECUTED AT 2022-12-13 00:28:48, CONGRADULATIONS!!! +``` + +测试结果 + +单元测试运行正常,说明各类型函数和功能都响应正常。测试通过。 + +## 3.性能测试 + +### 3.1.测试平台信息对比 + +| | arm信息 | x86信息 | +| -------- | -------------------------------- | --------------------- | +| 操作系统 | openEuler 22.03 (LTS) | openEuler 22.03 (LTS) | +| 内核版本 | 5.10.0-60.18.0.50.oe2203.aarch64 | 5.15.79.1.oe1.x86_64 | + +### 3.2.测试软件环境信息对比 + +| | arm信息 | x86信息 | +| -------- | ------------- | --------- | +| gcc | bisheng 2.1.0 | gcc 9.3.0 | +| mpi | hmpi1.1.1 | hmpi1.1.1 | +| CMake | 3.23.1 | 3.23.1 | +| OpenBLAS | 0.3.18 | 0.3.18 | +| lapack | 3.8.0 | 3.8.0 | +| Python3 | 3.7.10 | 3.7.10 | +| BOOST | 1.72.0 | 1.72.0 | +| sowing | 1.1.26 | 1.1.26 | + +### 3.3.测试硬件性能信息对比 + +| | arm信息 | x86信息 | +| ------ | ----------- | -------- | +| cpu | Kunpeng 920 | | +| 核心数 | 16 | 4 | +| 内存 | 32 GB | 8 GB | +| 磁盘io | 1.3 GB/s | 400 MB/s | +| 虚拟化 | KVM | KVM | + +### 3.4.测试选择的案例 + +src/ksp/ksp/tutorials/ex10 目录下的文件 KSP Tutorial ex10 + +该代码从二进制文件中加载矩阵和右侧向量,然后求解得到的线性系统;然后程序对第二个线性系统重复这个过程。 + +输入文件地址: +`https://ftp.mcs.anl.gov/pub/petsc/Datafiles/matrices/medium` +`https://ftp.mcs.anl.gov/pub/petsc/Datafiles/matrices/arco6` + +测试文件(部分)如下 + +```c +static char help[] = "Solve a small system and a large system through preloading\n\ + Input arguments are:\n\ + -permute : solve system in permuted indexing\n\ + -f0 -f1 \n\n"; + +/* + Include "petscksp.h" so that we can use KSP solvers. Note that this file + automatically includes: + petscsys.h - base PETSc routines petscvec.h - vectors + petscmat.h - matrices + petscis.h - index sets petscksp.h - Krylov subspace methods + petscviewer.h - viewers petscpc.h - preconditioners +*/ +#include + +typedef enum { + RHS_FILE, + RHS_ONE, + RHS_RANDOM +} RHSType; +const char *const RHSTypes[] = {"FILE", "ONE", "RANDOM", "RHSType", "RHS_", NULL}; + +PetscErrorCode CheckResult(KSP *ksp, Mat *A, Vec *b, Vec *x, IS *rowperm) +{ + PetscReal norm; /* norm of solution error */ + PetscInt its; + PetscFunctionBegin; + PetscCall(KSPGetTotalIterations(*ksp, &its)); + PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of iterations = %" PetscInt_FMT "\n", its)); + + PetscCall(KSPGetResidualNorm(*ksp, &norm)); + if (norm < 1.e-12) { + PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Residual norm < 1.e-12\n")); + } else { + PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Residual norm %e\n", (double)norm)); + } + + PetscCall(KSPDestroy(ksp)); + PetscCall(MatDestroy(A)); + PetscCall(VecDestroy(x)); + PetscCall(VecDestroy(b)); + PetscCall(ISDestroy(rowperm)); + PetscFunctionReturn(0); +} + +PetscErrorCode CreateSystem(const char filename[PETSC_MAX_PATH_LEN], RHSType rhstype, MatOrderingType ordering, PetscBool permute, IS *rowperm_out, Mat *A_out, Vec *b_out, Vec *x_out) +{ + Vec x, b, b2; + Mat A; /* linear system matrix */ + PetscViewer viewer; /* viewer */ + PetscBool same; + PetscInt j, len, start, idx, n1, n2; + const PetscScalar *val; + IS rowperm = NULL, colperm = NULL; + + PetscFunctionBegin; + /* open binary file. Note that we use FILE_MODE_READ to indicate reading from this file */ + PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, filename, FILE_MODE_READ, &viewer)); + + /* load the matrix and vector; then destroy the viewer */ + PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); + PetscCall(MatSetFromOptions(A)); + PetscCall(MatLoad(A, viewer)); + switch (rhstype) { + case RHS_FILE: + /* Vectors in the file might a different size than the matrix so we need a + * Vec whose size hasn't been set yet. It'll get fixed below. Otherwise we + * can create the correct size Vec. */ + PetscCall(VecCreate(PETSC_COMM_WORLD, &b)); + PetscCall(VecLoad(b, viewer)); + break; + case RHS_ONE: + PetscCall(MatCreateVecs(A, &b, NULL)); + PetscCall(VecSet(b, 1.0)); + break; + case RHS_RANDOM: + PetscCall(MatCreateVecs(A, &b, NULL)); + PetscCall(VecSetRandom(b, NULL)); + break; + } + PetscCall(PetscViewerDestroy(&viewer)); + + /* if the loaded matrix is larger than the vector (due to being padded + to match the block size of the system), then create a new padded vector + */ + PetscCall(MatGetLocalSize(A, NULL, &n1)); + PetscCall(VecGetLocalSize(b, &n2)); + same = (n1 == n2) ? PETSC_TRUE : PETSC_FALSE; + PetscCall(MPIU_Allreduce(MPI_IN_PLACE, &same, 1, MPIU_BOOL, MPI_LAND, PETSC_COMM_WORLD)); + + if (!same) { /* create a new vector b by padding the old one */ + PetscCall(VecCreate(PETSC_COMM_WORLD, &b2)); + PetscCall(VecSetSizes(b2, n1, PETSC_DECIDE)); + PetscCall(VecSetFromOptions(b2)); + PetscCall(VecGetOwnershipRange(b, &start, NULL)); + PetscCall(VecGetLocalSize(b, &len)); + PetscCall(VecGetArrayRead(b, &val)); + for (j = 0; j < len; j++) { + idx = start + j; + PetscCall(VecSetValues(b2, 1, &idx, val + j, INSERT_VALUES)); + } + PetscCall(VecRestoreArrayRead(b, &val)); + PetscCall(VecDestroy(&b)); + PetscCall(VecAssemblyBegin(b2)); + PetscCall(VecAssemblyEnd(b2)); + b = b2; + } + PetscCall(VecDuplicate(b, &x)); + + if (permute) { + Mat Aperm; + PetscCall(MatGetOrdering(A, ordering, &rowperm, &colperm)); + PetscCall(MatPermute(A, rowperm, colperm, &Aperm)); + PetscCall(VecPermute(b, colperm, PETSC_FALSE)); + PetscCall(MatDestroy(&A)); + A = Aperm; /* Replace original operator with permuted version */ + PetscCall(ISDestroy(&colperm)); + } + + *b_out = b; + *x_out = x; + *A_out = A; + *rowperm_out = rowperm; + + PetscFunctionReturn(0); +} + +/* ATTENTION: this is the example used in the Profiling chaper of the PETSc manual, + where we referenced its profiling stages, preloading and output etc. + When you modify it, please make sure it is still consistent with the manual. + */ +int main(int argc, char **args) +{ + Vec x, b; + Mat A; /* linear system matrix */ + KSP ksp; /* Krylov subspace method context */ + char file[2][PETSC_MAX_PATH_LEN], ordering[256] = MATORDERINGRCM; + RHSType rhstype = RHS_FILE; + PetscBool flg, preload = PETSC_FALSE, trans = PETSC_FALSE, permute = PETSC_FALSE; + IS rowperm = NULL; + + PetscFunctionBeginUser; + PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); + + PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "Preloading example options", ""); + { + /* + Determine files from which we read the two linear systems + (matrix and right-hand-side vector). + */ + PetscCall(PetscOptionsBool("-trans", "Solve transpose system instead", "", trans, &trans, &flg)); + PetscCall(PetscOptionsString("-f", "First file to load (small system)", "", file[0], file[0], sizeof(file[0]), &flg)); + PetscCall(PetscOptionsFList("-permute", "Permute matrix and vector to solve in new ordering", "", MatOrderingList, ordering, ordering, sizeof(ordering), &permute)); + + if (flg) { + PetscCall(PetscStrcpy(file[1], file[0])); + preload = PETSC_FALSE; + } else { + PetscCall(PetscOptionsString("-f0", "First file to load (small system)", "", file[0], file[0], sizeof(file[0]), &flg)); + PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must indicate binary file with the -f0 or -f option"); + PetscCall(PetscOptionsString("-f1", "Second file to load (larger system)", "", file[1], file[1], sizeof(file[1]), &flg)); + if (!flg) preload = PETSC_FALSE; /* don't bother with second system */ + } + + PetscCall(PetscOptionsEnum("-rhs", "Right hand side", "", RHSTypes, (PetscEnum)rhstype, (PetscEnum *)&rhstype, NULL)); + } + PetscOptionsEnd(); + + /* + To use preloading, one usually has code like the following: + + PetscPreLoadBegin(preload,"first stage); + lines of code + PetscPreLoadStage("second stage"); + lines of code + PetscPreLoadEnd(); + + The two macro PetscPreLoadBegin() and PetscPreLoadEnd() implicitly form a + loop with maximal two iterations, depending whether preloading is turned on or + not. If it is, either through the preload arg of PetscPreLoadBegin or through + -preload command line, the trip count is 2, otherwise it is 1. One can use the + predefined variable PetscPreLoadIt within the loop body to get the current + iteration number, which is 0 or 1. If preload is turned on, the runtime doesn't + do profiling for the first iteration, but it will do profiling for the second + iteration instead. + + One can solve a small system in the first iteration and a large system in + the second iteration. This process preloads the instructions with the small + system so that more accurate performance monitoring (via -log_view) can be done + with the large one (that actually is the system of interest). + + But in this example, we turned off preloading and duplicated the code for + the large system. In general, it is a bad practice and one should not duplicate + code. We do that because we want to show profiling stages for both the small + system and the large system. + */ + + /*========================= + solve a small system + =========================*/ + + PetscPreLoadBegin(preload, "Load System 0"); + PetscCall(CreateSystem(file[0], rhstype, ordering, permute, &rowperm, &A, &b, &x)); + + PetscPreLoadStage("KSPSetUp 0"); + PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp)); + PetscCall(KSPSetOperators(ksp, A, A)); + PetscCall(KSPSetFromOptions(ksp)); + + /* + Here we explicitly call KSPSetUp() and KSPSetUpOnBlocks() to + enable more precise profiling of setting up the preconditioner. + These calls are optional, since both will be called within + KSPSolve() if they haven't been called already. + */ + PetscCall(KSPSetUp(ksp)); + PetscCall(KSPSetUpOnBlocks(ksp)); + + PetscPreLoadStage("KSPSolve 0"); + if (trans) PetscCall(KSPSolveTranspose(ksp, b, x)); + else PetscCall(KSPSolve(ksp, b, x)); + + if (permute) PetscCall(VecPermute(x, rowperm, PETSC_TRUE)); + + PetscCall(CheckResult(&ksp, &A, &b, &x, &rowperm)); + + /*========================= + solve a large system + =========================*/ + + PetscPreLoadStage("Load System 1"); + + PetscCall(CreateSystem(file[1], rhstype, ordering, permute, &rowperm, &A, &b, &x)); + + PetscPreLoadStage("KSPSetUp 1"); + PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp)); + PetscCall(KSPSetOperators(ksp, A, A)); + PetscCall(KSPSetFromOptions(ksp)); + + /* + Here we explicitly call KSPSetUp() and KSPSetUpOnBlocks() to + enable more precise profiling of setting up the preconditioner. + These calls are optional, since both will be called within + KSPSolve() if they haven't been called already. + */ + PetscCall(KSPSetUp(ksp)); + PetscCall(KSPSetUpOnBlocks(ksp)); + + PetscPreLoadStage("KSPSolve 1"); + if (trans) PetscCall(KSPSolveTranspose(ksp, b, x)); + else PetscCall(KSPSolve(ksp, b, x)); + + if (permute) PetscCall(VecPermute(x, rowperm, PETSC_TRUE)); + + PetscCall(CheckResult(&ksp, &A, &b, &x, &rowperm)); + + PetscPreLoadEnd(); + /* + Always call PetscFinalize() before exiting a program. This routine + - finalizes the PETSc libraries as well as MPI + - provides summary and diagnostic information if certain runtime + options are chosen (e.g., -log_view). + */ + PetscCall(PetscFinalize()); + return 0; +} + +/*TEST + + test: + TODO: Matrix row/column sizes are not compatible with block size + suffix: 1 + nsize: 4 + output_file: output/ex10_1.out + requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) + args: -f0 ${DATAFILESPATH}/matrices/medium -f1 ${DATAFILESPATH}/matrices/arco6 -ksp_gmres_classicalgramschmidt -mat_type baij -matload_block_size 3 -pc_type bjacobi + + test: + TODO: Matrix row/column sizes are not compatible with block size + suffix: 2 + nsize: 4 + output_file: output/ex10_2.out + requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) + args: -f0 ${DATAFILESPATH}/matrices/medium -f1 ${DATAFILESPATH}/matrices/arco6 -ksp_gmres_classicalgramschmidt -mat_type baij -matload_block_size 3 -pc_type bjacobi -trans + + test: + suffix: 3 + requires: double complex !defined(PETSC_USE_64BIT_INDICES) + args: -f ${wPETSC_DIR}/share/petsc/datafiles/matrices/nh-complex-int32-float64 -ksp_type bicg + + test: + suffix: 4 + args: -f ${DATAFILESPATH}/matrices/medium -ksp_type bicg -permute rcm + requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) + +TEST*/ +``` + +### 3.5.单线程 + +单线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ------ | +| 实际CPU时间 | 3.133s | 1.266s | +| 用户时间 | 3.248s | 1.670s | + +### 3.6.多线程 + +多线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ------ | +| 线程数 | 4 | 4 | +| 实际CPU时间 | 5.600s | 2.734s | +| 用户时间 | 1.536s | 0.871s | + +arm多线程时间耗费数据表: + +| 线程 | 1 | 2 | 4 | 8 | +| :------------ | ----- | ----- | ----- | ----- | +| 用户时间(s) | 3.243 | 2.256 | 1.536 | 1.191 | +| 用户态时间(s) | 3.074 | 4.230 | 5.600 | 8.344 | +| 内核态时间(s) | 0.121 | 0.143 | 0.222 | 0.452 | + +x86多线程时间耗费数据表: + +| 线程 | 1 | 2 | 3 | 4 | +| --------------- | ----- | ----- | ----- | ----- | +| 用户时间 (s) | 1.383 | 1.064 | 0.848 | 0.895 | +| 用户态时间(s) | 1.243 | 1.849 | 2.098 | 2.963 | +| 内核态时间(s) | 0.100 | 0.127 | 0.156 | 0.240 | + +由上表可知,在线程逐渐增加的情况下,所减少的用户时间并非线性关系,线程数增加后,运算用时并未显著下降,且系统调用的时间有较为明显的上升趋势。 + +### 3.7.测试总结 + +性能测试arm平台均在x86平台50%以上,且随着线程数的增加,两个平台的对于同一个应用的所耗费的时间差距逐渐减少。 + +且线程增加并不会无限制减少应用的实际耗费时间,在合理的范围内分配线程数才能更好的利用算力资源。 + +## 4.精度测试 + +### 4.1.所选测试案例 + +src/ksp/ksp/tutorials/ex50.c 目录下的文件 ex50.c + +二维网格上的线性泊松方程 + +测试文件如下 + +```c +/* DMDA/KSP solving a system of linear equations. + Poisson equation in 2D: + + div(grad p) = f, 0 < x,y < 1 + with + forcing function f = -cos(m*pi*x)*cos(n*pi*y), + Neuman boundary conditions + dp/dx = 0 for x = 0, x = 1. + dp/dy = 0 for y = 0, y = 1. + + Contributed by Michael Boghosian , 2008, + based on petsc/src/ksp/ksp/tutorials/ex29.c and ex32.c + + Compare to ex66.c + + Example of Usage: + ./ex50 -da_grid_x 3 -da_grid_y 3 -pc_type mg -da_refine 3 -ksp_monitor -ksp_view -dm_view draw -draw_pause -1 + ./ex50 -da_grid_x 100 -da_grid_y 100 -pc_type mg -pc_mg_levels 1 -mg_levels_0_pc_type ilu -mg_levels_0_pc_factor_levels 1 -ksp_monitor -ksp_view + ./ex50 -da_grid_x 100 -da_grid_y 100 -pc_type mg -pc_mg_levels 1 -mg_levels_0_pc_type lu -mg_levels_0_pc_factor_shift_type NONZERO -ksp_monitor + mpiexec -n 4 ./ex50 -da_grid_x 3 -da_grid_y 3 -pc_type mg -da_refine 10 -ksp_monitor -ksp_view -log_view +*/ + +static char help[] = "Solves 2D Poisson equation using multigrid.\n\n"; + +#include +#include +#include +#include +#include + +extern PetscErrorCode ComputeJacobian(KSP, Mat, Mat, void *); +extern PetscErrorCode ComputeRHS(KSP, Vec, void *); + +typedef struct { + PetscScalar uu, tt; +} UserContext; + +int main(int argc, char **argv) +{ + KSP ksp; + DM da; + UserContext user; + + PetscFunctionBeginUser; + PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); + PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp)); + PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_STAR, 11, 11, PETSC_DECIDE, PETSC_DECIDE, 1, 1, NULL, NULL, &da)); + PetscCall(DMSetFromOptions(da)); + PetscCall(DMSetUp(da)); + PetscCall(KSPSetDM(ksp, (DM)da)); + PetscCall(DMSetApplicationContext(da, &user)); + + user.uu = 1.0; + user.tt = 1.0; + + PetscCall(KSPSetComputeRHS(ksp, ComputeRHS, &user)); + PetscCall(KSPSetComputeOperators(ksp, ComputeJacobian, &user)); + PetscCall(KSPSetFromOptions(ksp)); + PetscCall(KSPSolve(ksp, NULL, NULL)); + + PetscCall(DMDestroy(&da)); + PetscCall(KSPDestroy(&ksp)); + PetscCall(PetscFinalize()); + return 0; +} + +PetscErrorCode ComputeRHS(KSP ksp, Vec b, void *ctx) +{ + UserContext *user = (UserContext *)ctx; + PetscInt i, j, M, N, xm, ym, xs, ys; + PetscScalar Hx, Hy, pi, uu, tt; + PetscScalar **array; + DM da; + MatNullSpace nullspace; + + PetscFunctionBeginUser; + PetscCall(KSPGetDM(ksp, &da)); + PetscCall(DMDAGetInfo(da, 0, &M, &N, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + uu = user->uu; + tt = user->tt; + pi = 4 * atan(1.0); + Hx = 1.0 / (PetscReal)(M); + Hy = 1.0 / (PetscReal)(N); + + PetscCall(DMDAGetCorners(da, &xs, &ys, 0, &xm, &ym, 0)); /* Fine grid */ + PetscCall(DMDAVecGetArray(da, b, &array)); + for (j = ys; j < ys + ym; j++) { + for (i = xs; i < xs + xm; i++) array[j][i] = -PetscCosScalar(uu * pi * ((PetscReal)i + 0.5) * Hx) * PetscCosScalar(tt * pi * ((PetscReal)j + 0.5) * Hy) * Hx * Hy; + } + PetscCall(DMDAVecRestoreArray(da, b, &array)); + PetscCall(VecAssemblyBegin(b)); + PetscCall(VecAssemblyEnd(b)); + + /* force right hand side to be consistent for singular matrix */ + /* note this is really a hack, normally the model would provide you with a consistent right handside */ + PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, 0, &nullspace)); + PetscCall(MatNullSpaceRemove(nullspace, b)); + PetscCall(MatNullSpaceDestroy(&nullspace)); + PetscFunctionReturn(0); +} + +PetscErrorCode ComputeJacobian(KSP ksp, Mat J, Mat jac, void *ctx) +{ + PetscInt i, j, M, N, xm, ym, xs, ys, num, numi, numj; + PetscScalar v[5], Hx, Hy, HydHx, HxdHy; + MatStencil row, col[5]; + DM da; + MatNullSpace nullspace; + + PetscFunctionBeginUser; + PetscCall(KSPGetDM(ksp, &da)); + PetscCall(DMDAGetInfo(da, 0, &M, &N, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + Hx = 1.0 / (PetscReal)(M); + Hy = 1.0 / (PetscReal)(N); + HxdHy = Hx / Hy; + HydHx = Hy / Hx; + PetscCall(DMDAGetCorners(da, &xs, &ys, 0, &xm, &ym, 0)); + for (j = ys; j < ys + ym; j++) { + for (i = xs; i < xs + xm; i++) { + row.i = i; + row.j = j; + + if (i == 0 || j == 0 || i == M - 1 || j == N - 1) { + num = 0; + numi = 0; + numj = 0; + if (j != 0) { + v[num] = -HxdHy; + col[num].i = i; + col[num].j = j - 1; + num++; + numj++; + } + if (i != 0) { + v[num] = -HydHx; + col[num].i = i - 1; + col[num].j = j; + num++; + numi++; + } + if (i != M - 1) { + v[num] = -HydHx; + col[num].i = i + 1; + col[num].j = j; + num++; + numi++; + } + if (j != N - 1) { + v[num] = -HxdHy; + col[num].i = i; + col[num].j = j + 1; + num++; + numj++; + } + v[num] = ((PetscReal)(numj)*HxdHy + (PetscReal)(numi)*HydHx); + col[num].i = i; + col[num].j = j; + num++; + PetscCall(MatSetValuesStencil(jac, 1, &row, num, col, v, INSERT_VALUES)); + } else { + v[0] = -HxdHy; + col[0].i = i; + col[0].j = j - 1; + v[1] = -HydHx; + col[1].i = i - 1; + col[1].j = j; + v[2] = 2.0 * (HxdHy + HydHx); + col[2].i = i; + col[2].j = j; + v[3] = -HydHx; + col[3].i = i + 1; + col[3].j = j; + v[4] = -HxdHy; + col[4].i = i; + col[4].j = j + 1; + PetscCall(MatSetValuesStencil(jac, 1, &row, 5, col, v, INSERT_VALUES)); + } + } + } + PetscCall(MatAssemblyBegin(jac, MAT_FINAL_ASSEMBLY)); + PetscCall(MatAssemblyEnd(jac, MAT_FINAL_ASSEMBLY)); + + PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, 0, &nullspace)); + PetscCall(MatSetNullSpace(J, nullspace)); + PetscCall(MatNullSpaceDestroy(&nullspace)); + PetscFunctionReturn(0); +} + +/*TEST + + build: + requires: !complex !single + + test: + args: -pc_type mg -pc_mg_type full -ksp_type cg -ksp_monitor_short -da_refine 3 -mg_coarse_pc_type svd -ksp_view + + test: + suffix: 2 + nsize: 4 + args: -pc_type mg -pc_mg_type full -ksp_type cg -ksp_monitor_short -da_refine 3 -mg_coarse_pc_type redundant -mg_coarse_redundant_pc_type svd -ksp_view + + test: + suffix: 3 + nsize: 2 + args: -pc_type mg -pc_mg_type full -ksp_monitor_short -da_refine 5 -mg_coarse_ksp_type cg -mg_coarse_ksp_converged_reason -mg_coarse_ksp_rtol 1e-2 -mg_coarse_ksp_max_it 5 -mg_coarse_pc_type none -pc_mg_levels 2 -ksp_type pipefgmres -ksp_pipefgmres_shift 1.5 + + test: + suffix: tut_1 + nsize: 1 + args: -da_grid_x 4 -da_grid_y 4 -mat_view + + test: + suffix: tut_2 + requires: superlu_dist parmetis + nsize: 4 + args: -da_grid_x 120 -da_grid_y 120 -pc_type lu -pc_factor_mat_solver_type superlu_dist -ksp_monitor -ksp_view + + test: + suffix: tut_3 + nsize: 4 + args: -da_grid_x 1025 -da_grid_y 1025 -pc_type mg -pc_mg_levels 9 -ksp_monitor + +TEST*/ +``` + +### 4.2.获取对比数据 + +arm 运行结果(部分) + +```bash + 0 KSP Residual norm 3.039809126331e+00 + 1 KSP Residual norm 2.315114032714e-13 +KSP Object: 4 MPI processes + type: gmres + restart=30, using Classical (unmodified) Gram-Schmidt Orthogonalization with no iterative refinement + happy breakdown tolerance 1e-30 + maximum iterations=10000, initial guess is zero + tolerances: relative=1e-05, absolute=1e-50, divergence=10000. + left preconditioning + using PRECONDITIONED norm type for convergence test +PC Object: 4 MPI processes + type: lu + out-of-place factorization + tolerance for zero pivot 2.22045e-14 + matrix ordering: external + factor fill ratio given 0., needed 0. + Factored matrix follows: + Mat Object: 4 MPI processes + type: superlu_dist + rows=14400, cols=14400 + package used to perform factorization: superlu_dist + total: nonzeros=0, allocated nonzeros=0 + SuperLU_DIST run parameters: + Process grid nprow 2 x npcol 2 + Equilibrate matrix TRUE + Replace tiny pivots FALSE + Use iterative refinement FALSE + Processors in row 2 col partition 2 + Row permutation LargeDiag_MC64 + Column permutation MMD_AT_PLUS_A + Parallel symbolic factorization FALSE + Repeated factorization SamePattern + linear system matrix = precond matrix: + Mat Object: 4 MPI processes + type: mpiaij + rows=14400, cols=14400 + total: nonzeros=71520, allocated nonzeros=71520 + total number of mallocs used during MatSetValues calls=0 + has attached null space +``` + +### 4.3.测试总结 + +从arm输出结果可以看出测试通过,结果在公差之内,所有运算结果偏差在1%以内,偏差较小。 \ No newline at end of file diff --git "a/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" "b/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" new file mode 100644 index 0000000..c65df18 --- /dev/null +++ "b/doc/petsc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204petsc\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" @@ -0,0 +1,362 @@ +# 《基于openEuler的petsc软件移植指南》 + +## 1.介绍 + +- petsc 是一个科学计算的便携式可扩展工具包,是一套数据结构和程序,用于可扩展(并行)解决由偏微分方程建模的科学应用。它支持MPI,并通过CUDA、HIP或OpenCL支持GPU,以及MPI-GPU混合并行;它还支持NEC-SX Tsubasa Vector Engine。 + +- 官网地址: + +- GITLAB托管地址: + +- 特性: + + - 为高级用户提供对数值方法的控制 + - 并行向量和矩阵 + - 基于Krylov的并行线性系统求解器子空间方法,包括共轭梯度法 + - 基于牛顿方法的并行非线性求解器 + - 并行ODE求解器 + +## 2.环境要求 + +- 操作系统:OpenEuler arm/x86 (本文档以 x86 架构为例) + +## 3.配置编译环境 + +配置环境指导,手动进行配置依赖环境。 + +### 3.1.环境总览 + +- 编译器: gcc + +- MPI:hmpi + +- 其他类库:`CMake`, `OpenBLAS`, `lapack`, `BOOST`, `Python3`, `sowing` + + 具体版本和下载地址如下 + +| 名称 | 版本 | 软件下载地址 | +| -------- | ------ | ---------------------------------------------------------------------------------------------- | +| hmpi | 1.2.0 | | +| gcc | 9.3.0 | | +| CMake | 3.23.1 | | +| OpenBLAS | 0.3.18 | | +| lapack | 3.8.0 | | +| Python3 | 3.7.10 | | +| BOOST | 1.72.0 | | +| sowing | 1.1.26 | | + +### 3.2.创建文件夹 + +```bash +mkdir -p $HOME/build +mkdir -p $HOME/install +mkdir -p $HOME/tmp +``` + +### 3.3.安装预设 + +设置环境变量,方便修改自定义安装目录 + +- 编译目录为 $HOME/build , 根据实际情况进行修改 +- 软件安装目录为 $HOME/install , 根据实际情况进行修改 +- 下载目录为 $HOME/tmp , 根据实际情况进行修改 + +```bash +#为了方便自定义软件安装目录 +#环境变量DEP_INSTALL_DIR将在后文中作为软件安装目录的根目录 +export DEP_INSTALL_DIR=$HOME/install +#环境变量DEP_BUILD_DIR将在后文中作为编译的根目录 +export DEP_BUILD_DIR=$HOME/build +#环境变量DEP_DOWNLOAD_DIR将在后文中作为下载文件的保存目录 +export DEP_DOWNLOAD_DIR=$HOME/tmp + +#注: 以上变量只在一次会话中有效。如果中途断开ssh会话,则在后续的安装过程中不会生效,需要重新运行 +``` + +### 3.4.安装环境依赖和gcc编译器 + +```bash +#环境依赖 +yum -y install wget tar libatomic hostname + +#安装bisheng编译器 +wget -P $DEP_DOWNLOAD_DIR https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz +tar -xf $DEP_DOWNLOAD_DIR/gcc-9.3.0.tar.gz -C $DEP_INSTALL_DIR +sed -i "35s/ftp/http/g" ./contrib/download_prerequisites +./contrib/download_prerequisites +./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared +make -j && make install +#设置环境变量 +echo "export PATH=$DEP_INSTALL_DIR/gcc-9.3.0/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` +``` + +## 3.5.下载并编译hmpi + +```bash +yum -y install libstdc++ libstdc++-devel +yum -y install unzip make autoconf automake git libtool +#下载解压源码文件 +wget https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/hucx-1.2.0-huawei.zip +wget https://github.com/kunpengcompute/xucg/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/xucg-1.2.0-huawei.zip +wget https://github.com/kunpengcompute/hmpi/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/hmpi-1.2.0-huawei.zip + +cd $DEP_BUILD_DIR +unzip -q $DEP_DOWNLOAD_DIR/hucx-1.2.0-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/xucg-1.2.0-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/hmpi-1.2.0-huawei.zip +cp -rf xucg-1.2.0-huawei/* hucx-1.2.0-huawei/src/ucg/ + +#编译hucx +cd $DEP_BUILD_DIR/hucx-1.2.0-huawei +./autogen.sh +./contrib/configure-opt --prefix=$DEP_INSTALL_DIR/hmpi/hucx CFLAGS="-DHAVE___CLEAR_CACHE=1" --disable-numa --without-java +for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done +for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done +make -j +make install + +yum -y install flex +#编译hmpi +cd $DEP_BUILD_DIR/hmpi-1.2.0-huawei +./autogen.pl +./configure --prefix=$DEP_INSTALL_DIR/hmpi --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$DEP_INSTALL_DIR/hmpi/hucx +make -j +make install + +echo "export PATH=$DEP_INSTALL_DIR/hmpi/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort +``` + +## 3.6.下载并编译`CMake`, `OpenBLAS`, `lapack`, `BOOST`, `Python3`, `sowing` + +```bash +# 下载CMake +wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O $DEP_DOWNLOAD_DIR/cmake-3.23.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/cmake-3.23.1-linux-x86_64.tar.gz -C $DEP_INSTALL_DIR/cmake --strip-components=1 +echo "export PATH=$DEP_INSTALL_DIR/cmake/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译OpenBLAS +wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.18.tar.gz -O $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz +tar -xzvf $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/OpenBLAS-0.3.18 +make -j +make PREFIX=$DEP_INSTALL_DIR/OpenBLAS install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/OpenBLAS/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译lapack +wget https://www.cp2k.org/static/downloads/lapack-3.8.0.tgz -O $DEP_DOWNLOAD_DIR/lapack-3.8.0.tgz +tar -xvf ${JARVIS_DOWNLOAD}/lapack-3.8.0.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/lapack-3.8.0 +cp make.inc.example make.inc +mkdir build && cd build +cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON +make -j +make install -j +echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DEP_INSTALL_DIR/lapack-3.8.0/build/lib" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译BOOST +wget https://boostorg.jfrog.io/artifactory/main/release/1.72.0/source/boost_1_72_0.tar.gz -O $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/boost_1_72_0.tar.gz +cd boost_1_72_0 +./bootstrap.sh +./b2 install --prefix=$DEP_INSTALL_DIR/boost +echo "export BOOST_ROOT=$DEP_INSTALL_DIR/boost/" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/boost/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译Python3 +yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel +wget https://repo.huaweicloud.com/python/3.7.10/Python-3.7.10.tgz -O $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz +tar -zxvf $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/Python-3.7.10 +./configure --prefix=$DEP_INSTALL_DIR/python3 +make -j +make install +echo "export PATH=$DEP_INSTALL_DIR/python3/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/python3/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译sowing +wget http://wgropp.cs.illinois.edu/projects/software/sowing/sowing.tar.gz -O $DEP_DOWNLOAD_DIR/sowing.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/sowing.tar.gz +cd $DEP_DOWNLOAD_DIR/sowing-1.1.26 +./configure --prefix=$DEP_INSTALL_DIR/sowing +make -j +make install -j +``` + +## 4.编译petsc + +### 4.1.下载并编译petsc + +获取petsc软件源码并解压文件 + +```bash + +# 下载源码文件 +wget https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.18.1.tar.gz -O $DEP_DOWNLOAD_DIR/petsc-3.18.1.tar.gz +# 解压源码文件 +tar -xvf $DEP_DOWNLOAD_DIR/petsc-3.18.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/petsc-3.18.1 +#编译源码 +./configure F77=$F77 --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpifort --force +make PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug all -j +make PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug install -j +``` + +### 4.2. 运行测试文件 + +运行petsc项目测试文件 + +```bash +# 部分测试用例不支持hmpi场景 +sed -i 's/--oversubscribe/--oversubscribe --mca coll ^ucx/g' $DEP_BUILD_DIR/petsc-3.18.1/arch-linux-c-debug/tests/ksp/ksp/tutorials/runex54f_hem.sh +cd $DEP_BUILD_DIR/petsc-3.18.1/arch-linux-c-debug +export OMPI_ALLOW_RUN_AS_ROOT=1; +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1; +make test +``` + +## 附A:使用hpcrunner进行一键安装petsc + +推荐使用hpcrunner进行安装petsc + +### 1.克隆仓库 + +```bash +git clone https://gitee.com/openeuler/hpcrunner.git +``` + +## 2.初始化hpcrunner 和 安装必要软件包 + +初始化项目助手 + +```bash +cd hpcrunner +source init.sh +``` + +安装必要软件包 + +**arm / x86 需要的软件包不同,根据实际环境进行选择** + +```bash +# arm +yum install -y environment-modules git wget unzip make flex tar hostname +# x86 +yum install -y environment-modules git wget unzip make flex tar +yum install -y gcc gcc-c++ gcc-gfortran glibc-devel libgfortran +yum install -y tcsh tcl lsof tk bc hostname +``` + +### 3.选择平台对应配置文件 + +- arm平台的配置文件为 `templates/petsc/3.18.1/data.petsc.arm.cpu.config` + + ```bash + ./jarvis -use templates/petsc/3.18.1/data.petsc.arm.cpu.config + ``` + +- x86 平台的配置文件为 `templates/petsc/3.18.1/data.petsc.amd.cpu.config` + + ```bash + ./jarvis -use templates/petsc/3.18.1/data.petsc.amd.cpu.config + ``` + +### 4.下载petsc源码 + +```bash +./jarvis -d +``` + +### 5.一键配置依赖环境 + +```bash +./jarvis -dp +``` + +### 6.一键进行编译 + +```bash +./jarvis -b +``` + +### 7.一键进行运行测试 + +```bash +./jarvis -r +``` + +## 附B:使用singularity运行容器 + +### 使用教程 + +### 下载容器镜像 + +通过链接下载: + +[百度云盘](https://pan.baidu.com/s/1UjHiv6DN_oOVXcuohP5Uqg?pwd=vxit) + +或者扫码下载: + +![百度云](data:image/png;base64,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) + +#### 1.安装singularity + +安装singularity, + +具体步骤如下 + +```bash +mkdir -p ~/install +mkdir -p ~/build + +#安装编译所需依赖 +yum -y install libatomic libstdc++ libstdc++-devel libseccomp-devel glib2-devel gcc squashfs-tools tar + +#安装bisheng编译器 +cd ~/build +wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz +tar -C ~/install -xf bisheng-compiler-2.1.0-aarch64-linux.tar.gz +echo "export PATH=$HOME/install/bisheng-compiler-2.1.0-aarch64-linux/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` + +#安装go编译器 +cd ~/build +wget https://go.dev/dl/go1.19.linux-arm64.tar.gz +tar -C ~/install -xf go1.19.linux-arm64.tar.gz +echo "export PATH=$HOME/install/go/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +#安装singularity +cd ~/build +wget https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2.tar.gz +tar -xf singularity-ce-3.10.2.tar.gz +cd singularity-ce-3.10.2 +./mconfig --prefix=$HOME/install/singularity +make -C ./builddir +make -C ./builddir install +echo "export PATH=$HOME/install/singularity/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +``` + +#### 2.构建镜像 + +```shell +# x86 +singularity build ./name-of-image.sif openeuler-gcc-9.3.0-hmpi1-petsc-3.18.1.def +# arm +singularity build ./name-of-image.sif openeuler-bisheng2-hmpi1-petsc-3.18.1.def +# 转换为沙盒 +singularity build --sandbox image-sandbox name-of-image.sif +``` + +#### 3.在沙盒中运行 + +```shell +#进入沙盒 +singularity shell -w image-sandbox +#在沙盒中运行内置的测试案例 +cd /hpcrunner +./jarvis -r +``` diff --git "a/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" "b/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" new file mode 100644 index 0000000..44947d7 --- /dev/null +++ "b/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" @@ -0,0 +1,2963 @@ +# 《基于openEuler的scotch软件测试报告》 + +## 1.规范性自检 + +项目使用了cppcheck、sonarqube、rats对文件进行格式化 + +Cppcheck 是一种 C/C++ 代码缺陷静态检查工具。不同于 C/C++ 编译器及很多其它分析工具,它不检查代码中的语法错误。Cppcheck 只检查编译器检查不出来的 bug 类型,其目的是检查代码中真正的错误(即:零误报)。 + +RATS是一个针对C、c++、PHP、Perl和Python代码的安全审计实用程序。RATS扫描源代码,发现潜在危险的函数调用。 + +SonarQube 是一种自我管理的自动代码审查工具,可系统地帮助交付干净的代码。 SonarQube集成到现有的工作流程中并检测代码中的问题,该工具分析30多种不同的编程语言,并集成到您的 CI 管道和 DevOps 平台中,以确保代码符合高质量标准。 + +文件格式化配置参考文件`./ci/analysis.sh`,文件内容如下 + +```bash +#!/bin/sh + +export LCOVFILES="" +for filename in $(ls -1 scotch-*.lcov); do export LCOVFILES="$LCOVFILES -a $filename"; done +lcov $LCOVFILES -o scotch.lcov +lcov_cobertura.py scotch.lcov --output scotch-coverage.xml + +export CPPCHECK_DEFINITIONS="$(grep SCOTCH_GITLAB_SEPARATOR < src/Makefile.inc | sed -e 's#^CFLAGS.*SCOTCH_GITLAB_SEPARATOR##1' | sed -e 's#[ ][^-][^ ]*##g' -e 's#[ ][-][^D][^ ]*##g')" +export CPPCHECK_INCLUDES="-Isrc/scotch -Isrc/misc -Isrc/libscotch -Isrc/esmumps -Isrc/libscotchmetis" + +./ci/gitlab-ci-filelist.sh + +cppcheck -v --max-configs=1 --language=c ${CPPCHECK_DEFINITIONS_VM:---platform=native} --enable=all --xml --xml-version=2 --suppress=missingIncludeSystem --suppress=varFuncNullUB --suppress=invalidPrintfArgType_sint ${CPPCHECK_DEFINITIONS} ${CPPCHECK_INCLUDES} --file-list=./filelist.txt 2> scotch-cppcheck.xml + +rats -w 3 --xml `cat filelist.txt` > scotch-rats.xml + +# sonar.projectKey=tadaam:scotch:gitlab:$CI_PROJECT_NAMESPACE:$CI_COMMIT_REF_NAME +# sonar.projectKey=tadaam:scotch:gitlab:$CI_PROJECT_NAMESPACE +# sonar.branch.name=$CI_COMMIT_REF_NAME +# sonar.exclusions=build/**,cmake_modules/**,doc/**,tools/**,**/*.xml +# "sonar.lang.patterns.c++=**/*.cpp,**/*.hpp" : needed so that C files are not considered as C++ files +cat > sonar-project.properties << EOF +sonar.host.url=https://sonarqube.inria.fr/sonarqube +sonar.login=$SONARQUBE_LOGIN +sonar.links.homepage=$CI_PROJECT_URL +sonar.links.scm=$CI_REPOSITORY_URL +sonar.links.ci=https://gitlab.inria.fr/$CI_PROJECT_NAMESPACE/scotch/pipelines +sonar.links.issue=https://gitlab.inria.fr/$CI_PROJECT_NAMESPACE/scotch/issues +sonar.projectKey=tadaam:scotch:gitlab:$CI_PROJECT_NAMESPACE +sonar.branch.name=$CI_COMMIT_REF_NAME +sonar.projectDescription=Package for graph and mesh/hypergraph partitioning, graph clustering, and sparse matrix ordering. +sonar.projectVersion=6.1 +sonar.sourceEncoding=UTF-8 +sonar.sources=include,src/check,src/esmumps,src/libscotch,src/libscotchmetis,src/misc,src/scotch +sonar.lang.patterns.c++=**/*.cpp,**/*.hpp +sonar.lang.patterns.c=**/*.c,**/*.h +sonar.exclusions=src/libscotch/dummysizes.c,src/libscotch/parser_ll.c,src/libscotch/parser_yy.c,src/libscotch/last_resort/** +sonar.c.includeDirectories=$(echo | gcc -E -Wp,-v - 2>&1 | grep "^ " | tr '\n' ',')include,src/scotch,src/misc,src/libscotch,src/esmumps,src/libscotchmetis,/usr/include/openmpi,/usr/include/mpich +sonar.c.errorRecoveryEnabled=true +sonar.c.gcc.charset=UTF-8 +sonar.c.gcc.regex=(?.*):(?[0-9]+):[0-9]+:\\\x20warning:\\\x20(?.*)\\\x20\\\[(?.*)\\\] +sonar.c.gcc.reportPath=scotch-build*.log +sonar.c.coverage.reportPath=scotch-coverage.xml +sonar.c.cppcheck.reportPath=scotch-cppcheck.xml +sonar.c.rats.reportPath=scotch-rats.xml +sonar.c.clangsa.reportPath=analyzer_reports/*/*.plist +EOF +``` + +对于当前项目,检查代码规范性,可以通过使用Clang-Format对所有源码进行重新格式化,然后使用git查看文件修改。 + +统计代码不规范内容。 + +### 1.1.选择统计文件类型 + +统计项目文件类型及其文件数量 + +使用python编写脚本文件 + +```python +import os + +print(os.getcwd()) + +def getAllFiles(targetDir): + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(getAllFiles(path)) + elif os.path.isfile(path): + files.append(path) + return files + +all_files = getAllFiles(os.curdir) +type_dict = dict() + +for each_file in all_files: + if os.path.isdir(each_file): + type_dict.setdefault("directory", 0) + type_dict["directory"] += 1 + else: + ext = os.path.splitext(each_file)[1] + type_dict.setdefault(ext, 0) + type_dict[ext] += 1 + +for each_type in dict(sorted(type_dict.items(), reverse=True, key=lambda item: item[1])).keys(): + print("当前文件夹下共有[%s]的文件%d个" % (each_type, type_dict[each_type])) +``` + +在scotch项目根目录下运行,运行结果如下 + +```bash +⋊> /root/scotch python3 ../count.py +/root/scotch +当前文件夹下共有[.c]的文件454个 +当前文件夹下共有[.h]的文件233个 +当前文件夹下共有[.tgt]的文件69个 +当前文件夹下共有[.txt]的文件41个 +当前文件夹下共有[.eps]的文件29个 +当前文件夹下共有[]的文件25个 +当前文件夹下共有[.tex]的文件25个 +当前文件夹下共有[.fig]的文件25个 +当前文件夹下共有[.1]的文件24个 +当前文件夹下共有[.grf]的文件23个 +当前文件夹下共有[.sample]的文件13个 +当前文件夹下共有[.gz]的文件11个 +当前文件夹下共有[.ps]的文件10个 +当前文件夹下共有[.gif]的文件10个 +当前文件夹下共有[.pdf]的文件7个 +当前文件夹下共有[.sh]的文件5个 +当前文件夹下共有[.sty]的文件4个 +当前文件夹下共有[.png]的文件4个 +当前文件夹下共有[.shlib]的文件4个 +当前文件夹下共有[.debug]的文件4个 +当前文件夹下共有[.F]的文件3个 +当前文件夹下共有[.src]的文件3个 +当前文件夹下共有[.msh]的文件3个 +当前文件夹下共有[.f]的文件2个 +当前文件夹下共有[.cmake]的文件2个 +当前文件夹下共有[.bib]的文件2个 +当前文件夹下共有[.xyz]的文件2个 +当前文件夹下共有[.map]的文件2个 +当前文件夹下共有[.icc]的文件2个 +当前文件夹下共有[.md]的文件1个 +当前文件夹下共有[.pack]的文件1个 +当前文件夹下共有[.idx]的文件1个 +当前文件夹下共有[.in]的文件1个 +当前文件夹下共有[.xml]的文件1个 +当前文件夹下共有[.yml]的文件1个 +当前文件夹下共有[.inc]的文件1个 +当前文件夹下共有[.y]的文件1个 +当前文件夹下共有[.l]的文件1个 +当前文件夹下共有[.i686_pc_linux3]的文件1个 +当前文件夹下共有[.pa11_hp_ux10]的文件1个 +当前文件夹下共有[.power3_ibm_aix5]的文件1个 +当前文件夹下共有[.x86-64_pc_freebsd]的文件1个 +当前文件夹下共有[.bat]的文件1个 +当前文件夹下共有[.power6_ibm_aix5]的文件1个 +当前文件夹下共有[.i686_pc_mingw32]的文件1个 +当前文件夹下共有[.i686_pc_linux2]的文件1个 +当前文件夹下共有[.i686_sun_solaris5]的文件1个 +当前文件夹下共有[.mips_sgi_irix6]的文件1个 +当前文件夹下共有[.prof]的文件1个 +当前文件夹下共有[.ppca2_ibm_bgq]的文件1个 +当前文件夹下共有[.x86-64_pc_linux2]的文件1个 +当前文件夹下共有[.alpha_dec_osf1]的文件1个 +当前文件夹下共有[.x86-64_cray-xt4_linux2]的文件1个 +当前文件夹下共有[.c99]的文件1个 +当前文件夹下共有[.i686_pc_freebsd]的文件1个 +当前文件夹下共有[.impi]的文件1个 +当前文件夹下共有[.i686_mac_darwin8]的文件1个 +当前文件夹下共有[.i686_mac_darwin10]的文件1个 +当前文件夹下共有[.ppc450_ibm_bgp]的文件1个 +当前文件夹下共有[.nothreads]的文件1个 +当前文件夹下共有[.spec]的文件1个 +当前文件夹下共有[.f90]的文件1个 +``` + +查看上述结果可知主要源码文件后缀名为 `cpp`,`c`,`h`。 + +### 1.2.统计源码总行数 + +统计所有源码文件的代码行数 + +```bash + find ./ -regex ".*\.c\|.*\.h\|.*\.cpp" | xargs wc -l +``` + +统计结果 + +```bash + 151907 total +``` + +### 1.3.统计不符合要求的总行数 + +对文件后缀名为 `cpp`,`c`,`h`, 的所有文件进行格式 +通过运行分析脚本的方式进行分析 + +### 1.4.统计结果 + +```xml + + +33 +46 +62 +334 +55 + +src/libscotch/vmesh_separate_ml.c +src/libscotch/vdgraph_separate_sq.c +src/libscotch/library_graph_io_chac.c +src/libscotch/library_graph_io_chac_f.c +src/libscotch/wgraph_part_es.c +src/libscotch/dorder_tree_dist.c +src/libscotch/hmesh_order_gp.c +src/libscotch/hmesh_order_nd.c +src/libscotch/mesh_induce_sepa.c +src/libscotch/dgraph_io_save.c +src/libscotch/library_mesh_order_f.c +src/libscotch/graph_io_mmkt.c +src/libscotch/library_graph_diam.c +src/libscotch/bdgraph_check.c +src/libscotch/library_graph_dump.c +src/libscotch/hgraph_order_st.c +src/libscotch/arch_hcub.c +src/libscotch/vmesh_check.c +src/libscotch/library_dgraph_build_f.c +src/libscotch/library_dgraph_coarsen_f.c +src/libscotch/common_values.c +src/libscotch/hmesh_order_hf.c +src/libscotch/arch.c +src/libscotch/library_graph.c +src/libscotch/library_graph_order.c +src/libscotch/bgraph_bipart_df.c +src/libscotch/library_parser.c +src/libscotch/arch_deco2.c +src/libscotch/library_context_dgraph_f.c +src/libscotch/library_dgraph_coarsen.c +src/libscotch/graph_dump.c +src/libscotch/bdgraph_bipart_ex.c +src/libscotch/dgraph_match.c +src/libscotch/library_arch_dom.c +src/libscotch/graph.c +src/libscotch/kdgraph_gather.c +src/libscotch/wgraph_part_ml.c +src/libscotch/library_dgraph_check_f.c +src/libscotch/vgraph_separate_ml.c +src/libscotch/dgraph_ghst.c +src/libscotch/dgraph_check.c +src/libscotch/dgraph_fold_comm.c +src/libscotch/library_dgraph_map_f.c +src/libscotch/dorder_io.c +src/libscotch/common_stub.c +src/libscotch/dgraph_induce.c +src/libscotch/hgraph_induce.c +src/libscotch/library_dgraph_build_grid3d.c +src/libscotch/hgraph_order_cc.c +src/libscotch/library_strat.c +src/libscotch/graph_ielo.c +src/libscotch/library_dgraph_scatter_f.c +src/libscotch/bgraph_bipart_ml.c +src/libscotch/mesh_coarsen.c +src/libscotch/library_mesh_io_habo_f.c +src/libscotch/mesh_io.c +src/libscotch/library_dgraph_order_gather_f.c +src/libscotch/vdgraph_separate_st.c +src/libscotch/library_mesh_f.c +src/libscotch/library_geom_f.c +src/libscotch/dorder_io_block.c +src/libscotch/hmesh_order_bl.c +src/libscotch/library_error_exit.c +src/libscotch/common_sort.c +src/libscotch/arch_sub.c +src/libscotch/wgraph_store.c +src/libscotch/library_dgraph_order_tree_dist_f.c +src/libscotch/vgraph_separate_gg.c +src/libscotch/library_context_mesh_f.c +src/libscotch/graph_induce.c +src/libscotch/common_file_compress.c +src/libscotch/hgraph_order_hd.c +src/libscotch/library_dgraph_f.c +src/libscotch/library_dmapping.c +src/libscotch/mapping.c +src/libscotch/bdgraph_store.c +src/libscotch/hall_order_hd.c +src/libscotch/library_common_f.c +src/libscotch/wgraph_check.c +src/libscotch/hgraph_order_gp.c +src/libscotch/bdgraph_bipart_st.c +src/libscotch/bgraph_store.c +src/libscotch/library_dgraph_map_view_f.c +src/libscotch/vdgraph_check.c +src/libscotch/hdgraph.c +src/libscotch/hmesh_order_si.c +src/libscotch/library_graph_coarsen_f.c +src/libscotch/bgraph_bipart_bd.c +src/libscotch/library_order.c +src/libscotch/library_context_f.c +src/libscotch/arch_torus.c +src/libscotch/dgraph_gather.c +src/libscotch/mesh_io_scot.c +src/libscotch/vgraph_separate_gp.c +src/libscotch/library_mesh_order.c +src/libscotch/library_graph_diam_f.c +src/libscotch/hmesh_hgraph.c +src/libscotch/geom.c +src/libscotch/graph_coarsen_edge.c +src/libscotch/library_error.c +src/libscotch/library_dgraph_build_grid3d_f.c +src/libscotch/bdgraph_bipart_ml.c +src/libscotch/vgraph_separate_es.c +src/libscotch/library_mesh_io_scot_f.c +src/libscotch/library_mesh_graph.c +src/libscotch/library_geom.c +src/libscotch/library_graph_io_habo_f.c +src/libscotch/bdgraph.c +src/libscotch/library_arch_f.c +src/libscotch/vgraph_store.c +src/libscotch/wgraph_part_rb.c +src/libscotch/hdgraph_fold.c +src/libscotch/library_graph_io_mmkt.c +src/libscotch/vgraph_separate_df.c +src/libscotch/vdgraph.c +src/libscotch/kgraph_map_rb.c +src/libscotch/vmesh_separate_st.c +src/libscotch/dmapping_io.c +src/libscotch/arch_dist.c +src/libscotch/mapping_io.c +src/libscotch/library_graph_io_habo.c +src/libscotch/library_mesh_io_scot.c +src/libscotch/library_dgraph_order_f.c +src/libscotch/dorder_perm.c +src/libscotch/mesh_graph.c +src/libscotch/order_io.c +src/libscotch/kgraph_map_ex.c +src/libscotch/library_context_graph.c +src/libscotch/vmesh_store.c +src/libscotch/wgraph_part_fm.c +src/libscotch/vgraph_separate_zr.c +src/libscotch/library_context_dgraph.c +src/libscotch/hmesh_induce.c +src/libscotch/library_graph_f.c +src/libscotch/library_memory_f.c +src/libscotch/hgraph_order_hf.c +src/libscotch/bgraph_bipart_gp.c +src/libscotch/kgraph_store.c +src/libscotch/dgraph.c +src/libscotch/library_graph_part_ovl_f.c +src/libscotch/bgraph_bipart_gg.c +src/libscotch/library_graph_color.c +src/libscotch/library_dgraph_redist.c +src/libscotch/library_dgraph_stat_f.c +src/libscotch/kgraph_map_df.c +src/libscotch/order.c +src/libscotch/library_dgraph_band_f.c +src/libscotch/kgraph_map_rb_map.c +src/libscotch/library_dgraph_io_save.c +src/libscotch/library_version_f.c +src/libscotch/dgraph_fold.c +src/libscotch/library_graph_coarsen.c +src/libscotch/fibo.c +src/libscotch/common.c +src/libscotch/graph_check.c +src/libscotch/library_graph_induce.c +src/libscotch/library_mesh_graph_f.c +src/libscotch/kdgraph_map_rb.c +src/libscotch/dorder.c +src/libscotch/common_thread_system.c +src/libscotch/vdgraph_separate_zr.c +src/libscotch/dmapping.c +src/libscotch/bgraph_bipart_ex.c +src/libscotch/hmesh_order_cp.c +src/libscotch/vmesh_separate_gg.c +src/libscotch/hgraph_check.c +src/libscotch/library_dgraph_induce.c +src/libscotch/library_dgraph_io_save_f.c +src/libscotch/dummysizes.c +src/libscotch/arch_vcmplt.c +src/libscotch/dgraph_fold_dup.c +src/libscotch/library_graph_order_f.c +src/libscotch/hmesh_order_hd.c +src/libscotch/library_context.c +src/libscotch/library_dgraph_gather_f.c +src/libscotch/hall_order_hx.c +src/libscotch/library_dgraph.c +src/libscotch/graph_io_chac.c +src/libscotch/library_dgraph_order_io_f.c +src/libscotch/dgraph_io_load.c +src/libscotch/dgraph_band_grow.c +src/libscotch/dgraph_halo_fill.c +src/libscotch/hmesh_check.c +src/libscotch/dgraph_match_sync_coll.c +src/libscotch/hmesh_order_gr.c +src/libscotch/kdgraph_map_rb_map.c +src/libscotch/kgraph_map_rb_part.c +src/libscotch/library_parser_f.c +src/libscotch/dgraph_compact.c +src/libscotch/library_dgraph_scatter.c +src/libscotch/hgraph_dump.c +src/libscotch/kgraph_map_fm.c +src/libscotch/library_dgraph_halo.c +src/libscotch/bgraph_bipart_fm.c +src/libscotch/library_dgraph_redist_f.c +src/libscotch/dgraph_coarsen.c +src/libscotch/library_arch.c +src/libscotch/dorder_io_tree.c +src/libscotch/mesh_io_habo.c +src/libscotch/dgraph_match_check.c +src/libscotch/hdgraph_order_sq.c +src/libscotch/vgraph_check.c +src/libscotch/dgraph_redist.c +src/libscotch/wgraph.c +src/libscotch/common_error.c +src/libscotch/graph_match.c +src/libscotch/library_graph_map.c +src/libscotch/dgraph_match_scan.c +src/libscotch/bgraph_check.c +src/libscotch/common_context.c +src/libscotch/library_random_f.c +src/libscotch/kgraph_map_bd.c +src/libscotch/kgraph_check.c +src/libscotch/vgraph_separate_fm.c +src/libscotch/bgraph_bipart_st.c +src/libscotch/library_dgraph_order_tree_dist.c +src/libscotch/common_psort.c +src/libscotch/common_memory.c +src/libscotch/hgraph_order_nd.c +src/libscotch/graph_io_scot.c +src/libscotch/library_dorder.c +src/libscotch/common_thread.c +src/libscotch/library_mapping.c +src/libscotch/mesh.c +src/libscotch/library_graph_base.c +src/libscotch/graph_band.c +src/libscotch/parser.c +src/libscotch/hall_order_hf.c +src/libscotch/graph_list.c +src/libscotch/dorder_gather.c +src/libscotch/vdgraph_store.c +src/libscotch/vdgraph_separate_df.c +src/libscotch/library_errcom.c +src/libscotch/library_graph_map_io.c +src/libscotch/vdgraph_gather_all.c +src/libscotch/kdgraph_map_st.c +src/libscotch/wgraph_part_st.c +src/libscotch/vgraph_separate_bd.c +src/libscotch/kgraph_band.c +src/libscotch/arch_build.c +src/libscotch/graph_io_habo.c +src/libscotch/library_arch_build.c +src/libscotch/hgraph_order_kp.c +src/libscotch/kgraph_map_st.c +src/libscotch/library_graph_io_scot_f.c +src/libscotch/common_string.c +src/libscotch/library_mesh.c +src/libscotch/hgraph_order_cp.c +src/libscotch/dgraph_view.c +src/libscotch/library_dgraph_halo_f.c +src/libscotch/arch_build2.c +src/libscotch/bdgraph_bipart_sq.c +src/libscotch/library_arch_dom_f.c +src/libscotch/order_check.c +src/libscotch/library_dgraph_grow.c +src/libscotch/library_graph_map_view_f.c +src/libscotch/vmesh_separate_fm.c +src/libscotch/dgraph_allreduce.c +src/libscotch/vmesh_separate_zr.c +src/libscotch/common_file.c +src/libscotch/hgraph_induce_edge.c +src/libscotch/library_dgraph_order_perm_f.c +src/libscotch/hdgraph_check.c +src/libscotch/library_graph_io_scot.c +src/libscotch/library_graph_base_f.c +src/libscotch/hmesh_mesh.c +src/libscotch/library_graph_check_f.c +src/libscotch/wgraph_part_zr.c +src/libscotch/dgraph_band.c +src/libscotch/graph_base.c +src/libscotch/library_graph_map_io_f.c +src/libscotch/library_dgraph_stat.c +src/libscotch/arch_tleaf.c +src/libscotch/hmesh_order_st.c +src/libscotch/bdgraph_bipart_bd.c +src/libscotch/gain.c +src/libscotch/dgraph_build_hcub.c +src/libscotch/library_dgraph_order.c +src/libscotch/library_graph_check.c +src/libscotch/vmesh_separate_gr.c +src/libscotch/library_dgraph_check.c +src/libscotch/vmesh.c +src/libscotch/hmesh.c +src/libscotch/library_memory.c +src/libscotch/library_dgraph_induce_f.c +src/libscotch/dgraph_match_sync_ptop.c +src/libscotch/dgraph_build.c +src/libscotch/library_dgraph_gather.c +src/libscotch/hdgraph_order_si.c +src/libscotch/library_graph_part_ovl.c +src/libscotch/vgraph.c +src/libscotch/kdgraph.c +src/libscotch/hgraph_order_hx.c +src/libscotch/comm.c +src/libscotch/kdgraph_map_rb_part.c +src/libscotch/hdgraph_order_st.c +src/libscotch/library_context_mesh.c +src/libscotch/library_dgraph_map.c +src/libscotch/library_graph_induce_f.c +src/libscotch/library_version.c +src/libscotch/arch_deco.c +src/libscotch/graph_diam.c +src/libscotch/library_graph_map_f.c +src/libscotch/bgraph.c +src/libscotch/vgraph_separate_th.c +src/libscotch/arch_mesh.c +src/libscotch/library_graph_io_mmkt_f.c +src/libscotch/kgraph_map_cp.c +src/libscotch/library_random.c +src/libscotch/library_context_graph_f.c +src/libscotch/graph_coarsen.c +src/libscotch/library_dgraph_io_load_f.c +src/libscotch/hgraph_order_bl.c +src/libscotch/vdgraph_separate_bd.c +src/libscotch/dgraph_halo.c +src/libscotch/hgraph.c +src/libscotch/vgraph_separate_st.c +src/libscotch/hgraph_order_si.c +src/libscotch/vgraph_separate_vw.c +src/libscotch/library_graph_map_view.c +src/libscotch/kgraph_map_ml.c +src/libscotch/arch_cmpltw.c +src/libscotch/library_dgraph_band.c +src/libscotch/library_dgraph_io_load.c +src/libscotch/hdgraph_induce.c +src/libscotch/mesh_check.c +src/libscotch/hdgraph_gather.c +src/libscotch/graph_clone.c +src/libscotch/library_dgraph_map_view.c +src/libscotch/bgraph_bipart_zr.c +src/libscotch/dgraph_build_grid3d.c +src/libscotch/bdgraph_bipart_zr.c +src/libscotch/hmesh_order_hx.c +src/libscotch/bdgraph_gather_all.c +src/libscotch/library_dgraph_order_io.c +src/libscotch/arch_cmplt.c +src/libscotch/common_integer.c +src/libscotch/library_dgraph_order_perm.c +src/libscotch/bdgraph_bipart_df.c +src/libscotch/library_graph_color_f.c +src/libscotch/library_mesh_io_habo.c +src/libscotch/library_arch_build_f.c +src/libscotch/library_dgraph_order_io_block.c +src/libscotch/dgraph_scatter.c +src/libscotch/graph_io.c +src/libscotch/vdgraph_separate_ml.c +src/libscotch/graph_match_scan.c +src/libscotch/common_file_decompress.c +src/libscotch/library_dgraph_order_io_block_f.c +src/libscotch/dgraph_gather_all.c +src/libscotch/kgraph.c +src/libscotch/hdgraph_order_nd.c +src/libscotch/context.c +src/libscotch/library_dgraph_build.c +src/libscotch/arch_vhcub.c +src/libscotch/library_dgraph_order_gather.c +src/libscotchmetis/parmetis_dgraph_order.c +src/libscotchmetis/metis_options.c +src/libscotchmetis/metis_graph_order.c +src/libscotchmetis/metis_options_f.c +src/libscotchmetis/metis_graph_dual.c +src/libscotchmetis/metis_graph_part_dual.c +src/libscotchmetis/metis_graph_part_f.c +src/libscotchmetis/parmetis_dgraph_order_f.c +src/libscotchmetis/metis_graph_part.c +src/libscotchmetis/metis_graph_part_dual_f.c +src/libscotchmetis/metis_graph_dual_f.c +src/libscotchmetis/parmetis_dgraph_part_f.c +src/libscotchmetis/metis_graph_order_f.c +src/libscotchmetis/parmetis_dgraph_part.c +src/esmumps/symbol_fax_graph.c +src/esmumps/symbol.c +src/esmumps/library_esmumps_strats.c +src/esmumps/order_scotch_graph.c +src/esmumps/main_esmumps.c +src/esmumps/order.c +src/esmumps/symbol_fax.c +src/esmumps/library_esmumps.c +src/esmumps/esmumps.c +src/esmumps/order_check.c +src/esmumps/symbol_cost.c +src/esmumps/library_esmumps_f.c +src/esmumps/dof.c +src/esmumps/symbol_check.c +src/esmumps/graph_graph.c +src/scotch/dgord.c +src/scotch/dgtst.c +src/scotch/gscat.c +src/scotch/gtst.c +src/scotch/amk_grf.c +src/scotch/amk_hy.c +src/scotch/gcv.c +src/scotch/gotst.c +src/scotch/mmk_m3.c +src/scotch/amk_m2.c +src/scotch/gmk_msh.c +src/scotch/gmk_m2.c +src/scotch/gmtst.c +src/scotch/amk_p2.c +src/scotch/dggath.c +src/scotch/amk_ccc.c +src/scotch/gord.c +src/scotch/mcv.c +src/scotch/dgmap.c +src/scotch/gdump.c +src/scotch/gmk_m3.c +src/scotch/gmk_ub2.c +src/scotch/amk_fft2.c +src/scotch/mord.c +src/scotch/gmk_hy.c +src/scotch/gout_o.c +src/scotch/gmap.c +src/scotch/gbase.c +src/scotch/atst.c +src/scotch/mmk_m2.c +src/scotch/acpl.c +src/scotch/gout_c.c +src/scotch/dgscat.c +src/scotch/mtst.c +src/check/test_scotch_dgraph_band.c +src/check/test_scotch_mesh_graph.c +src/check/test_scotch_dgraph_check.c +src/check/test_scotch_dgraph_induce.c +src/check/test_libmetis.c +src/check/test_scotch_graph_induce.c +src/check/test_scotch_graph_diam.c +src/check/test_scotch_dgraph_redist.c +src/check/test_scotch_arch.c +src/check/test_fibo.c +src/check/test_strat_par.c +src/check/test_strat_seq.c +src/check/test_scotch_context.c +src/check/test_scotch_graph_coarsen.c +src/check/test_common_random.c +src/check/test_libmetis_dual.c +src/check/test_scotch_dgraph_grow.c +src/check/test_libesmumps.c +src/check/test_common_thread.c +src/check/test_scotch_graph_map_copy.c +src/check/test_scotch_graph_part_ovl.c +src/check/test_scotch_graph_order.c +src/check/test_common_file_compress.c +src/check/test_scotch_graph_map.c +src/check/test_scotch_graph_color.c +src/check/test_scotch_arch_deco.c +src/check/test_scotch_graph_dump.c +src/check/test_multilib.c +src/check/test_scotch_dgraph_coarsen.c + + High + fixed size global buffer + + Extra care should be taken to ensure that character arrays that are + allocated on the stack are used safely. They are prime targets for + buffer overflow attacks. + + + src/libscotch/dgraph_io_save.c + 78 + + + src/libscotch/graph_io_mmkt.c + 101 + + + src/libscotch/arch.c + 193 + + + src/libscotch/library_graph_order.c + 506 + 507 + 508 + + + src/libscotch/mesh_io.c + 102 + 325 + + + src/libscotch/library_mesh_order.c + 409 + 410 + + + src/libscotch/dummysizes.c + 181 + 182 + 183 + + + src/libscotch/graph_io_chac.c + 84 + 89 + + + src/libscotch/dgraph_io_load.c + 199 + 669 + + + src/libscotch/mesh_io_habo.c + 78 + 79 + + + src/libscotch/library_graph_map.c + 654 + 655 + 656 + 657 + 658 + 723 + 724 + 725 + 726 + + + src/libscotch/library_errcom.c + 82 + 110 + + + src/libscotch/graph_io_habo.c + 86 + 87 + + + src/libscotch/library_dgraph_order.c + 271 + 272 + 273 + 274 + + + src/libscotch/library_graph_part_ovl.c + 166 + 167 + + + src/libscotch/library_dgraph_map.c + 293 + 294 + 295 + 296 + 371 + 372 + 373 + 374 + 375 + + + src/libscotch/vgraph_separate_vw.c + 86 + + + src/libscotch/graph_io.c + 108 + 337 + + + src/scotch/gscat.c + 146 + + + src/scotch/gout_o.c + 818 + + + src/scotch/gout_c.c + 673 + + + + High + fprintf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/libscotch/dgraph_io_save.c + 121 + 139 + 141 + 143 + 149 + 150 + + + src/libscotch/graph_io_mmkt.c + 280 + 290 + 306 + + + src/libscotch/library_graph_dump.c + 91 + 111 + + + src/libscotch/arch_hcub.c + 134 + 349 + + + src/libscotch/arch_deco2.c + 299 + 308 + 317 + 339 + 348 + 354 + 783 + + + src/libscotch/graph_dump.c + 97 + 107 + 115 + 119 + 122 + 130 + 133 + 164 + 169 + + + src/libscotch/dorder_io.c + 194 + 206 + 217 + + + src/libscotch/mesh_io.c + 338 + 383 + 385 + 386 + + + src/libscotch/dorder_io_block.c + 94 + + + src/libscotch/arch_sub.c + 154 + 162 + 785 + + + src/libscotch/mesh_io_scot.c + 229 + 236 + 242 + 249 + + + src/libscotch/dmapping_io.c + 143 + 199 + 227 + + + src/libscotch/arch_dist.c + 119 + + + src/libscotch/mapping_io.c + 223 + 230 + + + src/libscotch/order_io.c + 145 + 156 + 167 + 202 + 226 + 261 + 287 + + + src/libscotch/dummysizes.c + 218 + + + src/libscotch/arch_vcmplt.c + 218 + + + src/libscotch/graph_io_chac.c + 285 + 296 + 300 + 309 + 313 + 318 + + + src/libscotch/hgraph_dump.c + 88 + 94 + 100 + + + src/libscotch/graph_io_scot.c + 233 + 240 + 246 + 253 + + + src/libscotch/parser.c + 250 + 606 + + + src/libscotch/graph_list.c + 230 + + + src/libscotch/vdgraph_separate_df.c + 365 + + + src/libscotch/library_graph_map_io.c + 212 + 218 + + + src/libscotch/dgraph_view.c + 101 + 110 + 116 + 120 + 123 + 130 + 137 + 142 + 160 + + + src/libscotch/arch_tleaf.c + 197 + 204 + 563 + 776 + 783 + + + src/libscotch/arch_deco.c + 397 + 405 + 416 + 567 + + + src/libscotch/arch_mesh.c + 147 + 439 + 711 + 718 + 1027 + + + src/libscotch/vgraph_separate_vw.c + 96 + 100 + + + src/libscotch/library_graph_map_view.c + 369 + 373 + 447 + 504 + 507 + 511 + 527 + 557 + 564 + 575 + 783 + 785 + 791 + + + src/libscotch/arch_cmpltw.c + 277 + 287 + 498 + + + src/libscotch/library_dgraph_map_view.c + 224 + 228 + 298 + 359 + 362 + 366 + 380 + + + src/libscotch/arch_cmplt.c + 135 + 369 + + + src/libscotch/common_integer.c + 136 + 352 + 372 + + + src/libscotch/graph_io.c + 345 + 359 + 361 + 363 + 371 + 373 + + + src/libscotch/arch_vhcub.c + 218 + + + src/esmumps/esmumps.c + 163 + + + src/scotch/dgord.c + 257 + 258 + 259 + + + src/scotch/dgtst.c + 178 + 179 + 180 + 213 + 215 + 217 + 219 + 221 + + + src/scotch/gscat.c + 118 + 119 + 120 + 203 + 279 + + + src/scotch/gtst.c + 141 + 142 + 143 + 163 + 165 + 167 + 169 + 171 + + + src/scotch/amk_grf.c + 159 + 160 + 161 + + + src/scotch/amk_hy.c + 137 + 138 + 139 + 152 + 157 + 165 + + + src/scotch/gcv.c + 191 + 192 + 193 + + + src/scotch/gotst.c + 142 + 143 + 144 + 253 + + + src/scotch/mmk_m3.c + 144 + 145 + 146 + 161 + 172 + 193 + 196 + 201 + 204 + 211 + 214 + 219 + 222 + 232 + 238 + 248 + + + src/scotch/amk_m2.c + 177 + 178 + 179 + 204 + 208 + 215 + + + src/scotch/gmk_msh.c + 129 + 130 + 131 + + + src/scotch/gmk_m2.c + 183 + 184 + 185 + 204 + 234 + 259 + 264 + 303 + + + src/scotch/gmtst.c + 136 + 137 + 138 + + + src/scotch/amk_p2.c + 125 + 126 + 127 + 137 + + + src/scotch/dggath.c + 167 + 168 + 169 + + + src/scotch/amk_ccc.c + 145 + 146 + 147 + 164 + 182 + 214 + 217 + + + src/scotch/gord.c + 211 + 212 + 213 + + + src/scotch/mcv.c + 164 + 165 + 166 + + + src/scotch/dgmap.c + 309 + 310 + 311 + + + src/scotch/gdump.c + 126 + 127 + 128 + + + src/scotch/gmk_m3.c + 158 + 159 + 160 + 175 + 186 + 191 + 194 + 197 + 200 + 203 + 206 + 214 + 230 + 233 + 236 + 239 + 242 + 245 + 254 + 260 + + + src/scotch/gmk_ub2.c + 152 + 153 + 154 + 167 + 180 + + + src/scotch/amk_fft2.c + 142 + 143 + 144 + 160 + 183 + 228 + 231 + + + src/scotch/mord.c + 183 + 184 + 185 + + + src/scotch/gmk_hy.c + 134 + 135 + 136 + 149 + 154 + 157 + + + src/scotch/gout_o.c + 373 + 473 + 486 + 490 + 847 + 850 + 866 + 878 + 894 + 937 + 1049 + 1057 + 1065 + 1066 + 1069 + 1074 + 1080 + + + src/scotch/gmap.c + 329 + 330 + 331 + + + src/scotch/gbase.c + 132 + 133 + 134 + + + src/scotch/atst.c + 135 + 136 + 137 + 193 + 195 + + + src/scotch/mmk_m2.c + 143 + 144 + 145 + 159 + 167 + 181 + 184 + 189 + 192 + 200 + 205 + 212 + + + src/scotch/acpl.c + 126 + 127 + 128 + + + src/scotch/gout_c.c + 195 + 196 + 197 + + + src/scotch/dgscat.c + 164 + 165 + 166 + + + src/scotch/mtst.c + 131 + 132 + 133 + 152 + 154 + 156 + 158 + 160 + 162 + + + + High + fscanf + + Check to be sure that the format string passed as argument 2 to this + function call does not come from an untrusted source that could have added + formatting characters that the code is not prepared to handle. + Additionally, the format string could contain `%s' without precision that + could result in a buffer overflow. + + + src/libscotch/arch.c + 195 + + + src/libscotch/library_graph_map_io.c + 101 + 122 + + + src/libscotch/common_integer.c + 301 + 327 + + + src/scotch/gout_c.c + 355 + 379 + 403 + 427 + 573 + 591 + + + + High + sprintf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/libscotch/library_graph_order.c + 515 + 517 + + + src/libscotch/library_graph_map.c + 666 + 667 + 732 + + + src/libscotch/common_file.c + 96 + 149 + + + src/libscotch/library_dgraph_order.c + 285 + 286 + + + src/libscotch/library_dgraph_map.c + 309 + 385 + 389 + + + + High + sprintf + + Check to be sure that the format string passed as argument 2 to this + function call does not come from an untrusted source that could have added + formatting characters that the code is not prepared to handle. + Additionally, the format string could contain `%s' without precision that + could result in a buffer overflow. + + + src/libscotch/library_graph_order.c + 515 + 517 + + + src/libscotch/dummysizes.c + 161 + 347 + 355 + + + src/libscotch/library_graph_map.c + 666 + 667 + 732 + + + src/libscotch/common_file.c + 96 + 149 + + + src/libscotch/library_dgraph_order.c + 285 + 286 + + + src/libscotch/library_dgraph_map.c + 309 + 385 + 389 + + + + High + vfprintf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/libscotch/library_error_exit.c + 133 + 176 + + + src/libscotch/library_error.c + 131 + 168 + + + src/libscotch/common_error.c + 97 + 119 + + + + High + getenv + + Environment variables are highly untrustable input. They may be of any length, and contain any data. Do not make any assumptions regarding content or length. If at all possible avoid using them, and if it is necessary, sanitize them and truncate them to a reasonable length. + + + src/libscotch/common.c + 85 + + + + High + + Check to be sure that argument 2 passed to this function call will not + copy more data than can be handled, resulting in a buffer overflow. + + + src/libscotch/dummysizes.c + 346 + 354 + + + src/libscotch/library_graph_map.c + 669 + + + + High + vsprintf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/libscotch/library_errcom.c + 88 + 116 + + + + High + vsprintf + + Check to be sure that the format string passed as argument 2 to this + function call does not come from an untrusted source that could have added + formatting characters that the code is not prepared to handle. + Additionally, the format string could contain `%s' without precision that + could result in a buffer overflow. + + + src/libscotch/library_errcom.c + 88 + 116 + + + + High + fscanf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/libscotch/library_graph_map_io.c + 101 + 122 + + + src/libscotch/common_integer.c + 301 + 327 + + + src/scotch/gout_c.c + 355 + 379 + 403 + 427 + 573 + 591 + + + + High + scanf + + Check to be sure that the format string passed as argument 2 to this + function call does not come from an untrusted source that could have added + formatting characters that the code is not prepared to handle. + Additionally, the format string could contain `%s' without precision that + could result in a buffer overflow. + + + src/scotch/dgord.c + 298 + + + src/scotch/dgtst.c + 195 + + + src/scotch/dggath.c + 184 + + + src/scotch/dgmap.c + 359 + + + src/scotch/dgscat.c + 181 + + + src/check/test_scotch_dgraph_band.c + 125 + + + src/check/test_scotch_dgraph_check.c + 116 + + + src/check/test_scotch_dgraph_induce.c + 123 + + + src/check/test_scotch_dgraph_redist.c + 118 + + + src/check/test_scotch_dgraph_grow.c + 129 + + + src/check/test_scotch_dgraph_coarsen.c + 123 + + + + High + sscanf + + Check to be sure that the non-constant format string passed as argument 2 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/scotch/gout_c.c + 725 + + + + High + sscanf + + Check to be sure that the format string passed as argument 2 to this + function call does not come from an untrusted source that could have added + formatting characters that the code is not prepared to handle. + Additionally, the format string could contain `%s' without precision that + could result in a buffer overflow. + + + src/scotch/gout_c.c + 725 + + + + High + printf + + Check to be sure that the non-constant format string passed as argument 1 + to this function call does not come from an untrusted source that could + have added formatting characters that the code is not prepared to handle. + + + src/check/test_scotch_context.c + 108 + 121 + + + src/check/test_scotch_graph_coarsen.c + 276 + 292 + 304 + 319 + 339 + + + + Medium + fgetc + + Check buffer boundaries if calling this function in a loop +and make sure you are not in danger of writing past the allocated space. + + + src/libscotch/graph_io_mmkt.c + 132 + + + + Medium + read + + Check buffer boundaries if calling this function in a loop +and make sure you are not in danger of writing past the allocated space. + + + src/libscotch/common_file_compress.c + 294 + 333 + 384 + + + + Medium + getc + + Check buffer boundaries if calling this function in a loop +and make sure you are not in danger of writing past the allocated space. + + + src/libscotch/graph_io_chac.c + 102 + 105 + 119 + 175 + 178 + 207 + + + src/libscotch/mesh_io_habo.c + 135 + 145 + 192 + 195 + 224 + 227 + + + src/libscotch/graph_io_habo.c + 158 + 168 + 218 + 223 + 224 + 227 + 232 + 256 + 261 + 262 + 265 + 269 + + + src/libscotch/common_integer.c + 93 + 100 + 104 + 113 + + + src/check/test_common_random.c + 180 + + + + Medium + realloc + + Don't use on memory intended to be secure, because the old structure will not be zeroed out. + + + src/libscotch/common_memory.c + 344 + + + + Medium + tmpfile + + Many calls for generating temporary file names are +insecure (susceptible to race conditions). Use a securely generated file +name, for example, by pulling 64 bits of randomness from /dev/random, base +64 encoding it and using that as a file suffix. + + + src/check/test_scotch_graph_order.c + 117 + + + src/check/test_scotch_graph_map.c + 154 + + + + Low + fgets + + Double check that your buffer is as big as you specify. +When using functions that accept a number n of bytes to copy, such as +strncpy, be aware that if the dest buffer size = n it may not NULL-terminate +the string. + + + src/libscotch/graph_io_mmkt.c + 115 + 133 + 181 + + + src/libscotch/dummysizes.c + 323 + + + src/libscotch/mesh_io_habo.c + 102 + 103 + 104 + 105 + + + src/libscotch/graph_io_habo.c + 123 + 124 + 125 + 126 + + + + Low + fork + + Remember that sensitive data get copied on fork. For example, a random + number generator's internal state will get duplicated, and the child + may start outputting identical number streams. + + + src/libscotch/common_stub.c + 74 + + + src/libscotch/common_file_compress.c + 248 + + + src/libscotch/common_file_decompress.c + 225 + + + + Low + Static Global Buffer + + Extra care should be taken to ensure that character arrays that are + allocated with a static size are used safely. This appears to be a + global allocation and is less dangerous than a similar one on the stack. + Extra caution is still advised, however. + + + src/libscotch/library_error_exit.c + 71 + + + src/libscotch/library_error.c + 69 + + + src/libscotch/common_error.c + 63 + + + src/libscotch/common_memory.c + 82 + + + src/libscotch/parser.c + 553 + 554 + + + + Low + strlen + + This function does not properly handle non-NULL terminated +strings. This does not result in exploitable code, but can lead to access +violations. + + + src/libscotch/library_error_exit.c + 89 + + + src/libscotch/common_file_compress.c + 142 + 146 + + + src/libscotch/library_error.c + 87 + + + src/libscotch/dummysizes.c + 327 + 340 + 348 + + + src/libscotch/common_string.c + 79 + 105 + 106 + + + src/libscotch/common_file.c + 89 + + + src/libscotch/common_file_decompress.c + 119 + 123 + + + src/scotch/gout_o.c + 834 + + + src/scotch/gout_c.c + 685 + + + + Low + strncpy + + Double check that your buffer is as big as you specify. +When using functions that accept a number n of bytes to copy, such as +strncpy, be aware that if the dest buffer size = n it may not NULL-terminate +the string. Also, consider using strlcpy() instead, if it is avaialable to you. + + + src/libscotch/library_error_exit.c + 98 + + + src/libscotch/library_error.c + 96 + + + src/libscotch/library_arch_f.c + 210 + + + src/libscotch/common_error.c + 75 + + + src/scotch/gout_o.c + 832 + + + src/scotch/gout_c.c + 706 + + + + Low + fixed size local buffer + + A potential race condition vulnerability exists here. Normally a call + to this function is vulnerable only when a match check precedes it. No + check was detected, however one could still exist that could not be + detected. + + + src/libscotch/dummysizes.c + 232 + + + src/libscotch/common_file.c + 216 + + + src/libscotch/vgraph_separate_vw.c + 91 + + + src/esmumps/main_esmumps.c + 95 + + + src/scotch/gscat.c + 194 + + + src/check/test_scotch_dgraph_band.c + 141 + 188 + + + src/check/test_scotch_mesh_graph.c + 91 + + + src/check/test_scotch_dgraph_check.c + 132 + + + src/check/test_scotch_dgraph_induce.c + 139 + + + src/check/test_libmetis.c + 110 + + + src/check/test_scotch_graph_induce.c + 95 + + + src/check/test_scotch_graph_diam.c + 88 + + + src/check/test_scotch_dgraph_redist.c + 138 + + + src/check/test_scotch_arch.c + 146 + 163 + + + src/check/test_scotch_context.c + 221 + + + src/check/test_scotch_graph_coarsen.c + 249 + + + src/check/test_common_random.c + 105 + + + src/check/test_scotch_dgraph_grow.c + 145 + 204 + + + src/check/test_libesmumps.c + 100 + + + src/check/test_scotch_graph_map_copy.c + 98 + + + src/check/test_scotch_graph_part_ovl.c + 120 + 201 + + + src/check/test_scotch_graph_order.c + 94 + + + src/check/test_scotch_graph_map.c + 105 + + + src/check/test_scotch_graph_color.c + 91 + + + src/check/test_scotch_arch_deco.c + 99 + 117 + 172 + + + src/check/test_scotch_graph_dump.c + 94 + + + src/check/test_multilib.c + 90 + 102 + + + src/check/test_scotch_dgraph_coarsen.c + 139 + + + + Low + memcpy + + Double check that your buffer is as big as you specify. +When using functions that accept a number n of bytes to copy, such as +strncpy, be aware that if the dest buffer size = n it may not NULL-terminate +the string. + + + src/check/test_libesmumps.c + 123 + 134 + 138 + + + src/check/test_scotch_graph_map_copy.c + 147 + + + src/check/test_scotch_graph_map.c + 202 + + + +125746 +0.053346 +2357177 + + +``` + +## 2.功能性测试 + +### 2.1.所选测试案例 + +scotch内置了大量的单元测试,可以使用其进行单元测试文件内容。 + +单元测试文件列表(部分)如下 + +```bash +[root@host- build]# root@zubinshuo-PC 11:46:26 ~/scotch |main ↑1 ✓| → tree src/check/ +check +├── CMakeLists.txt +├── data +│   ├── bump_b100000.grf +│   ├── bump_b1.grf +│   ├── bump.grf +│   ├── bump_imbal_32.grf +│   ├── bump_old.map +│   ├── bump.xyz +│   ├── compress-coarsen.grf +│   ├── cube_8_d3.grf +│   ├── cube_8.msh +│   ├── m16x16_b100000.grf +│   ├── m16x16_b1.grf +│   ├── m16x16.grf +│   ├── m4x4_b100000.grf +│   ├── m4x4_b1_elv.grf +│   ├── m4x4_b1_ev.grf +│   ├── m4x4_b1.grf +│   ├── m4x4.grf +│   ├── m4x4_vertlist.txt +│   ├── nocoarsen.grf +│   ├── p2-p2.grf +│   ├── ship001.msh +│   ├── small_0.grf +│   ├── small_1.grf +│   ├── small_2.grf +│   ├── small_3.grf +│   ├── small_55_d1.grf +│   ├── small_55_d2.grf +│   ├── small_55.msh +│   └── small.grf +├── Makefile +├── test_common_file_compress.c +├── test_common_random.c +├── test_common_thread.c +├── test_fibo.c +├── test_libesmumps.c +├── test_libmetis.c +├── test_libmetis_dual.c +├── test_libmetis_dual_f.f90 +├── test_multilib.c +├── test_scotch_arch.c +├── test_scotch_arch_deco.c +├── test_scotch_context.c +├── test_scotch_dgraph_band.c +├── test_scotch_dgraph_check.c +├── test_scotch_dgraph_coarsen.c +├── test_scotch_dgraph_grow.c +├── test_scotch_dgraph_induce.c +├── test_scotch_dgraph_redist.c +├── test_scotch_graph_coarsen.c +├── test_scotch_graph_color.c +├── test_scotch_graph_diam.c +├── test_scotch_graph_dump.c +├── test_scotch_graph_induce.c +├── test_scotch_graph_map.c +├── test_scotch_graph_map_copy.c +├── test_scotch_graph_order.c +├── test_scotch_graph_part_ovl.c +├── test_scotch_mesh_graph.c +├── test_strat_par.c +└── test_strat_seq.c + +1 directory, 61 files +... + +``` + +在项目根目录下执行命令来运行单元测试和确定性测试 + +```bash +export OMPI_ALLOW_RUN_AS_ROOT=1 +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +make test +``` + +### 2.2.运行结果 + +```bash +[root@host- build]# make test +Running tests... +Test project /root/hpcrunner/tmp/scotch-v7.0.1/build + Start 1: test_common_file_compress_bz2 + 1/138 Test #1: test_common_file_compress_bz2 ............. Passed 0.05 sec + Start 2: test_common_file_compress_gz + 2/138 Test #2: test_common_file_compress_gz .............. Passed 0.10 sec + Start 3: test_common_file_compress_lzma + 3/138 Test #3: test_common_file_compress_lzma ............ Passed 0.15 sec + Start 4: test_common_random_0 + 4/138 Test #4: test_common_random_0 ...................... Passed 2.00 sec + Start 5: test_common_random_1 + 5/138 Test #5: test_common_random_1 ...................... Passed 0.00 sec + Start 6: test_common_thread + 6/138 Test #6: test_common_thread ........................ Passed 0.00 sec + Start 7: test_fibo + 7/138 Test #7: test_fibo ................................. Passed 0.00 sec + Start 8: test_libesmumps_1 + 8/138 Test #8: test_libesmumps_1 ......................... Passed 0.08 sec + Start 9: test_libesmumps_2 + 9/138 Test #9: test_libesmumps_2 ......................... Passed 0.13 sec + Start 10: test_libmetisv3_1 + 10/138 Test #10: test_libmetisv3_1 ......................... Passed 0.27 sec + Start 11: test_libmetisv3_2 + 11/138 Test #11: test_libmetisv3_2 ......................... Passed 0.27 sec + Start 12: test_libmetisv3_3 + 12/138 Test #12: test_libmetisv3_3 ......................... Passed 0.27 sec + Start 13: test_libmetis_dualv3 + 13/138 Test #13: test_libmetis_dualv3 ...................... Passed 0.03 sec + Start 14: test_libmetis_dual_f_v3 + 14/138 Test #14: test_libmetis_dual_f_v3 ................... Passed 0.02 sec + Start 15: test_libmetisv5_1 + 15/138 Test #15: test_libmetisv5_1 ......................... Passed 0.12 sec + Start 16: test_libmetisv5_2 + 16/138 Test #16: test_libmetisv5_2 ......................... Passed 0.12 sec + Start 17: test_libmetisv5_3 + 17/138 Test #17: test_libmetisv5_3 ......................... Passed 0.12 sec + Start 18: test_libmetis_dualv5 + 18/138 Test #18: test_libmetis_dualv5 ...................... Passed 0.01 sec + Start 19: test_libmetis_dual_f_v5 + 19/138 Test #19: test_libmetis_dual_f_v5 ................... Passed 0.01 sec + Start 20: test_scotch_arch + 20/138 Test #20: test_scotch_arch .......................... Passed 0.00 sec + Start 21: test_scotch_arch_deco + 21/138 Test #21: test_scotch_arch_deco ..................... Passed 0.02 sec + Start 22: test_scotch_context + 22/138 Test #22: test_scotch_context ....................... Passed 0.00 sec + Start 23: test_scotch_graph_coarsen_1 + 23/138 Test #23: test_scotch_graph_coarsen_1 ............... Passed 0.01 sec + Start 24: test_scotch_graph_coarsen_2 + 24/138 Test #24: test_scotch_graph_coarsen_2 ............... Passed 0.02 sec + Start 25: test_scotch_graph_color_1 + 25/138 Test #25: test_scotch_graph_color_1 ................. Passed 0.01 sec + Start 26: test_scotch_graph_color_2 + 26/138 Test #26: test_scotch_graph_color_2 ................. Passed 0.01 sec + Start 27: test_scotch_graph_diam_1 + 27/138 Test #27: test_scotch_graph_diam_1 .................. Passed 0.01 sec + Start 28: test_scotch_graph_diam_2 + 28/138 Test #28: test_scotch_graph_diam_2 .................. Passed 0.00 sec + Start 29: test_scotch_graph_diam_3 + 29/138 Test #29: test_scotch_graph_diam_3 .................. Passed 0.00 sec + Start 30: test_scotch_graph_diam_4 + 30/138 Test #30: test_scotch_graph_diam_4 .................. Passed 0.01 sec + Start 31: test_scotch_graph_induce_1 + 31/138 Test #31: test_scotch_graph_induce_1 ................ Passed 0.01 sec + Start 32: test_scotch_graph_induce_2 + 32/138 Test #32: test_scotch_graph_induce_2 ................ Passed 0.01 sec + Start 33: test_scotch_graph_1 + 33/138 Test #33: test_scotch_graph_1 ....................... Passed 0.01 sec + Start 34: test_scotch_graph_2 + 34/138 Test #34: test_scotch_graph_2 ....................... Passed 0.00 sec + Start 35: test_scotch_graph_3 + 35/138 Test #35: test_scotch_graph_3 ....................... Passed 0.09 sec + Start 36: test_scotch_graph_4 + 36/138 Test #36: test_scotch_graph_4 ....................... Passed 0.09 sec + Start 37: test_scotch_graph_map_copy_1 + 37/138 Test #37: test_scotch_graph_map_copy_1 .............. Passed 0.10 sec + Start 38: test_scotch_graph_map_copy_2 + 38/138 Test #38: test_scotch_graph_map_copy_2 .............. Passed 0.10 sec + Start 39: test_scotch_graph_order_1 + 39/138 Test #39: test_scotch_graph_order_1 ................. Passed 0.09 sec + Start 40: test_scotch_graph_order_2 + 40/138 Test #40: test_scotch_graph_order_2 ................. Passed 0.09 sec + Start 41: test_scotch_graph_part_ovl_1 + 41/138 Test #41: test_scotch_graph_part_ovl_1 .............. Passed 0.00 sec + Start 42: test_scotch_graph_part_ovl_2 + 42/138 Test #42: test_scotch_graph_part_ovl_2 .............. Passed 0.00 sec + Start 43: test_scotch_mesh_graph + 43/138 Test #43: test_scotch_mesh_graph .................... Passed 0.10 sec + Start 44: test_strat_seq + 44/138 Test #44: test_strat_seq ............................ Passed 0.00 sec + Start 45: test_strat_par + 45/138 Test #45: test_strat_par ............................ Passed 0.00 sec + Start 46: test_scotch_dgraph_band_bump + 46/138 Test #46: test_scotch_dgraph_band_bump .............. Passed 0.34 sec + Start 47: test_scotch_dgraph_band_bump_b100000 + 47/138 Test #47: test_scotch_dgraph_band_bump_b100000 ...... Passed 0.18 sec + Start 48: test_scotch_dgraph_coarsen_bump + 48/138 Test #48: test_scotch_dgraph_coarsen_bump ........... Passed 0.18 sec + Start 49: test_scotch_dgraph_coarsen_bump_b100000 + 49/138 Test #49: test_scotch_dgraph_coarsen_bump_b100000 ... Passed 0.18 sec + Start 50: test_scotch_dgraph_coarsen_m4x4_b1 + 50/138 Test #50: test_scotch_dgraph_coarsen_m4x4_b1 ........ Passed 0.16 sec + Start 51: test_scotch_dgraph_check_bump + 51/138 Test #51: test_scotch_dgraph_check_bump ............. Passed 0.17 sec + Start 52: test_scotch_dgraph_check_bump_b100000 + 52/138 Test #52: test_scotch_dgraph_check_bump_b100000 ..... Passed 0.18 sec + Start 53: test_scotch_dgraph_grow_bump + 53/138 Test #53: test_scotch_dgraph_grow_bump .............. Passed 0.17 sec + Start 54: test_scotch_dgraph_grow_bump_b100000 + 54/138 Test #54: test_scotch_dgraph_grow_bump_b100000 ...... Passed 0.18 sec + Start 55: test_scotch_dgraph_induce_bump + 55/138 Test #55: test_scotch_dgraph_induce_bump ............ Passed 0.17 sec + Start 56: test_scotch_dgraph_induce_bump_b100000 + 56/138 Test #56: test_scotch_dgraph_induce_bump_b100000 .... Passed 0.18 sec + Start 57: test_scotch_dgraph_redist_bump + 57/138 Test #57: test_scotch_dgraph_redist_bump ............ Passed 0.18 sec + Start 58: test_scotch_dgraph_redist_bump_b100000 + 58/138 Test #58: test_scotch_dgraph_redist_bump_b100000 .... Passed 0.18 sec + Start 59: amk_acpl + 59/138 Test #59: amk_acpl .................................. Passed 0.01 sec + Start 60: amk_ccc + 60/138 Test #60: amk_ccc ................................... Passed 0.00 sec + Start 61: amk_fft2 + 61/138 Test #61: amk_fft2 .................................. Passed 0.00 sec + Start 62: amk_hy + 62/138 Test #62: amk_hy .................................... Passed 0.00 sec + Start 63: amk_m2 + 63/138 Test #63: amk_m2 .................................... Passed 0.00 sec + Start 64: amk_m2_mo + 64/138 Test #64: amk_m2_mo ................................. Passed 0.00 sec + Start 65: amk_p2 + 65/138 Test #65: amk_p2 .................................... Passed 0.00 sec + Start 66: amk_grf_m16x16 + 66/138 Test #66: amk_grf_m16x16 ............................ Passed 0.02 sec + Start 67: amk_grf_m16x16_2 + 67/138 Test #67: amk_grf_m16x16_2 .......................... Passed 0.00 sec + Start 68: amk_grf_m4x4 + 68/138 Test #68: amk_grf_m4x4 .............................. Passed 0.00 sec + Start 69: amk_grf_m4x4_2 + 69/138 Test #69: amk_grf_m4x4_2 ............................ Passed 0.00 sec + Start 70: atst_4x4x4 + 70/138 Test #70: atst_4x4x4 ................................ Passed 0.01 sec + Start 71: test_gbase_1 + 71/138 Test #71: test_gbase_1 .............................. Passed 0.01 sec + Start 72: test_gbase_2 + 72/138 Test #72: test_gbase_2 .............................. Passed 0.01 sec + Start 73: test_gbase_3 + 73/138 Test #73: test_gbase_3 .............................. Passed 0.01 sec + Start 74: gmk_hy + 74/138 Test #74: gmk_hy .................................... Passed 0.00 sec + Start 75: gmk_m2 + 75/138 Test #75: gmk_m2 .................................... Passed 0.00 sec + Start 76: gmk_m2_b1 + 76/138 Test #76: gmk_m2_b1 ................................. Passed 0.00 sec + Start 77: gmk_m2_t + 77/138 Test #77: gmk_m2_t .................................. Passed 0.00 sec + Start 78: gmk_m2_b1_t + 78/138 Test #78: gmk_m2_b1_t ............................... Passed 0.00 sec + Start 79: gmk_m3 + 79/138 Test #79: gmk_m3 .................................... Passed 0.00 sec + Start 80: gmk_ub2 + 80/138 Test #80: gmk_ub2 ................................... Passed 0.00 sec + Start 81: gmk_msh_5_1 + 81/138 Test #81: gmk_msh_5_1 ............................... Passed 0.01 sec + Start 82: gmk_msh_5_4 + 82/138 Test #82: gmk_msh_5_4 ............................... Passed 0.01 sec + Start 83: gmk_msh_3_5_4_3 + 83/138 Test #83: gmk_msh_3_5_4_3 ........................... Passed 0.01 sec + Start 84: gmk_msh_ship001 + 84/138 Test #84: gmk_msh_ship001 ........................... Passed 1.55 sec + Start 85: gmk_msh_dual_1 + 85/138 Test #85: gmk_msh_dual_1 ............................ Passed 0.04 sec + Start 86: gmk_msh_dual_2 + 86/138 Test #86: gmk_msh_dual_2 ............................ Passed 0.01 sec + Start 87: gmk_msh_dual_3 + 87/138 Test #87: gmk_msh_dual_3 ............................ Passed 0.01 sec + Start 88: mmk_m2_5_1 + 88/138 Test #88: mmk_m2_5_1 ................................ Passed 0.01 sec + Start 89: mmk_m2_5_4 + 89/138 Test #89: mmk_m2_5_4 ................................ Passed 0.01 sec + Start 90: mmk_m3_5_4_3 + 90/138 Test #90: mmk_m3_5_4_3 .............................. Passed 0.01 sec + Start 91: mcv_msh_5_1 + 91/138 Test #91: mcv_msh_5_1 ............................... Passed 0.01 sec + Start 92: mcv_msh_5_4 + 92/138 Test #92: mcv_msh_5_4 ............................... Passed 0.01 sec + Start 93: mcv_2_5_4_3 + 93/138 Test #93: mcv_2_5_4_3 ............................... Passed 0.01 sec + Start 94: mord_5_1 + 94/138 Test #94: mord_5_1 .................................. Passed 0.01 sec + Start 95: mord_5_4 + 95/138 Test #95: mord_5_4 .................................. Passed 0.01 sec + Start 96: mord_5_4_3 + 96/138 Test #96: mord_5_4_3 ................................ Passed 0.01 sec + Start 97: mord_ship001 + 97/138 Test #97: mord_ship001 .............................. Passed 1.79 sec + Start 98: gmap_bump + 98/138 Test #98: gmap_bump ................................. Passed 0.05 sec + Start 99: gmap_small + 99/138 Test #99: gmap_small ................................ Passed 0.01 sec + Start 100: gord_bump +100/138 Test #100: gord_bump ................................. Passed 0.06 sec + Start 101: gord_bump_b1 +101/138 Test #101: gord_bump_b1 .............................. Passed 0.06 sec + Start 102: gord_cmplx +102/138 Test #102: gord_cmplx ................................ Passed 0.03 sec + Start 103: gord_bump_imbal +103/138 Test #103: gord_bump_imbal ........................... Passed 0.06 sec + Start 104: gord_ship001 +104/138 Test #104: gord_ship001 .............................. Passed 0.96 sec + Start 105: gotst_bump +105/138 Test #105: gotst_bump ................................ Passed 0.07 sec + Start 106: gotst_bump_b1 +106/138 Test #106: gotst_bump_b1 ............................. Passed 0.07 sec + Start 107: gotst_bump_imbal_32 +107/138 Test #107: gotst_bump_imbal_32 ....................... Passed 0.07 sec + Start 108: gotst_ship001 +108/138 Test #108: gotst_ship001 ............................. Passed 1.33 sec + Start 109: gord_block_1 +109/138 Test #109: gord_block_1 .............................. Passed 0.00 sec + Start 110: gord_block_2 +110/138 Test #110: gord_block_2 .............................. Passed 0.00 sec + Start 111: gord_block_3 +111/138 Test #111: gord_block_3 .............................. Passed 0.00 sec + Start 112: gout_1 +112/138 Test #112: gout_1 .................................... Passed 0.17 sec + Start 113: gout_2 +113/138 Test #113: gout_2 .................................... Passed 0.14 sec + Start 114: gout_3 +114/138 Test #114: gout_3 .................................... Passed 0.10 sec + Start 115: gpart_1 +115/138 Test #115: gpart_1 ................................... Passed 0.05 sec + Start 116: gpart_2 +116/138 Test #116: gpart_2 ................................... Passed 0.04 sec + Start 117: gpart_cluster_1 +117/138 Test #117: gpart_cluster_1 ........................... Passed 0.54 sec + Start 118: gpart_cluster_2 +118/138 Test #118: gpart_cluster_2 ........................... Passed 0.36 sec + Start 119: gpart_overlap_1 +119/138 Test #119: gpart_overlap_1 ........................... Passed 0.04 sec + Start 120: gpart_overlap_2 +120/138 Test #120: gpart_overlap_2 ........................... Passed 0.06 sec + Start 121: gpart_overlap_3 +121/138 Test #121: gpart_overlap_3 ........................... Passed 0.03 sec + Start 122: gpart_remap +122/138 Test #122: gpart_remap ............................... Passed 0.08 sec + Start 123: gscat +123/138 Test #123: gscat ..................................... Passed 0.00 sec + Start 124: gtst +124/138 Test #124: gtst ...................................... Passed 0.02 sec + Start 125: prg_full_1 +125/138 Test #125: prg_full_1 ................................ Passed 0.06 sec + Start 126: prg_full_2 +126/138 Test #126: prg_full_2 ................................ Passed 0.02 sec + Start 127: prg_full_3 +127/138 Test #127: prg_full_3 ................................ Passed 0.01 sec + Start 128: dgord_1 +128/138 Test #128: dgord_1 ................................... Passed 0.19 sec + Start 129: dgord_2 +129/138 Test #129: dgord_2 ................................... Passed 0.20 sec + Start 130: dgord_3 +130/138 Test #130: dgord_3 ................................... Passed 0.15 sec + Start 131: dgpart_1 +131/138 Test #131: dgpart_1 .................................. Passed 0.20 sec + Start 132: dgpart_2 +132/138 Test #132: dgpart_2 .................................. Passed 0.20 sec + Start 133: dgpart_3 +133/138 Test #133: dgpart_3 .................................. Passed 0.16 sec + Start 134: test_dgscat +134/138 Test #134: test_dgscat ............................... Passed 0.31 sec + Start 135: test_dgscat_b1 +135/138 Test #135: test_dgscat_b1 ............................ Passed 0.30 sec + Start 136: dgtst +136/138 Test #136: dgtst ..................................... Passed 0.15 sec + Start 137: dfull_1 +137/138 Test #137: dfull_1 ................................... Passed 0.19 sec + Start 138: dfull_2 +138/138 Test #138: dfull_2 ................................... Passed 0.19 sec + +100% tests passed, 0 tests failed out of 138 +``` + +测试结果 + +单元测试运行正常,说明各类型函数和功能都响应正常。测试通过。 + +## 3.性能测试 + +### 3.1.测试平台信息对比 + + +| | arm信息 | x86信息 | +| -------- | -------------------------------- | --------------------- | +| 操作系统 | openEuler 22.03 (LTS) | openEuler 22.03 (LTS) | +| 内核版本 | 5.10.0-60.18.0.50.oe2203.aarch64 | 5.15.79.1.oe1.x86_64 | + +### 3.2.测试软件环境信息对比 + +| | arm信息 | x86信息 | +| -------- | ------------- | --------- | +| gcc | bisheng 2.1.0 | gcc 9.3.0 | +| mpi | hmpi1.1.1 | hmpi1.1.1 | +| CMake | 3.23.1 | 3.23.1 | +| OpenBLAS | 0.3.18 | 0.3.18 | + +### 3.3.测试硬件性能信息对比 + +| | arm信息 | x86信息 | +| ------ | ----------- | -------- | +| cpu | Kunpeng 920 | | +| 核心数 | 16 | 4 | +| 内存 | 32 GB | 8 GB | +| 磁盘io | 1.3 GB/s | 400 MB/s | +| 虚拟化 | KVM | KVM | + +### 3.4.测试选择的案例 + +构建包含源图显示的 VTK 文件 4elt2.vtk 其拓扑和几何文件名为 grf/4elt2.grf 和 grf/ef_4elt2.xyz,分别使用可视化软件(如 paraview)显示。 + +输入文件如下(部分) + +```bash +0 +11143 65636 +0 000 +4 4941 4942 1 159 +4 0 4941 2 4940 +4 4939 4940 1 3 +4 4 4938 4939 2 +4 3 4938 5097 5 +4 6 5096 5097 4 +4 5095 5096 7 5 +4 5095 5094 8 6 +4 9 5093 5094 7 +4 8 5093 10 5092 +4 5092 5091 11 9 +4 12 5090 5091 10 +4 11 5090 13 5089 +4 5089 5088 14 12 +4 5087 5088 15 13 +4 5086 5087 16 14 +4 5085 5086 17 15 +4 5084 5085 18 16 +4 5083 5084 19 17 +4 5082 5083 20 18 +4 5081 5082 21 19 +4 5080 5081 22 20 +4 5079 5080 23 21 +4 5078 5079 24 22 +4 5077 5078 25 23 +4 5076 5077 26 24 +4 5075 5076 27 25 +4 5074 5075 28 26 +4 5073 5074 29 27 +4 5072 5073 30 28 +4 5071 5072 31 29 +4 5070 5071 32 30 +4 5069 5070 33 31 +4 5068 5069 34 32 +4 5067 5068 35 33 +4 5066 5067 36 34 +4 5065 5066 37 35 +4 5064 5065 38 36 +4 5063 5064 39 37 +4 5062 5063 40 38 +4 5061 5062 41 39 +4 5060 5061 42 40 +4 5059 5060 43 41 +4 5058 5059 44 42 +4 5057 5058 45 43 +4 5056 5057 46 44 +4 5055 5056 47 45 +4 5054 5055 48 46 +4 5053 5054 49 47 +4 5052 5053 50 48 +4 5051 5052 51 49 +4 5050 5051 52 50 +4 5049 5050 53 51 +4 5048 5049 54 52 +4 5047 5048 55 53 +4 5046 5047 56 54 +4 5045 5046 57 55 +4 5044 5045 58 56 +4 5043 5044 59 57 +4 5042 5043 60 58 +4 4976 4977 126 124 +4 4975 4976 127 125 +4 4974 4975 128 126 +4 4973 4974 129 127 +4 4972 4973 130 128 +4 4971 4972 131 129 +4 4970 4971 132 130 +4 4969 4970 133 131 +6 989 1146 830 987 1145 831 +6 1146 988 832 990 831 1147 +6 833 832 989 1147 991 1148 +6 834 992 833 1148 990 1149 +6 835 993 834 991 1150 1149 +4 8199 8198 8101 8102 +4 8197 8196 8292 8293 +4 8291 8290 8385 8386 +5 8480 8479 8383 8384 8385 +5 8572 8478 8479 8573 8669 +4 8763 8762 8669 8668 +6 8762 6990 8858 8857 8761 8859 +5 8952 8953 8954 8857 8858 +5 9049 9048 8952 8953 9050 +6 5133 7089 9146 9048 9049 7090 +5 7089 5132 9146 9145 9144 +8 5135 657 9143 7325 7324 9144 9145 9146 +5 890 11140 891 1048 11138 +6 890 11139 732 734 733 891 +5 732 733 5210 5211 734 +6 11050 9252 9253 5210 5212 5211 +``` + +```bash +2 +11143 +0 5.0944020000e+01 -1.1050810000e+01 +1 5.1344810000e+01 -9.1294600000e+00 +2 5.1669790000e+01 -7.1938600000e+00 +3 5.1918480000e+01 -5.2470200000e+00 +4 5.2090490000e+01 -3.2919300000e+00 +5 5.2185550000e+01 -1.3316000000e+00 +6 5.2203520000e+01 6.3095000000e-01 +7 5.2144360000e+01 2.5926800000e+00 +8 5.2008180000e+01 4.5505700000e+00 +9 5.1795170000e+01 6.5016000000e+00 +10 5.1505680000e+01 8.4427700000e+00 +11 5.1140140000e+01 1.0371080000e+01 +12 5.0699110000e+01 1.2283560000e+01 +13 5.0183290000e+01 1.4177250000e+01 +14 4.9593450000e+01 1.6049250000e+01 +15 4.8930530000e+01 1.7896660000e+01 +16 4.8195520000e+01 1.9716630000e+01 +17 4.7389580000e+01 2.1506360000e+01 +18 4.6513940000e+01 2.3263090000e+01 +19 4.5569940000e+01 2.4984110000e+01 +20 4.4559060000e+01 2.6666770000e+01 +21 4.3482840000e+01 2.8308460000e+01 +22 4.2342950000e+01 2.9906670000e+01 +23 4.1141140000e+01 3.1458920000e+01 +24 3.9879270000e+01 3.2962820000e+01 +25 3.8559270000e+01 3.4416060000e+01 +26 3.7183200000e+01 3.5816390000e+01 +27 3.5753170000e+01 3.7161650000e+01 +28 3.4271370000e+01 3.8449770000e+01 +29 3.2740110000e+01 3.9678760000e+01 +30 3.1161740000e+01 4.0846730000e+01 +31 2.9538690000e+01 4.1951880000e+01 +32 2.7873470000e+01 4.2992500000e+01 +33 2.6168640000e+01 4.3966990000e+01 +34 2.4426830000e+01 4.4873840000e+01 +35 2.2650740000e+01 4.5711660000e+01 +36 2.0843080000e+01 4.6479160000e+01 +37 1.9006670000e+01 4.7175150000e+01 +38 1.7144320000e+01 4.7798550000e+01 +39 1.5258910000e+01 4.8348410000e+01 +40 1.3353340000e+01 4.8823890000e+01 +41 1.1430550000e+01 4.9224240000e+01 +42 9.4935100000e+00 4.9548840000e+01 +43 7.5452100000e+00 4.9797210000e+01 +44 5.5886500000e+00 4.9968950000e+01 +45 3.6268400000e+00 5.0063800000e+01 +46 1.6628100000e+00 5.0081620000e+01 +47 -3.0041000000e-01 5.0022380000e+01 +48 -2.2598000000e+00 4.9886160000e+01 +49 -4.2123300000e+00 4.9673180000e+01 +50 -6.1549900000e+00 4.9383760000e+01 +51 -8.0847800000e+00 4.9018360000e+01 +52 -9.9987400000e+00 4.8577540000e+01 +53 -1.1893910000e+01 4.8061970000e+01 +54 -1.3767360000e+01 4.7472460000e+01 +55 -1.5616220000e+01 4.6809900000e+01 +56 -1.7437620000e+01 4.6075330000e+01 +57 -1.9228770000e+01 4.5269870000e+01 +58 -2.0986890000e+01 4.4394760000e+01 +59 -2.2709280000e+01 4.3451360000e+01 +60 -2.4393280000e+01 4.2441130000e+01 +61 -2.6036290000e+01 4.1365610000e+01 +62 -2.7635790000e+01 4.0226460000e+01 +63 -2.9189300000e+01 3.9025450000e+01 +64 -3.0694430000e+01 3.7764430000e+01 +65 -3.2148860000e+01 3.6445330000e+01 +66 -3.3550350000e+01 3.5070200000e+01 +67 -3.4896730000e+01 3.3641150000e+01 +68 -3.6185930000e+01 3.2160390000e+01 +69 -3.7415970000e+01 3.0630200000e+01 +70 -3.8584940000e+01 2.9052930000e+01 +71 -3.9691040000e+01 2.7431030000e+01 +72 -4.0732560000e+01 2.5767000000e+01 +73 -4.1707910000e+01 2.4063390000e+01 +74 -4.2615580000e+01 2.2322840000e+01 +75 -4.3454160000e+01 2.0548020000e+01 +76 -4.4222370000e+01 1.8741680000e+01 +77 -4.4919010000e+01 1.6906610000e+01 +78 -4.5543030000e+01 1.5045620000e+01 +79 -4.6093440000e+01 1.3161600000e+01 +80 -4.6569410000e+01 1.1257430000e+01 +81 -4.6970200000e+01 9.3360800000e+00 +82 -4.7295200000e+01 7.4004800000e+00 +83 -4.7543900000e+01 5.4536300000e+00 +84 -4.7715910000e+01 3.4985400000e+00 +85 -4.7810980000e+01 1.5382100000e+00 +86 -4.7828950000e+01 -4.2434000000e-01 +87 -4.7769800000e+01 -2.3860700000e+00 +88 -4.7633620000e+01 -4.3439600000e+00 +89 -4.7420630000e+01 -6.2949900000e+00 +90 -4.7131140000e+01 -8.2361600000e+00 +91 -4.6765600000e+01 -1.0164470000e+01 +92 -4.6324580000e+01 -1.2076940000e+01 +93 -4.5808760000e+01 -1.3970640000e+01 +94 -4.5218940000e+01 -1.5842630000e+01 +95 -4.4556020000e+01 -1.7690040000e+01 +96 -4.3821020000e+01 -1.9510000000e+01 +97 -4.3015080000e+01 -2.1299730000e+01 +98 -4.2139440000e+01 -2.3056460000e+01 +99 -4.1195450000e+01 -2.4777470000e+01 +100 -4.0184570000e+01 -2.6460120000e+01 +101 -3.9108360000e+01 -2.8101810000e+01 +102 -3.7968470000e+01 -2.9700010000e+01 +103 -3.6766660000e+01 -3.1252250000e+01 +104 -3.5504790000e+01 -3.2756150000e+01 +105 -3.4184800000e+01 -3.4209380000e+01 +106 -3.2808730000e+01 -3.5609700000e+01 +107 -3.1378690000e+01 -3.6954960000e+01 +108 -2.9896900000e+01 -3.8243070000e+01 +109 -2.8365640000e+01 -3.9472060000e+01 +110 -2.6787270000e+01 -4.0640020000e+01 +111 -2.5164220000e+01 -4.1745160000e+01 +112 -2.3498990000e+01 -4.2785780000e+01 +113 -2.1794160000e+01 -4.3760260000e+01 +114 -2.0052350000e+01 -4.4667100000e+01 +115 -1.8276250000e+01 -4.5504920000e+01 +116 -1.6468600000e+01 -4.6272410000e+01 +117 -1.4632170000e+01 -4.6968390000e+01 +118 -1.2769820000e+01 -4.7591790000e+01 +119 -1.0884400000e+01 -4.8141650000e+01 +120 -8.9788300000e+00 -4.8617120000e+01 +121 -7.0560400000e+00 -4.9017460000e+01 +122 -5.1189900000e+00 -4.9342070000e+01 +123 -3.1706800000e+00 -4.9590430000e+01 +124 -1.2141100000e+00 -4.9762170000e+01 +125 7.4771000000e-01 -4.9857020000e+01 +126 2.7117400000e+00 -4.9874840000e+01 +127 4.6749700000e+00 -4.9815590000e+01 +128 6.6343600000e+00 -4.9679370000e+01 +129 8.5868900000e+00 -4.9466390000e+01 +130 1.0529560000e+01 -4.9176980000e+01 +131 1.2459360000e+01 -4.8811580000e+01 +132 1.4373330000e+01 -4.8370760000e+01 +133 1.6268500000e+01 -4.7855200000e+01 +134 1.8141970000e+01 -4.7265680000e+01 +135 1.9990830000e+01 -4.6603130000e+01 +136 2.1812240000e+01 -4.5868560000e+01 +137 2.3603380000e+01 -4.5063110000e+01 +138 2.5361510000e+01 -4.4188010000e+01 +139 2.7083900000e+01 -4.3244610000e+01 +140 2.8767910000e+01 -4.2234380000e+01 +141 3.0410930000e+01 -4.1158870000e+01 +142 3.2010430000e+01 -4.0019730000e+01 +143 3.3563940000e+01 -3.8818730000e+01 +144 3.5069080000e+01 -3.7557710000e+01 +145 3.6523510000e+01 -3.6238620000e+01 +146 3.7925000000e+01 -3.4863490000e+01 +147 3.9271380000e+01 -3.3434450000e+01 +148 4.0560580000e+01 -3.1953700000e+01 +149 4.1790610000e+01 -3.0423510000e+01 +150 4.2959580000e+01 -2.8846260000e+01 +151 4.4065680000e+01 -2.7224360000e+01 +152 4.5107200000e+01 -2.5560330000e+01 +153 4.6082550000e+01 -2.3856730000e+01 +154 4.6990210000e+01 -2.2116180000e+01 +155 4.7828790000e+01 -2.0341370000e+01 +156 4.8596990000e+01 -1.8535040000e+01 +157 4.9293640000e+01 -1.6699970000e+01 +158 4.9917640000e+01 -1.4838990000e+01 +159 5.0468060000e+01 -1.2954970000e+01 +160 4.1519100000e+00 8.0790000000e-02 +161 4.1502300000e+00 8.1030000000e-02 +162 4.1452700000e+00 8.1720000000e-02 +163 4.1370500000e+00 8.2860000000e-02 +164 4.1255900000e+00 8.4420000000e-02 +165 4.1108900000e+00 8.6380000000e-02 +166 4.0929300000e+00 8.8710000000e-02 +167 4.0717200000e+00 9.1370000000e-02 +168 4.0472700000e+00 9.4350000000e-02 +169 4.0195900000e+00 9.7640000000e-02 +471 4.1606600000e+00 -7.1200000000e-02 +472 4.1664500000e+00 -6.6300000000e-02 +473 4.1732200000e+00 -6.1800000000e-02 +474 4.1809200000e+00 -5.7750000000e-02 +475 4.1894700000e+00 -5.4180000000e-02 +476 4.1988200000e+00 -5.1180000000e-02 +785 3.9211100000e+00 3.8121000000e-01 +786 3.9715200000e+00 3.6955000000e-01 +787 4.0043100000e+00 3.5411000000e-01 +788 4.0357600000e+00 3.2936000000e-01 +789 4.0631000000e+00 3.0915000000e-01 +790 4.0818300000e+00 2.8809000000e-01 +791 4.1221100000e+00 2.5714000000e-01 +1732 4.3250000000e+00 8.7242000000e-01 +1733 4.3736400000e+00 8.0799000000e-01 +1734 4.4304000000e+00 7.7258000000e-01 +1735 4.4309900000e+00 7.0478000000e-01 +1736 4.4999000000e+00 6.6357000000e-01 +1737 4.5236700000e+00 5.9685000000e-01 +1738 4.5572500000e+00 5.3539000000e-01 +1739 4.5761300000e+00 4.8337000000e-01 +1740 4.5940100000e+00 4.1287000000e-01 +1741 4.6169900000e+00 3.8648000000e-01 +1742 4.6286600000e+00 3.1347000000e-01 +1743 4.6436200000e+00 2.4857000000e-01 +1744 4.6475800000e+00 1.9522000000e-01 +1745 4.6528300000e+00 1.3662000000e-01 +1746 4.6553600000e+00 8.6390000000e-02 +1747 4.7652600000e+00 -3.1640000000e-02 +1748 4.7573300000e+00 -9.3900000000e-02 +1749 4.7442100000e+00 -1.5749000000e-01 +1750 4.7246300000e+00 -2.2528000000e-01 +1751 4.6787100000e+00 -3.4915000000e-01 +1752 4.6493600000e+00 -4.1656000000e-01 +1753 4.6110500000e+00 -4.7667000000e-01 +1754 4.5712200000e+00 -5.3987000000e-01 +1755 4.5347500000e+00 -5.9657000000e-01 +1756 4.4984900000e+00 -6.5308000000e-01 +1757 4.4350200000e+00 -7.2251000000e-01 +3289 5.6732000000e-01 5.3531900000e+00 +3290 7.8808000000e-01 5.4078600000e+00 +3291 1.0107900000e+00 5.4544700000e+00 +3292 1.2351000000e+00 5.4929400000e+00 +3293 1.4607000000e+00 5.5232100000e+00 +5480 4.9864000000e+00 -7.6023000000e-01 +5481 4.9615700000e+00 -7.3117000000e-01 +5482 4.9367800000e+00 -7.0218000000e-01 +5483 4.9123000000e+00 -6.7598000000e-01 +5484 4.8928000000e+00 -6.4618000000e-01 +5485 4.8643600000e+00 -6.1678000000e-01 +5486 4.8463500000e+00 -5.9254000000e-01 +5487 4.8137800000e+00 -5.6252000000e-01 +5488 4.7943800000e+00 -5.3862000000e-01 +5489 4.7711900000e+00 -5.1069000000e-01 +8037 4.6474300000e+00 -9.5550000000e-02 +8038 4.6554800000e+00 -1.0303000000e-01 +8039 4.6606200000e+00 -1.1245000000e-01 +8040 4.6652200000e+00 -1.2183000000e-01 +8041 4.6697100000e+00 -1.3057000000e-01 +8042 4.6743600000e+00 -1.3879000000e-01 +8043 4.6783700000e+00 -1.4737000000e-01 +8044 4.6783000000e+00 -1.5605000000e-01 +8045 4.6780300000e+00 -1.6401000000e-01 +8046 4.6774900000e+00 -1.7185000000e-01 +8047 4.6764700000e+00 -1.8040000000e-01 +8048 4.6847000000e+00 -1.8662000000e-01 +8049 4.6812800000e+00 -1.9481000000e-01 +8050 4.6770100000e+00 -2.0305000000e-01 +11142 5.9354000000e-01 3.8493000000e-01 +``` + +### 3.5.单线程 + +单线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ------ | +| 实际CPU时间 | 0.231s | 0.280s | +| 用户时间 | 0.093s | 0.068s | + +### 3.6.多线程 + +多线程运行测试时间对比(五次运行取平均值) + +| | arm | x86 | +| ----------- | ------ | ------ | +| 线程数 | 4 | 4 | +| 实际CPU时间 | 0.180s | 0.266s | +| 用户时间 | 0.184s | 0.194s | + +arm多线程时间耗费数据表: + +| 线程 | 1 | 2 | 4 | 8 | +| :------------ | ----- | ----- | ----- | ----- | +| 用户时间(s) | 0.231 | 0.176 | 0.180 | 0.299 | +| 用户态时间(s) | 0.093 | 0.103 | 0.184 | 0.359 | +| 内核态时间(s) | 0.260 | 0.298 | 0.417 | 1.348 | + +x86多线程时间耗费数据表: + +| 线程 | 1 | 2 | 3 | 4 | +| --------------- | ----- | ----- | ----- | ----- | +| 用户时间 (s) | 0.280 | 0.210 | 0.229 | 0.266 | +| 用户态时间(s) | 0.068 | 0.079 | 0.174 | 0.194 | +| 内核态时间(s) | 0.324 | 0.290 | 0.368 | 0.613 | + +由上表可知,在线程逐渐增加的情况下,所减少的用户时间并非线性关系,线程数增加后,运算用时并未显著下降,且系统调用的时间有较为明显的上升趋势。 + +### 3.7.测试总结 + +性能测试arm平台均在x86平台50%以上,且随着线程数的增加,两个平台的对于同一个应用的所耗费的时间差距逐渐减少。 + +且线程增加并不会无限制减少应用的实际耗费时间,在合理的范围内分配线程数才能更好的利用算力资源。 + +## 4.精度测试 + +### 4.1.所选测试案例 + +图形分区,它使用分区策略使用顶点,将源图拆分为规定数量的部分边缘分隔符实现的映射方法主要来自图论。 + +测试文件(部分)如下 + +```bash +0 +9800 57978 +0 000 +3 413 407 6 +4 9771 43 9772 44 +4 76 1474 1475 77 +3 1242 147 148 +3 693 206 207 +3 521 348 349 +4 7 412 413 0 +4 6 412 8 647 +4 9 3238 647 7 +4 3235 3238 8 10 +4 11 3233 3235 9 +4 3234 3233 10 12 +4 3684 3234 11 13 +4 14 418 3684 12 +4 15 417 418 13 +4 14 417 16 3088 +4 17 3086 3088 15 +6 5543 5545 5700 5540 5541 5542 +6 6177 6178 9797 9798 6181 9799 +6 6782 6177 9796 9798 6776 6780 +7 9797 9796 6776 9799 9724 9722 6775 +6 9796 6181 6183 6645 9724 9798 +``` + +### 4.2 数据分析 + +Output: +---------------------------------------------------------- +T Mapping min=0.00908184 max=0.0129266 avg=0.0110013 +T I/O min=0.0105579 max=0.0148993 avg=0.0130691 +T Total min=0.0234845 max=0.0252681 avg=0.0240704 +M Processors 3/3(1) +M Target min=3172 max=3368 avg=3266.67 dlt=0.0206803 maxavg=1.03102 +M Neighbors min=1 max=2 sum=4 +M CommDilat=0.008865 (257) +M CommExpan=0.008865 (257) +M CommCutSz=0.008865 (257) +M CommDelta=1.000000 +M CommLoad[0]=0.991135 +M CommLoad[1]=0.008865 + +Test Passed. +"dfull_2" end time: Dec 14 22:09 CST +"dfull_2" time elapsed: 00:00:00 + +### 4.3 分析结果 + +从arm输出结果可以看出测试通过。 \ No newline at end of file diff --git "a/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" "b/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" new file mode 100644 index 0000000..ed2abf4 --- /dev/null +++ "b/doc/scotch/7.0.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204scotch\350\275\257\344\273\266\347\247\273\346\244\215\346\214\207\345\215\227\343\200\213.md" @@ -0,0 +1,325 @@ +# 《基于openEuler的scotch软件移植指南》 + +## 1.介绍 + +- scotch 一个用于图和网状/超图分区、图聚类和稀疏矩阵排序的软件包 + +- scotch 它提供了划分图形结构的算法,以及定义为结点-元素双点图的网状结构,它也可以代表超图。 + +- 官网地址: + +- GITLAB托管地址: + +- 特性: + + - Scotch库动态地利用POSIX线程的优势来加速其计算,使用MPI接口和POSIX线程。 + - 它计算稀疏矩阵的混合块排序,使用BLAS例程进行高效解算。 + - 其运行时间与源图的边数成线性关系,与目标图的顶点数成对数关系,用于映射计算。 + - 它可以无差别地处理在C或Fortran程序中创建的图形和网格数据结构,其数组索引从0或1开始。 + - 它通过处理不相邻的边缘数组为自适应图形和网格提供扩展支持。 + - 它提供许多工具来建立、检查和显示图形、网格和矩阵模式。 + +## 2.环境要求 + +- 操作系统:OpenEuler arm/x86 (本文档以 x86 架构为例) + +## 3.配置编译环境 + +配置环境指导,手动进行配置依赖环境。 + +### 3.1.环境总览 + +- 编译器: gcc + +- MPI:hmpi + +- 其他类库:`CMake`, `OpenBLAS` + + 具体版本和下载地址如下 + +| 名称 | 版本 | 软件下载地址 | +| -------- | ------ | ---------------------------------------------------------------------------------------------- | +| hmpi | 1.1.1 | | +| gcc | 9.3.0 | | +| CMake | 3.23.1 | | +| OpenBLAS | 0.3.18 | | + +### 3.2.创建文件夹 + +```bash +mkdir -p $HOME/build +mkdir -p $HOME/install +mkdir -p $HOME/tmp +``` + +### 3.3.安装预设 + +设置环境变量,方便修改自定义安装目录 + +- 编译目录为 $HOME/build , 根据实际情况进行修改 +- 软件安装目录为 $HOME/install , 根据实际情况进行修改 +- 下载目录为 $HOME/tmp , 根据实际情况进行修改 + +```bash +#为了方便自定义软件安装目录 +#环境变量DEP_INSTALL_DIR将在后文中作为软件安装目录的根目录 +export DEP_INSTALL_DIR=$HOME/install +#环境变量DEP_BUILD_DIR将在后文中作为编译的根目录 +export DEP_BUILD_DIR=$HOME/build +#环境变量DEP_DOWNLOAD_DIR将在后文中作为下载文件的保存目录 +export DEP_DOWNLOAD_DIR=$HOME/tmp + +#注: 以上变量只在一次会话中有效。如果中途断开ssh会话,则在后续的安装过程中不会生效,需要重新运行 +``` + +### 3.4.安装环境依赖和gcc编译器 + +```bash +#环境依赖 +yum -y install wget tar libatomic + +#安装bisheng编译器 +wget -P $DEP_DOWNLOAD_DIR https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz +tar -xf $DEP_DOWNLOAD_DIR/gcc-9.3.0.tar.gz -C $DEP_INSTALL_DIR +sed -i "35s/ftp/http/g" ./contrib/download_prerequisites +./contrib/download_prerequisites +./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared +make -j && make install +#设置环境变量 +echo "export PATH=$DEP_INSTALL_DIR/gcc-9.3.0/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` +``` + +## 3.5.下载并编译hmpi + +```bash +yum -y install libstdc++ libstdc++-devel +yum -y install unzip make autoconf automake git libtool +#下载解压源码文件 +wget https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/xucg/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +wget https://github.com/kunpengcompute/hmpi/archive/refs/tags/v1.1.1-huawei.zip -O $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip + +cd $DEP_BUILD_DIR +unzip -q $DEP_DOWNLOAD_DIR/hucx-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/xucg-1.1.1-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/hmpi-1.1.1-huawei.zip +cp -rf xucg-1.1.1-huawei/* hucx-1.1.1-huawei/src/ucg/ + +#编译hucx +cd $DEP_BUILD_DIR/hucx-1.1.1-huawei +./autogen.sh +./contrib/configure-opt --prefix=$DEP_INSTALL_DIR/hmpi/hucx CFLAGS="-DHAVE___CLEAR_CACHE=1" --disable-numa --without-java +for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done +for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done +make -j +make install + +yum -y install flex +#编译hmpi +cd $DEP_BUILD_DIR/hmpi-1.1.1-huawei +./autogen.pl +./configure --prefix=$DEP_INSTALL_DIR/hmpi --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$DEP_INSTALL_DIR/hmpi/hucx +make -j +make install + +echo "export PATH=$DEP_INSTALL_DIR/hmpi/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort +``` + +## 3.6.下载并编译`CMake`, `OpenBLAS` + +```bash +# 下载CMake +wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O $DEP_DOWNLOAD_DIR/cmake-3.23.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/cmake-3.23.1-linux-x86_64.tar.gz -C $DEP_INSTALL_DIR/cmake --strip-components=1 +echo "export PATH=$DEP_INSTALL_DIR/cmake/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译OpenBLAS +wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.18.tar.gz -O $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz +tar -xzvf $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/OpenBLAS-0.3.18 +make -j +make PREFIX=$DEP_INSTALL_DIR/OpenBLAS install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/OpenBLAS/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +``` + +## 4.编译scotch + +### 4.1.下载并编译scotch + +获取scotch软件源码并解压文件 + +```bash + +# 下载源码文件 +wget https://gitlab.inria.fr/scotch/scotch/-/archive/v7.0.1/scotch-v7.0.1.tar.gz -O $DEP_DOWNLOAD_DIR/scotch-v7.0.1.tar.gz +# 解压源码文件 +tar -xvf $DEP_DOWNLOAD_DIR/scotch-v7.0.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/scotch-v7.0.1/build +#编译源码 +cmake \ +-DCMAKE_INSTALL_PREFIX= \ +-DIDXSIZE=32 \ +-DTHREADS=OFF \ +-DCMAKE_BUILD_TYPE=Release \ +.. +make -j +make instal +``` + +### 4.2. 运行测试文件 + +运行scotch项目测试文件 + +```bash +cd $DEP_BUILD_DIR/scotch-v7.0.1/build +export OMPI_ALLOW_RUN_AS_ROOT=1; +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1; +make test +``` + +## 附A:使用hpcrunner进行一键安装scotch + +推荐使用hpcrunner进行安装scotch + +### 1.克隆仓库 + +```bash +git clone https://gitee.com/openeuler/hpcrunner.git +``` + +## 2.初始化hpcrunner 和 安装必要软件包 + +初始化项目助手 + +```bash +cd hpcrunner +source init.sh +``` + +安装必要软件包 + +**arm / x86 需要的软件包不同,根据实际环境进行选择** + +```bash +# arm +yum install -y environment-modules git wget unzip make flex tar +# x86 +yum install -y environment-modules git wget unzip make flex tar +yum install -y gcc gcc-c++ gcc-gfortran glibc-devel libgfortran +yum install -y tcsh tcl lsof tk bc +``` + +### 3.选择平台对应配置文件 + +- arm平台的配置文件为 `templates/scotch/7.0.1/data.scotch.arm.cpu.config` + + ```bash + ./jarvis -use templates/scotch/7.0.1/data.scotch.arm.cpu.config + ``` + +- x86 平台的配置文件为 `templates/scotch/7.0.1/data.scotch.amd.cpu.config` + + ```bash + ./jarvis -use templates/scotch/7.0.1/data.scotch.amd.cpu.config + ``` + +### 4.下载scotch源码 + +```bash +./jarvis -d +``` + +### 5.一键配置依赖环境 + +```bash +./jarvis -dp +``` + +### 6.一键进行编译 + +```bash +./jarvis -b +``` + +### 7.一键进行运行测试 + +```bash +./jarvis -r +``` + +## 附B:使用singularity运行容器 + +### 使用教程 + +### 下载容器镜像 + +通过链接下载: + +[百度云盘](https://pan.baidu.com/s/1UjHiv6DN_oOVXcuohP5Uqg?pwd=vxit) + +或者扫码下载: + +![百度云](data:image/png;base64,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) + +#### 1.安装singularity + +安装singularity, + +具体步骤如下 + +```bash +mkdir -p ~/install +mkdir -p ~/build + +#安装编译所需依赖 +yum -y install libatomic libstdc++ libstdc++-devel libseccomp-devel glib2-devel gcc squashfs-tools tar + +#安装bisheng编译器 +cd ~/build +wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz +tar -C ~/install -xf bisheng-compiler-2.1.0-aarch64-linux.tar.gz +echo "export PATH=$HOME/install/bisheng-compiler-2.1.0-aarch64-linux/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` + +#安装go编译器 +cd ~/build +wget https://go.dev/dl/go1.19.linux-arm64.tar.gz +tar -C ~/install -xf go1.19.linux-arm64.tar.gz +echo "export PATH=$HOME/install/go/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +#安装singularity +cd ~/build +wget https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2.tar.gz +tar -xf singularity-ce-3.10.2.tar.gz +cd singularity-ce-3.10.2 +./mconfig --prefix=$HOME/install/singularity +make -C ./builddir +make -C ./builddir install +echo "export PATH=$HOME/install/singularity/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +``` + +#### 2.构建镜像 + +```shell +# x86 +singularity build ./name-of-image.sif openeuler-gcc-9.3.0-hmpi1-scotch-7.0.1.def +# arm +singularity build ./name-of-image.sif openeuler-bisheng2-hmpi1-scotch-7.0.1.def +# 转换为沙盒 +singularity build --sandbox image-sandbox name-of-image.sif +``` + +#### 3.在沙盒中运行 + +```shell +#进入沙盒 +singularity shell -w image-sandbox +#在沙盒中运行内置的测试案例 +cd /hpcrunner +./jarvis -r +``` diff --git "a/doc/slepc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204slepc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" "b/doc/slepc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204slepc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" new file mode 100644 index 0000000..13dfca7 --- /dev/null +++ "b/doc/slepc/3.18.1/\343\200\212\345\237\272\344\272\216openEuler\347\232\204slepc\350\275\257\344\273\266\346\265\213\350\257\225\346\212\245\345\221\212\343\200\213.md" @@ -0,0 +1,1876 @@ +# 《基于openEuler的slepc软件测试报告》 + +## 1.规范性自检 + +项目使用了Clang-Format对文件进行格式化 + +Clang-Format是一个广泛使用的C++代码格式化器。我们在使用编辑器的缩进(TAB)功能时,由于不同编辑器的差别,有的插入的是制表符,有的是2个空格,有的是4个空格。这样如果别人用另一个编辑器来阅读程序时,可能会由于缩进的不同,导致阅读效果一团糟。为了解决这个问题,使用C++开发了一个插件,它可以自动重新缩进,并手动指定空格的数量,自动格式化源文件。它是可以通过命令行使用,也可以作为插件,在其他IDE中使用。 + +文件格式化配置参考文件`.clang-format`,文件内容如下 + +```clang-format +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: Left +AlignConsecutiveMacros: Consecutive +AlignConsecutiveAssignments: Consecutive +AlignConsecutiveBitFields: Consecutive +AlignConsecutiveDeclarations: Consecutive +AlignEscapedNewlines: DontAlign +AlignOperands: AlignAfterOperator +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability + - slepc_EXTERN + - slepc_INTERN + - slepc_UNUSED + - slepc_RESTRICT + - slepc_SINGLE_LIBRARY_INTERN + - slepc_ATTRIBUTE_FORMAT + - slepc_ATTRIBUTE_MPI_TYPE_TAG + - slepc_ATTRIBUTE_MPI_POINTER_WITH_TYPE + - slepc_ATTRIBUTE_MPI_TYPE_TAG_LAYOUT_COMPATIBLE + - slepc_ATTRIBUTE_COLD +BinPackArguments: true +BinPackParameters: true +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: true + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +# BreakBeforeConceptDeclarations: Allowed +BreakBeforeInheritanceComma: false +BreakInheritanceList: AfterColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 250 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: +# - BOOST_FOREACH +IfMacros: + #- slepcCheck + #- slepcAssert +IncludeBlocks: Preserve +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: BeforeHash +IndentExternBlock: NoIndent +IndentRequires: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PackConstructorInitializers: NextLine +PenaltyBreakAssignment: 1000000 +PenaltyBreakBeforeFirstCallParameter: 1000000 +PenaltyBreakComment: 300000 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 0 +PenaltyReturnTypeOnItsOwnLine: 1000000 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Right +PPIndentWidth: -1 +ReferenceAlignment: Pointer +ReflowComments: false +ShortNamespaceLines: 0 +SortIncludes: Never +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatementsExceptControlMacros +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +SeparateDefinitionBlocks: Leave +BitFieldColonSpacing: Both +Standard: Latest +StatementAttributeLikeMacros: + - slepc_EXTERN + - slepc_INTERN + - slepc_NODISCARD +StatementMacros: + - slepcKernel_A_gets_transpose_A_DECLARE + - slepc_RETURNS + - slepc_DECLTYPE_AUTO_RETURNS + - slepc_NOEXCEPT_AUTO_RETURNS + - slepc_DECLTYPE_NOEXCEPT_AUTO_RETURNS + - slepc_UNUSED +TabWidth: 2 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - slepcStringize + - slepcStringize_ +TypenameMacros: + - khash_t +``` + +对于当前项目,检查代码规范性,可以通过使用Clang-Format对所有源码进行重新格式化,然后使用git查看文件修改。 + +统计代码不规范内容。 + +### 1.1.选择统计文件类型 + +统计项目文件类型及其文件数量 + +使用python编写脚本文件 + +```python +import os + +print(os.getcwd()) + +def getAllFiles(targetDir): + files = [] + listFiles = os.listdir(targetDir) + for i in range(0, len(listFiles)): + path = os.path.join(targetDir, listFiles[i]) + if os.path.isdir(path): + files.extend(getAllFiles(path)) + elif os.path.isfile(path): + files.append(path) + return files + +all_files = getAllFiles(os.curdir) +type_dict = dict() + +for each_file in all_files: + if os.path.isdir(each_file): + type_dict.setdefault("directory", 0) + type_dict["directory"] += 1 + else: + ext = os.path.splitext(each_file)[1] + type_dict.setdefault(ext, 0) + type_dict[ext] += 1 + +for each_type in dict(sorted(type_dict.items(), reverse=True, key=lambda item: item[1])).keys(): + print("当前文件夹下共有[%s]的文件%d个" % (each_type, type_dict[each_type])) +``` + +在slepc项目根目录下运行,运行结果如下 + +```bash +⋊> ~/hpcrunner/tmp/slepc-3.18.1 python3 ../count.py +/root/hpcrunner/tmp/slepc-3.18.1 +当前文件夹下共有[.out]的文件558个 +当前文件夹下共有[.c]的文件452个 +当前文件夹下共有[]的文件294个 +当前文件夹下共有[.h]的文件84个 +当前文件夹下共有[.py]的文件54个 +当前文件夹下共有[.F90]的文件23个 +当前文件夹下共有[.pyx]的文件15个 +当前文件夹下共有[.pxi]的文件14个 +当前文件夹下共有[.sample]的文件13个 +当前文件夹下共有[.F]的文件13个 +当前文件夹下共有[.h90]的文件12个 +当前文件夹下共有[.rst]的文件12个 +当前文件夹下共有[.tex]的文件9个 +当前文件夹下共有[.txt]的文件8个 +当前文件夹下共有[.petsc]的文件6个 +当前文件夹下共有[.html]的文件5个 +当前文件夹下共有[.md]的文件4个 +当前文件夹下共有[.png]的文件4个 +当前文件夹下共有[.cu]的文件4个 +当前文件夹下共有[.sh]的文件3个 +当前文件夹下共有[.xml]的文件3个 +当前文件夹下共有[.cfg]的文件3个 +当前文件夹下共有[.pxd]的文件3个 +当前文件夹下共有[.bin]的文件2个 +当前文件夹下共有[.cxx]的文件2个 +当前文件夹下共有[.pack]的文件1个 +当前文件夹下共有[.idx]的文件1个 +当前文件夹下共有[.bbl]的文件1个 +当前文件夹下共有[.pdf]的文件1个 +当前文件夹下共有[.test]的文件1个 +当前文件夹下共有[.yml]的文件1个 +当前文件夹下共有[.user]的文件1个 +当前文件夹下共有[.def]的文件1个 +当前文件夹下共有[.bat]的文件1个 +当前文件夹下共有[.in]的文件1个 +当前文件夹下共有[.i]的文件1个 +``` + +查看上述结果可知主要源码文件后缀名为 `cpp`,`c`,`h`,`py`,`sh`,`c`,`F90`。 + +### 1.2.统计源码总行数 + +统计所有源码文件的代码行数 + +```bash + find ./ -regex ".*\.hpp\|.*\.h\|.*\.cpp"\|.*\.py"\|.*\.sh"\|.*\.c"\|.*\.F90" \ + | xargs wc -l +``` + +统计结果 + +```bash + 166350 total +``` + +### 1.3.统计不符合要求的总行数 + +对文件后缀名为 `cpp`,`hpp`,`h`,`py`,`sh`,`c`,`csh`,`cc`,`pl`, 的所有文件进行格式 +通过git与clang-format结合的方式进行统计 + +```bash +[root@host- src]# find . -regex '.*\.\(cpp\|hpp\)' -exec clang-format -style=./src/.clang-format -i {} \; +[root@host- src]# git commit -m "fomat update" +[main 930608761] fomat update + 34 files changed, 17298 insertions(+), 10425 deletions(-) + rewrite src/eps/impls/cg/lobpcg/lobpcg.c (84%) + rewrite src/eps/impls/cg/rqcg/rqcg.c (85%) + rewrite src/eps/impls/ciss/ciss.c (83%) + rewrite src/eps/impls/davidson/davidson.c (89%) + rewrite src/eps/impls/davidson/dvdcalcpairs.c (91%) + rewrite src/eps/impls/davidson/dvdgd2.c (88%) + rewrite src/eps/impls/davidson/dvdimprovex.c (91%) + rewrite src/eps/impls/davidson/dvdinitv.c (82%) + rewrite src/eps/impls/davidson/dvdschm.c (78%) + rewrite src/eps/impls/davidson/dvdupdatev.c (92%) + rewrite src/eps/impls/davidson/dvdutils.c (86%) + rewrite src/eps/impls/davidson/gd/gd.c (60%) + rewrite src/eps/impls/davidson/jd/jd.c (61%) + rewrite src/eps/impls/external/elpa/elpa.c (68%) + rewrite src/eps/impls/external/evsl/evsl.c (78%) + rewrite src/eps/impls/external/feast/feast.c (80%) + rewrite src/eps/impls/external/trlan/trlan.c (88%) + rewrite src/eps/impls/krylov/arnoldi/arnoldi.c (80%) + rewrite src/eps/impls/krylov/epskrylov.c (83%) + rewrite src/eps/impls/krylov/krylovschur/krylovschur.c (71%) + rewrite src/eps/impls/krylov/krylovschur/krylovschur.h (83%) + rewrite src/eps/impls/krylov/krylovschur/ks-indef.c (87%) + rewrite src/eps/impls/krylov/krylovschur/ks-slice.c (93%) + rewrite src/eps/impls/krylov/krylovschur/ks-twosided.c (90%) + rewrite src/eps/impls/krylov/lanczos/lanczos.c (85%) + rewrite src/eps/impls/lapack/lapack.c (89%) + rewrite src/eps/impls/lyapii/lyapii.c (82%) + rewrite src/eps/impls/power/power.c (84%) +``` + +### 1.4.统计结果 + +综上信息,项目中代码规范性自检检查结果为 + +通过率 : 93.733% 1-10425/166350*100% + +不通过率 : 6.267% 10425/166350*100% + +## 2.功能性测试 + +### 2.1.所选测试案例 + +slepc内置了大量的单元测试,可以使用其进行单元测试文件内容。 + +单元测试文件列表(部分)如下 + +```bash +[root@host- build]# root@zubinshuo-PC 11:46:26 ~/slepc |main ↑1 ✓| → tree tests/ +tests/ +├── datatest.pkl +├── eps +│   ├── tests +│   │   ├── runtest10_1_gd2.sh +│   │   ├── runtest10_1_lanczos.sh +│   │   ├── runtest10_1_lobpcg.sh +│   │   ├── runtest10_1.sh +│   │   ├── runtest1_10_feast.sh +│   │   ├── runtest11_1_ks_cayley.sh +│   │   ├── runtest11_1.sh +│   │   ├── runtest11_2.sh +│   │   ├── runtest1_1_cholesky.sh +│   │   ├── runtest1_1_ciss_cuda.sh +│   │   ├── runtest1_1_ciss_gnhep.sh +│   │   ├── runtest1_1_ciss_ksps.sh +│   │   ├── runtest1_1_ciss.sh +│   │   ├── runtest1_1_ciss_trapezoidal.sh +│   │   ├── runtest1_1_elemental.sh +│   │   ├── runtest3_1_lanczos.sh +│   │   ├── runtest3_1_power.sh +│   │   ├── runtest3_1_primme.sh +│   │   ├── runtest3_1_scalapack.sh +│   │   ├── runtest3_1.sh +│   │   ├── runtest3_1_trlan.sh +│   │   ├── runtest32_1.sh +│   │   ├── runtest32_2.sh +│   │   ├── runtest32_3_gnhep.sh +│   │   ├── runtest32_3.sh +│   │   ├── runtest32_4_gnhep.sh +│   │   ├── runtest32_4.sh +│   │   ├── runtest32_5_mumps.sh +│   │   ├── runtest32_5_redundant.sh +│   │   ├── runtest32_5_superlu.sh +│   │   ├── runtest3_2_blopex.sh +│   │   ├── runtest3_2_lanczos_delayed.sh +│   │   ├── runtest3_2_lanczos.sh +│   │   ├── runtest3_2_lobpcg.sh +│   │   ├── runtest3_2_rqcg.sh +│   │   ├── runtest3_2_trlan.sh +│   │   ├── runtest34_1.sh +│   │   ├── runtest34_2.sh +│   │   ├── runtest34_3.sh +│   │   ├── runtest35_1.sh +│   │   ├── runtest36_1_elemental.sh +│   │   ├── runtest36_1.sh +│   │   ├── runtest36_2.sh +│   │   ├── runtest37_1.sh +│   │   ├── runtest38_1.sh +│   │   ├── runtest39_1_lanczos.sh +│   │   ├── runtest39_1.sh +│   │   ├── runtest40_1.sh +│   │   ├── runtest41_1.sh +│   │   ├── runtest4_1_arpack.sh +│   │   ├── runtest4_1_primme.sh +│   │   ├── runtest4_1.sh +│   │   ├── runtest4_1_trlan.sh +│   │   ├── runtest42_1_ring.sh +│   │   ├── runtest4_2.sh +│   │   ├── runtest43_1.sh +│   │   ├── runtest5_1_complex.sh +│   │   ├── runtest5_1_gd2_complex.sh +│   │   ├── runtest5_1_gd2.sh +│   │   ├── runtest5_1_gd_complex.sh +│   │   ├── runtest5_1_gd.sh +│   │   ├── runtest5_1_jd_complex.sh +│   │   ├── runtest5_1_jd.sh +│   │   ├── runtest5_1_power_complex.sh +│   │   ├── runtest5_1_power.sh +│   │   ├── runtest5_1.sh +│   │   ├── runtest5_2_arpack.sh +│   │   ├── runtest5_2_blopex_complex.sh +│   │   ├── runtest5_2_blopex.sh +│   │   ├── runtest5_2_trlan.sh +│   │   ├── runtest6_1_arpack.sh +│   │   ├── runtest6_1_gd2.sh +│   │   ├── runtest6_1_power.sh +│   │   ├── runtest6_1.sh +│   │   ├── runtest6_1_trlan.sh +│   │   ├── runtest7f_1.sh +│   │   ├── runtest8_1_elemental.sh +│   │   ├── runtest8_1_gd2.sh +│   │   ├── runtest8_1_gd.sh +│   │   ├── runtest8_1_jd.sh +│   │   ├── runtest8_1_krylovschur_vecs.sh +│   │   ├── runtest8_1_lanczos.sh +│   │   ├── runtest8_1_lapack.sh +│   │   ├── runtest8_1_primme.sh +│   │   ├── runtest8_1.sh +│   │   ├── runtest8_2_arpack.sh +│   │   ├── runtest8_2_lanczos.sh +│   │   ├── runtest8_2_primme.sh +│   │   ├── runtest8_2.sh +│   │   ├── runtest8_3_lanczos.sh +│   │   ├── runtest8_3_lobpcg_quad.sh +│   │   ├── runtest8_3_lobpcg.sh +│   │   ├── runtest8_3_rqcg.sh +│   │   ├── runtest9_1_gd2.sh +│   │   ├── runtest9_1_gd.sh +│   │   ├── runtest9_1.sh +│   │   ├── runtest9_2.sh +│   │   ├── runtest9_3.sh +│   │   ├── runtest9_4.sh +│   │   ├── runtest9_5_arpack.sh +│   │   ├── runtest9_5_ksphpddm.sh +│   │   ├── runtest9_5_pchpddm.sh +│   │   ├── runtest9_5.sh +│   │   ├── runtest9_6_bcgs.sh +│   │   ├── runtest9_6_cheby_interval.sh +│   │   ├── runtest9_6_cheby.sh +│   │   ├── runtest9_6_hankel_cheby.sh +│   │   ├── runtest9_6_hankel.sh +│   │   ├── runtest9_6_refine.sh +│   │   ├── runtest9_6.sh +│   │   ├── runtest9_7_real.sh +│   │   ├── runtest9_7.sh +│   │   └── runtest9_8.sh +│   └── tutorials +│   ├── runex10_1_shell.sh +│   ├── runex10_1_shell_twoside.sh +│   ├── runex10_1_sinvert.sh +│   ├── runex10_1_sinvert_twoside.sh +│   ├── runex2_ciss_1_hpddm.sh +│   ├── runex2_ciss_1.sh +│   ├── runex2_ciss_2_block.sh +│   ├── runex2_ciss_2_hpddm.sh +│   ├── runex2_ciss_2.sh +│   ├── runex2_feast.sh +│   ├── runex30_1.sh +│   ├── runex31_1.sh +│   ├── runex3_1.sh +│   ├── runex34_1.sh +│   ├── runex34_2.sh +│   ├── runex34_3.sh +│   ├── runex34_4.sh +│   ├── runex34_5.sh +│   ├── runex34_6.sh +│   ├── runex35_1.sh +│   ├── runex36_1_quad.sh +│   ├── runex36_1.sh +│   ├── runex36_2.sh +│   ├── runex36_3.sh +│   ├── runex41_1_balance.sh +│   ├── runex41_1.sh +│   ├── runex4_1.sh +│   ├── runex43_1.sh +│   ├── runex43_2.sh +│   ├── runex44_1.sh +│   ├── runex44_2.sh +│   ├── runex46_1.sh +│   ├── runex46_2.sh +│   ├── runex47_1.sh +│   ├── runex49_1_jd.sh +│   ├── runex49_1_lobpcg.sh +│   ├── runex49_1.sh +│   ├── runex49_2_nost.sh +│   ├── runex49_2_par.sh +│   ├── runex49_2.sh +│   ├── runex4_ciss_1.sh +│   ├── runex4_ciss_2.sh +│   ├── runex5_1.sh +│   ├── runex6f90_1.sh +│   ├── runex7_1.sh +│   ├── runex7_3.sh +│   ├── runex7_ciss_1.sh +│   ├── runex9_1.sh +│   ├── runex9_2.sh +│   ├── runex9_3.sh +│   ├── runex9_4_complex.sh +│   ├── runex9_4.sh +│   ├── runex9_5.sh +│   ├── runex9_6.sh +│   ├── runex9_7.sh +│   ├── runex9_8.sh +│   ├── runex9_9.sh +│   ├── X.bin +│   └── Ybus.bin +├── lme +│   ├── tests +│   │   ├── runtest1_1.sh +│   │   ├── runtest1_2.sh +│   │   ├── runtest1_3.sh +│   │   └── runtest2_1.sh +│   └── tutorials +│   ├── runex32_1.sh +│   └── runex32_2.sh +├── mfn +│   ├── tests +│   │   ├── runtest1_1_cuda.sh +│   │   ├── runtest1_1.sh +│   │   ├── runtest1_2_cuda.sh +│   │   ├── runtest1_2.sh +│   │   ├── runtest2_1_cuda.sh +│   │   ├── runtest2_1.sh +│   │   ├── runtest2_3.sh +│   │   ├── runtest3_1.sh +│   │   ├── runtest3_2.sh +│   │   ├── runtest3f_1.sh +│   │   ├── runtest4_1.sh +│   │   └── runtest4_2.sh +│   └── tutorials +│   ├── runex23_1.sh +│   ├── runex23f90_1.sh +│   ├── runex26_1.sh +│   ├── runex37_1.sh +│   ├── runex39_1.sh +│   └── runex39_2.sh +├── nep +│   ├── tests +│   │   ├── runtest10_1_interpol.sh +│   │   ├── runtest10_1_narnoldi.sh +│   │   ├── runtest10_1_narnoldi_sync.sh +│   │   ├── runtest10_1_rii.sh +│   │   ├── runtest10_1.sh +│   │   ├── runtest10_1_slp.sh +│   │   ├── runtest10_2_interpol.sh +│   │   ├── runtest10_2_nleigs_real.sh +│   │   ├── runtest10_2_nleigs.sh +│   │   ├── runtest10_3.sh +│   │   ├── runtest7_2.sh +│   │   ├── runtest8_1.sh +│   │   ├── runtest8_2.sh +│   │   ├── runtest8_3.sh +│   │   ├── runtest8_4.sh +│   │   └── runtest9_1.sh +│   └── tutorials +│   ├── nlevp +│   │   ├── rungun_1.sh +│   │   ├── runloaded_string_1.sh +│   │   ├── runloaded_string_2_mbe.sh +│   │   ├── runloaded_string_2.sh +│   │   ├── runloaded_string_3_explicit.sh +│   │   ├── runloaded_string_3_mbe.sh +│   │   ├── runloaded_string_4.sh +│   │   ├── runloaded_string_5.sh +│   │   ├── runloaded_string_6_complex.sh +│   │   ├── runloaded_string_6.sh +│   │   ├── runloaded_string_7_complex.sh +│   │   ├── runloaded_string_7.sh +│   │   ├── runloaded_string_8_rii_thres.sh +│   │   ├── runloaded_string_8.sh +│   │   ├── runloaded_string_8_slp_thres.sh +│   │   ├── runloaded_string_8_slp_two_thres.sh +│   │   └── runloaded_string_9.sh +│   ├── runex20_1.sh +│   ├── runex20_2_complex.sh +│   ├── runex20_2.sh +│   ├── runex20_3_complex.sh +│   ├── runex20_3.sh +│   ├── runex20_4.sh +│   ├── runex20f90_1.sh +│   ├── runex21_1_rii.sh +│   ├── runex21_1_slp.sh +│   ├── runex22_1_ciss.sh +│   ├── runex22_1.sh +│   ├── runex22_2.sh +│   ├── runex22_3_rii_thres.sh +│   ├── runex22_3.sh +│   ├── runex22_3_simpleu.sh +│   ├── runex22_3_slp_thres.sh +│   ├── runex22_4.sh +│   ├── runex22f90_1.sh +│   ├── runex27_1.sh +│   ├── runex27_2.sh +│   ├── runex27_3.sh +│   ├── runex27_4.sh +│   ├── runex27_5.sh +│   ├── runex27_6.sh +│   ├── runex27_7_par.sh +│   ├── runex27_7.sh +│   ├── runex27_8_hpddm.sh +│   ├── runex27_8_parallel.sh +│   ├── runex27_8.sh +│   ├── runex27_9.sh +│   ├── runex27f90_1.sh +│   ├── runex27f90_2.sh +│   └── runex42_1.sh +├── pep +│   ├── tests +│   │   ├── runtest10_1.sh +│   │   ├── runtest11_1.sh +│   │   ├── runtest1_1_linear_gd.sh +│   │   ├── runtest1_1.sh +│   │   ├── runtest12_1.sh +│   │   ├── runtest13_1.sh +│   │   ├── runtest2_10.sh +│   │   ├── runtest2_11_cuda_linear_gd.sh +│   │   ├── runtest2_11_cuda_qarnoldi.sh +│   │   ├── runtest2_11_cuda.sh +│   │   ├── runtest2_12.sh +│   │   ├── runtest2_13.sh +│   │   ├── runtest2_14.sh +│   │   ├── runtest2_1_linear_gd.sh +│   │   ├── runtest2_1_qarnoldi.sh +│   │   ├── runtest2_1.sh +│   │   ├── runtest2_1_toar_mgs.sh +│   │   ├── runtest2_2_jd.sh +│   │   ├── runtest2_2_linear_explicit_her.sh +│   │   ├── runtest2_2_linear_explicit.sh +│   │   ├── runtest2_2_qarnoldi.sh +│   │   ├── runtest2_2.sh +│   │   ├── runtest2_2_stoar.sh +│   │   ├── runtest2_2_toar_scaleboth.sh +│   │   ├── runtest2_2_toar_transform.sh +│   │   ├── runtest2_3.sh +│   │   ├── runtest2_4_explicit.sh +│   │   ├── runtest2_4_mbe.sh +│   │   ├── runtest2_4_multiple_explicit.sh +│   │   ├── runtest2_4_multiple_mbe.sh +│   │   ├── runtest2_4_multiple_schur.sh +│   │   ├── runtest2_4_schur.sh +│   │   ├── runtest2_5.sh +│   │   ├── runtest2_6.sh +│   │   ├── runtest2_7.sh +│   │   ├── runtest2_8_explicit.sh +│   │   ├── runtest2_8_mbe.sh +│   │   ├── runtest2_8_multiple_explicit.sh +│   │   ├── runtest2_8_multiple_mbe.sh +│   │   ├── runtest2_8_multiple_schur.sh +│   │   ├── runtest2_8_schur.sh +│   │   ├── runtest2_9_explicit.sh +│   │   ├── runtest2_9_mbe.sh +│   │   ├── runtest2_9_multiple_explicit.sh +│   │   ├── runtest2_9_multiple_mbe.sh +│   │   ├── runtest3_1.sh +│   │   ├── runtest3f_1.sh +│   │   ├── runtest4_1_real.sh +│   │   ├── runtest4_1.sh +│   │   ├── runtest5_1.sh +│   │   ├── runtest5_2.sh +│   │   ├── runtest5_3.sh +│   │   ├── runtest5_4.sh +│   │   ├── runtest5_5.sh +│   │   ├── runtest6_1.sh +│   │   ├── runtest6_2.sh +│   │   ├── runtest7_1.sh +│   │   ├── runtest8_1.sh +│   │   └── runtest9_1.sh +│   └── tutorials +│   ├── nlevp +│   │   ├── runacoustic_wave_1d_1.sh +│   │   ├── runacoustic_wave_1d_1_stoar.sh +│   │   ├── runacoustic_wave_1d_2.sh +│   │   ├── runacoustic_wave_1d_3.sh +│   │   ├── runacoustic_wave_1d_4.sh +│   │   ├── runacoustic_wave_2d_1.sh +│   │   ├── runacoustic_wave_2d_1_toar.sh +│   │   ├── runacoustic_wave_2d_2_lin_ab.sh +│   │   ├── runacoustic_wave_2d_2_lin_b.sh +│   │   ├── runacoustic_wave_2d_2.sh +│   │   ├── runbutterfly_1_linear.sh +│   │   ├── runbutterfly_1_toar.sh +│   │   ├── runbutterfly_2.sh +│   │   ├── runbutterfly_4_hankel.sh +│   │   ├── runbutterfly_4.sh +│   │   ├── runbutterfly_ciss_caa.sh +│   │   ├── runbutterfly_ciss_hankel.sh +│   │   ├── runbutterfly_ciss_part.sh +│   │   ├── runbutterfly_ciss_refine.sh +│   │   ├── runbutterfly_ciss_ritz.sh +│   │   ├── rundamped_beam_1_complex.sh +│   │   ├── rundamped_beam_1_jd_complex.sh +│   │   ├── rundamped_beam_1_jd.sh +│   │   ├── rundamped_beam_1_qarnoldi_complex.sh +│   │   ├── rundamped_beam_1_qarnoldi.sh +│   │   ├── rundamped_beam_1.sh +│   │   ├── runloaded_string_1.sh +│   │   ├── runpdde_stability_1.sh +│   │   ├── runplanar_waveguide_1.sh +│   │   ├── runsleeper_1_qarnoldi.sh +│   │   ├── runsleeper_1.sh +│   │   ├── runsleeper_2_jd.sh +│   │   ├── runsleeper_2_toar.sh +│   │   ├── runsleeper_3.sh +│   │   ├── runsleeper_4.sh +│   │   ├── runspring_1_cuda.sh +│   │   ├── runspring_1_qarnoldi.sh +│   │   ├── runspring_1.sh +│   │   ├── runspring_1_stoar.sh +│   │   ├── runspring_2.sh +│   │   ├── runspring_3.sh +│   │   ├── runspring_4.sh +│   │   ├── runspring_5.sh +│   │   ├── runspring_6.sh +│   │   ├── runwiresaw_1_linear_h1.sh +│   │   ├── runwiresaw_1_linear_h2.sh +│   │   └── runwiresaw_1.sh +│   ├── runex16_1_linear.sh +│   ├── runex16_1_linear_symm.sh +│   ├── runex16_1.sh +│   ├── runex16_1_stoar.sh +│   ├── runex16_1_stoar_t.sh +│   ├── runex16f90_1.sh +│   ├── runex17_1.sh +│   ├── runex28_1.sh +│   ├── runex38_1_complex.sh +│   ├── runex38_1.sh +│   ├── runex38_2.sh +│   ├── runex40_1_complex.sh +│   ├── runex40_1.sh +│   ├── runex40_1_transform_complex.sh +│   ├── runex40_1_transform.sh +│   ├── runex50_1_linear.sh +│   ├── runex50_1.sh +│   ├── runex50_2_par.sh +│   └── runex50_2.sh +├── svd +│   ├── tests +│   │   ├── runtest10_1.sh +│   │   ├── runtest3_1_lanczos_one.sh +│   │   ├── runtest3_1_lanczos.sh +│   ├── runex52_4_cross.sh +│   ├── runex52_4_cyclic.sh +│   ├── runex52_5_cross.sh +│   ├── runex52_5_cyclic.sh +│   └── runex8_1.sh +├── sys +│   ├── classes +│   │   ├── bv +│   │   │   └── tests +│   │   │   ├── runtest10_1_cuda.sh +│   │   │   ├── runtest10_1.sh +│   │   │   ├── runtest11_11_cuda.sh +│   │   │   ├── runtest11_11.sh +│   │   │   ├── runtest11_12_cuda.sh +│   │   │   ├── runtest11_12.sh +│   │   │   ├── runtest11_1_cuda.sh +│   │   │   ├── runtest11_1.sh +│   │   │   ├── runtest11_4_cuda.sh +│   │   │   ├── runtest11_4.sh +│   │   │   ├── runtest11_6_cuda.sh +│   │   │   ├── runtest11_6.sh +│   │   │   ├── runtest11_9_cuda.sh +│   │   │   ├── runtest11_9.sh +│   │   │   ├── runtest1_1_bv_type-contiguous.sh +│   │   │   ├── runtest1_1_bv_type-mat.sh +│   │   │   ├── runtest1_1_bv_type-svec.sh +│   │   │   ├── runtest1_1_bv_type-vecs.sh +│   │   │   ├── runtest1_1_cuda_mat.sh +│   │   │   ├── runtest1_1_cuda.sh +│   │   │   ├── runtest12_1.sh +│   │   │   ├── runtest1_2_bv_type-contiguous.sh +│   │   │   ├── runtest1_2_bv_type-mat.sh +│   │   │   ├── runtest1_2_bv_type-svec.sh +│   │   │   ├── runtest1_2_bv_type-vecs.sh +│   │   │   ├── runtest1_2_cuda_mat.sh +│   │   │   ├── runtest1_2_cuda.sh +│   │   │   ├── runtest13_1_cuda.sh +│   │   │   ├── runtest13_1.sh +│   │   │   ├── runtest14_1.sh +│   │   │   ├── runtest15_1_cuda.sh +│   │   │   ├── runtest15_1.sh +│   │   │   ├── runtest15_2_cuda.sh +│   │   │   ├── runtest15_2.sh +│   │   │   ├── runtest8_4_cuda.sh +│   │   │   ├── runtest8_4.sh +│   │   │   ├── runtest9_1_cuda.sh +│   │   │   ├── runtest9_1.sh +│   │   │   ├── runtest9_1_svec_vecs.sh +│   │   │   ├── runtest9_2.sh +│   │   │   └── runtest9_2_svec_vecs.sh +│   │   ├── ds +│   │   │   └── tests +│   │   │   ├── runtest1_1.sh +│   │   │   ├── runtest12_1.sh +│   │   │   ├── runtest12_2.sh +│   │   │   ├── runtest1_2.sh +│   │   │   ├── runtest13_1.sh +│   │   │   ├── runtest13_2.sh +│   │   │   ├── runtest14f_1.sh +│   │   │   ├── runtest15_1.sh +│   │   │   ├── runtest16_1.sh +│   │   │   ├── runtest17_1_complex.sh +│   │   │   ├── runtest17_1.sh +│   │   │   ├── runtest18_1.sh +│   │   │   ├── runtest18_2.sh +│   │   │   ├── runtest19_1.sh +│   │   │   ├── runtest20_1.sh +│   │   │   ├── runtest21_1.sh +│   │   │   ├── runtest21_2.sh +│   │   │   ├── runtest2_1.sh +│   │   │   ├── runtest8_1.sh +│   │   │   ├── runtest8_2.sh +│   │   │   ├── runtest8_3.sh +│   │   │   └── runtest9_1.sh +│   │   ├── fn +│   │   │   └── tests +│   │   │   ├── runtest10_1.sh +│   │   │   ├── runtest11_1_cuda.sh +│   │   │   ├── runtest11_1.sh +│   │   │   ├── runtest11_2_cuda.sh +│   │   │   ├── runtest11_2.sh +│   │   │   ├── runtest5_1.sh +│   │   │   ├── runtest5_2_cuda.sh +│   │   │   ├── runtest5_2.sh +│   │   │   ├── runtest6_1_cuda.sh +│   │   │   ├── runtest6_1.sh +│   │   │   ├── runtest6_2_cuda.sh +│   │   │   ├── runtest6_2.sh +│   │   │   ├── runtest7_1_cuda.sh +│   │   │   ├── runtest7_1_magma.sh +│   │   │   ├── runtest7_1_sadeghi.sh +│   │   │   ├── runtest7_1.sh +│   │   │   ├── runtest7_2_cuda.sh +│   │   │   ├── runtest7_2_magma.sh +│   │   │   ├── runtest7_2_sadeghi.sh +│   │   │   ├── runtest7_2.sh +│   │   │   ├── runtest7_3_inplace.sh +│   │   │   ├── runtest7_3.sh +│   │   │   ├── runtest7f_1.sh +│   │   │   ├── runtest8_1_cuda.sh +│   │   │   ├── runtest8_1_magma.sh +│   │   │   ├── runtest8_1.sh +│   │   │   ├── runtest8_2_cuda.sh +│   │   │   ├── runtest8_2_magma.sh +│   │   │   ├── runtest8_2.sh +│   │   │   └── runtest9_1.sh +│   │   ├── rg +│   │   │   └── tests +│   │   │   ├── runtest1_1_complex.sh +│   │   │   ├── runtest1_1.sh +│   │   │   ├── runtest1_2_complex.sh +│   │   │   ├── runtest3_2.sh +│   │   │   ├── runtest3_3_ellipse.sh +│   │   │   ├── runtest3_3_interval.sh +│   │   │   ├── runtest3_3_ring.sh +│   │   │   ├── runtest3_4_ellipse.sh +│   │   │   ├── runtest3_4_interval.sh +│   │   │   └── runtest3_4_ring.sh +│   │   └── st +│   │   └── tests +│   │   ├── runtest1_1.sh +│   │   ├── runtest2_1.sh +│   │   ├── runtest3_1.sh +│   │   ├── runtest4_1.sh +│   │   ├── runtest4_2.sh +│   │   ├── runtest5_1.sh +│   │   ├── runtest6_1_st_matmode-copy.sh +│   │   ├── runtest6_1_st_matmode-inplace.sh +│   │   ├── runtest6_1_st_matmode-shell.sh +│   │   ├── runtest7_1_st_type-cayley.sh +│   │   ├── runtest7_1_st_type-shift.sh +│   │   ├── runtest7_1_st_type-sinvert.sh +│   │   ├── runtest8_1_st_type-cayley.sh +│   │   ├── runtest8_1_st_type-shift.sh +│   │   ├── runtest8_1_st_type-sinvert.sh +│   │   ├── runtest9_1_st_type-shift.sh +│   │   └── runtest9_1_st_type-sinvert.sh +│   ├── mat +│   │   └── tests +│   │   ├── runtest1_1.sh +│   │   └── runtest1_2.sh +│   ├── tests +│   │   ├── runtest1_1.sh +│   │   ├── runtest2_1.sh +│   │   ├── runtest3_arpack.sh +│   │   ├── runtest3_no-arpack.sh +│   │   ├── runtest3_no-primme.sh +│   │   ├── runtest3_primme.sh +│   │   ├── runtest4_1.sh +│   │   └── runtest4_2.sh +│   ├── tutorials +│   │   └── runex33_1.sh +│   └── vec +│   └── tests +│   ├── runtest1_1.sh +│   └── runtest1_2.sh +└── testfiles + +38 directories, 954 files +... + +``` + +在项目根目录下执行命令来运行单元测试和确定性测试 + +```bash +export OMPI_ALLOW_RUN_AS_ROOT=1 +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +make test +``` + +### 2.2.运行结果 + +```bash +[root@host- build]# make test +ok svd_tutorials-ex52_3_cross # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, Requires DATAFILESPATH + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex52_3_cyclic.counts + ok svd_tutorials-ex52_3_cyclic # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, Requires DATAFILESPATH + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex52_4_cross.counts + ok svd_tutorials-ex52_4_cross # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, Requires DATAFILESPATH + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex52_4_cyclic.counts + ok svd_tutorials-ex52_4_cyclic # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, Requires DATAFILESPATH + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex52_5_cross.counts + ok svd_tutorials-ex52_5_cross + ok diff-svd_tutorials-ex52_5_cross + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex52_5_cyclic.counts + ok svd_tutorials-ex52_5_cyclic + ok diff-svd_tutorials-ex52_5_cyclic + CC arch-linux-c-debug/tests/svd/tutorials/ex8.o + CLINKER arch-linux-c-debug/tests/svd/tutorials/ex8 + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex8_1.counts + ok svd_tutorials-ex8_1 + ok diff-svd_tutorials-ex8_1 + RM test-rm-svd.c + RM test-rm-svd.cu + RM test-rm-svd.cxx + FC arch-linux-c-debug/tests/svd/tests/test4f.o + FLINKER arch-linux-c-debug/tests/svd/tests/test4f + TEST arch-linux-c-debug/tests/counts/svd_tests-test4f_1.counts + ok svd_tests-test4f_1+svd_type-lanczos + ok diff-svd_tests-test4f_1+svd_type-lanczos + ok svd_tests-test4f_1+svd_type-trlanczos + ok diff-svd_tests-test4f_1+svd_type-trlanczos + ok svd_tests-test4f_1+svd_type-cross + ok diff-svd_tests-test4f_1+svd_type-cross + ok svd_tests-test4f_1+svd_type-cyclic + ok diff-svd_tests-test4f_1+svd_type-cyclic + ok svd_tests-test4f_1+svd_type-randomized + ok diff-svd_tests-test4f_1+svd_type-randomized + FC arch-linux-c-debug/tests/svd/tutorials/ex15f.o + FLINKER arch-linux-c-debug/tests/svd/tutorials/ex15f + TEST arch-linux-c-debug/tests/counts/svd_tutorials-ex15f_1.counts + ok svd_tutorials-ex15f_1 + ok diff-svd_tutorials-ex15f_1 + RM test-rm-svd.F + RM test-rm-svd.F90 + RM test-rm-svd.kokkos.cxx + RM test-rm-svd.hip.cpp + RM test-rm-svd.sycl.cxx + RM test-rm-svd.raja.cxx + CC arch-linux-c-debug/tests/pep/tests/test1.o + CLINKER arch-linux-c-debug/tests/pep/tests/test1 + TEST arch-linux-c-debug/tests/counts/pep_tests-test1_1.counts + ok pep_tests-test1_1+type-toar + ok diff-pep_tests-test1_1+type-toar + ok pep_tests-test1_1+type-qarnoldi + ok diff-pep_tests-test1_1+type-qarnoldi + ok pep_tests-test1_1+type-linear + ok diff-pep_tests-test1_1+type-linear + TEST arch-linux-c-debug/tests/counts/pep_tests-test1_1_linear_gd.counts + ok pep_tests-test1_1_linear_gd + ok diff-pep_tests-test1_1_linear_gd + CC arch-linux-c-debug/tests/pep/tests/test10.o + CLINKER arch-linux-c-debug/tests/pep/tests/test10 + TEST arch-linux-c-debug/tests/counts/pep_tests-test10_1.counts + ok pep_tests-test10_1 + ok diff-pep_tests-test10_1 + CC arch-linux-c-debug/tests/pep/tests/test11.o + CLINKER arch-linux-c-debug/tests/pep/tests/test11 + TEST arch-linux-c-debug/tests/counts/pep_tests-test11_1.counts + ok pep_tests-test11_1 + ok diff-pep_tests-test11_1 + CC arch-linux-c-debug/tests/pep/tests/test12.o + CLINKER arch-linux-c-debug/tests/pep/tests/test12 + TEST arch-linux-c-debug/tests/counts/pep_tests-test12_1.counts + ok pep_tests-test12_1+pep_type-toar + ok diff-pep_tests-test12_1+pep_type-toar + ok pep_tests-test12_1+pep_type-linear + ok diff-pep_tests-test12_1+pep_type-linear + ok pep_tests-test12_1+pep_type-qarnoldi + ok diff-pep_tests-test12_1+pep_type-qarnoldi + TEST arch-linux-c-debug/tests/counts/pep_tests-test13_1.counts + ok pep_tests-test13_1 # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met, PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met + CC arch-linux-c-debug/tests/pep/tests/test2.o + CLINKER arch-linux-c-debug/tests/pep/tests/test2 + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_1.counts + ok pep_tests-test2_1+pep_type-toar + ok diff-pep_tests-test2_1+pep_type-toar + ok pep_tests-test2_1+pep_type-linear + ok diff-pep_tests-test2_1+pep_type-linear + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_1_toar_mgs.counts + ok pep_tests-test2_1_toar_mgs + ok diff-pep_tests-test2_1_toar_mgs + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_1_qarnoldi.counts + ok pep_tests-test2_1_qarnoldi + ok diff-pep_tests-test2_1_qarnoldi + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_1_linear_gd.counts + ok pep_tests-test2_1_linear_gd + ok diff-pep_tests-test2_1_linear_gd + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2.counts + ok pep_tests-test2_2+pep_type-toar + ok diff-pep_tests-test2_2+pep_type-toar + ok pep_tests-test2_2+pep_type-linear + ok diff-pep_tests-test2_2+pep_type-linear + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_toar_scaleboth.counts + ok pep_tests-test2_2_toar_scaleboth + ok diff-pep_tests-test2_2_toar_scaleboth + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_toar_transform.counts + ok pep_tests-test2_2_toar_transform + ok diff-pep_tests-test2_2_toar_transform + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_qarnoldi.counts + ok pep_tests-test2_2_qarnoldi + ok diff-pep_tests-test2_2_qarnoldi + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_linear_explicit.counts + ok pep_tests-test2_2_linear_explicit + ok diff-pep_tests-test2_2_linear_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_linear_explicit_her.counts + ok pep_tests-test2_2_linear_explicit_her + ok diff-pep_tests-test2_2_linear_explicit_her + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_stoar.counts + ok pep_tests-test2_2_stoar + ok diff-pep_tests-test2_2_stoar + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_2_jd.counts + ok pep_tests-test2_2_jd + ok diff-pep_tests-test2_2_jd + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_3.counts + ok pep_tests-test2_3+pep_extract-none + ok diff-pep_tests-test2_3+pep_extract-none + ok pep_tests-test2_3+pep_extract-norm + ok diff-pep_tests-test2_3+pep_extract-norm + ok pep_tests-test2_3+pep_extract-residual + ok diff-pep_tests-test2_3+pep_extract-residual + ok pep_tests-test2_3+pep_extract-structured + ok diff-pep_tests-test2_3+pep_extract-structured + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_schur.counts + ok pep_tests-test2_4_schur + ok diff-pep_tests-test2_4_schur + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_mbe.counts + ok pep_tests-test2_4_mbe + ok diff-pep_tests-test2_4_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_explicit.counts + ok pep_tests-test2_4_explicit + ok diff-pep_tests-test2_4_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_multiple_schur.counts + ok pep_tests-test2_4_multiple_schur + ok diff-pep_tests-test2_4_multiple_schur + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_multiple_mbe.counts + ok pep_tests-test2_4_multiple_mbe + ok diff-pep_tests-test2_4_multiple_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_4_multiple_explicit.counts + ok pep_tests-test2_4_multiple_explicit + ok diff-pep_tests-test2_4_multiple_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_5.counts + ok pep_tests-test2_5 + ok diff-pep_tests-test2_5 + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_6.counts + ok pep_tests-test2_6+pep_extract-none + ok diff-pep_tests-test2_6+pep_extract-none + ok pep_tests-test2_6+pep_extract-norm + ok diff-pep_tests-test2_6+pep_extract-norm + ok pep_tests-test2_6+pep_extract-residual + ok diff-pep_tests-test2_6+pep_extract-residual + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_7.counts + ok pep_tests-test2_7+pep_extract-none + ok diff-pep_tests-test2_7+pep_extract-none + ok pep_tests-test2_7+pep_extract-norm + ok diff-pep_tests-test2_7+pep_extract-norm + ok pep_tests-test2_7+pep_extract-residual + ok diff-pep_tests-test2_7+pep_extract-residual + ok pep_tests-test2_7+pep_extract-structured + ok diff-pep_tests-test2_7+pep_extract-structured + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_schur.counts + ok pep_tests-test2_8_schur + ok diff-pep_tests-test2_8_schur + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_mbe.counts + ok pep_tests-test2_8_mbe + ok diff-pep_tests-test2_8_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_explicit.counts + ok pep_tests-test2_8_explicit + ok diff-pep_tests-test2_8_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_multiple_schur.counts + ok pep_tests-test2_8_multiple_schur + ok diff-pep_tests-test2_8_multiple_schur + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_multiple_mbe.counts + ok pep_tests-test2_8_multiple_mbe + ok diff-pep_tests-test2_8_multiple_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_8_multiple_explicit.counts + ok pep_tests-test2_8_multiple_explicit + ok diff-pep_tests-test2_8_multiple_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_9_mbe.counts + ok pep_tests-test2_9_mbe + ok diff-pep_tests-test2_9_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_9_explicit.counts + ok pep_tests-test2_9_explicit + ok diff-pep_tests-test2_9_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_9_multiple_mbe.counts + ok pep_tests-test2_9_multiple_mbe + ok diff-pep_tests-test2_9_multiple_mbe + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_9_multiple_explicit.counts + ok pep_tests-test2_9_multiple_explicit + ok diff-pep_tests-test2_9_multiple_explicit + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_10.counts + ok pep_tests-test2_10 + ok diff-pep_tests-test2_10 + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_11_cuda.counts + ok pep_tests-test2_11_cuda # SKIP PETSC_HAVE_CUDA or SLEPC_HAVE_CUDA requirement not met + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_11_cuda_qarnoldi.counts + ok pep_tests-test2_11_cuda_qarnoldi # SKIP PETSC_HAVE_CUDA or SLEPC_HAVE_CUDA requirement not met + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_11_cuda_linear_gd.counts + ok pep_tests-test2_11_cuda_linear_gd # SKIP PETSC_HAVE_CUDA or SLEPC_HAVE_CUDA requirement not met + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_12.counts + ok pep_tests-test2_12 + ok diff-pep_tests-test2_12 + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_13.counts + ok pep_tests-test2_13 + ok diff-pep_tests-test2_13 + TEST arch-linux-c-debug/tests/counts/pep_tests-test2_14.counts + ok pep_tests-test2_14 # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met + CC arch-linux-c-debug/tests/pep/tests/test3.o + CLINKER arch-linux-c-debug/tests/pep/tests/test3 + TEST arch-linux-c-debug/tests/counts/pep_tests-test3_1.counts + ok pep_tests-test3_1 + ok diff-pep_tests-test3_1 + CC arch-linux-c-debug/tests/pep/tests/test4.o + CLINKER arch-linux-c-debug/tests/pep/tests/test4 + TEST arch-linux-c-debug/tests/counts/pep_tests-test4_1_real.counts + ok pep_tests-test4_1_real + ok diff-pep_tests-test4_1_real + TEST arch-linux-c-debug/tests/counts/pep_tests-test4_1.counts + ok pep_tests-test4_1 # SKIP PETSC_USE_COMPLEX or SLEPC_USE_COMPLEX requirement not met + CC arch-linux-c-debug/tests/pep/tests/test5.o + CLINKER arch-linux-c-debug/tests/pep/tests/test5 + TEST arch-linux-c-debug/tests/counts/pep_tests-test5_1.counts + ok pep_tests-test5_1 + ok diff-pep_tests-test5_1 + TEST arch-linux-c-debug/tests/counts/pep_tests-test5_2.counts + ok pep_tests-test5_2 + ok diff-pep_tests-test5_2 + TEST arch-linux-c-debug/tests/counts/pep_tests-test5_3.counts + ok pep_tests-test5_3 + ok diff-pep_tests-test5_3 + TEST arch-linux-c-debug/tests/counts/pep_tests-test5_4.counts + ok pep_tests-test5_4 + ok diff-pep_tests-test5_4 + TEST arch-linux-c-debug/tests/counts/pep_tests-test5_5.counts + ok pep_tests-test5_5 + ok diff-pep_tests-test5_5 + CC arch-linux-c-debug/tests/pep/tests/test6.o + CLINKER arch-linux-c-debug/tests/pep/tests/test6 + TEST arch-linux-c-debug/tests/counts/pep_tests-test6_1.counts + ok pep_tests-test6_1+pep_type-toar + ok diff-pep_tests-test6_1+pep_type-toar + ok pep_tests-test6_1+pep_type-qarnoldi + ok diff-pep_tests-test6_1+pep_type-qarnoldi + ok pep_tests-test6_1+pep_type-linear + ok diff-pep_tests-test6_1+pep_type-linear + TEST arch-linux-c-debug/tests/counts/pep_tests-test6_2.counts + ok pep_tests-test6_2 + ok diff-pep_tests-test6_2 + CC arch-linux-c-debug/tests/pep/tests/test7.o + CLINKER arch-linux-c-debug/tests/pep/tests/test7 + TEST arch-linux-c-debug/tests/counts/pep_tests-test7_1.counts + ok pep_tests-test7_1 + ok diff-pep_tests-test7_1 + CC arch-linux-c-debug/tests/pep/tests/test8.o + CLINKER arch-linux-c-debug/tests/pep/tests/test8 + TEST arch-linux-c-debug/tests/counts/pep_tests-test8_1.counts + ok pep_tests-test8_1 + ok diff-pep_tests-test8_1 + CC arch-linux-c-debug/tests/pep/tests/test9.o + CLINKER arch-linux-c-debug/tests/pep/tests/test9 + TEST arch-linux-c-debug/tests/counts/pep_tests-test9_1.counts + ok pep_tests-test9_1 + CC arch-linux-c-debug/tests/mfn/tutorials/ex26.o + CLINKER arch-linux-c-debug/tests/mfn/tutorials/ex26 + TEST arch-linux-c-debug/tests/counts/mfn_tutorials-ex26_1.counts + ok mfn_tutorials-ex26_1 + ok diff-mfn_tutorials-ex26_1 + CC arch-linux-c-debug/tests/mfn/tutorials/ex37.o + CLINKER arch-linux-c-debug/tests/mfn/tutorials/ex37 + TEST arch-linux-c-debug/tests/counts/mfn_tutorials-ex37_1.counts + ok mfn_tutorials-ex37_1 + ok diff-mfn_tutorials-ex37_1 + CC arch-linux-c-debug/tests/mfn/tutorials/ex39.o + CLINKER arch-linux-c-debug/tests/mfn/tutorials/ex39 + TEST arch-linux-c-debug/tests/counts/mfn_tutorials-ex39_1.counts + ok mfn_tutorials-ex39_1 + ok diff-mfn_tutorials-ex39_1 + TEST arch-linux-c-debug/tests/counts/mfn_tutorials-ex39_2.counts + ok mfn_tutorials-ex39_2 + ok diff-mfn_tutorials-ex39_2 + RM test-rm-mfn.c + RM test-rm-mfn.cu + RM test-rm-mfn.cxx + FC arch-linux-c-debug/tests/mfn/tests/test3f.o + FLINKER arch-linux-c-debug/tests/mfn/tests/test3f + TEST arch-linux-c-debug/tests/counts/mfn_tests-test3f_1.counts + ok mfn_tests-test3f_1 + ok diff-mfn_tests-test3f_1 + RM test-rm-mfn.F + FC arch-linux-c-debug/tests/mfn/tutorials/ex23f90.o + FLINKER arch-linux-c-debug/tests/mfn/tutorials/ex23f90 + TEST arch-linux-c-debug/tests/counts/mfn_tutorials-ex23f90_1.counts + ok mfn_tutorials-ex23f90_1 + ok diff-mfn_tutorials-ex23f90_1 + RM test-rm-mfn.F90 + RM test-rm-mfn.kokkos.cxx + RM test-rm-mfn.hip.cpp + RM test-rm-mfn.sycl.cxx + RM test-rm-mfn.raja.cxx + CC arch-linux-c-debug/tests/lme/tests/test1.o + CLINKER arch-linux-c-debug/tests/lme/tests/test1 + TEST arch-linux-c-debug/tests/counts/lme_tests-test1_1.counts + ok lme_tests-test1_1 + ok diff-lme_tests-test1_1 + TEST arch-linux-c-debug/tests/counts/lme_tests-test1_2.counts + ok lme_tests-test1_2 + ok diff-lme_tests-test1_2 + TEST arch-linux-c-debug/tests/counts/lme_tests-test1_3.counts + ok lme_tests-test1_3 + ok diff-lme_tests-test1_3 + CC arch-linux-c-debug/tests/lme/tests/test2.o + CLINKER arch-linux-c-debug/tests/lme/tests/test2 + TEST arch-linux-c-debug/tests/counts/lme_tests-test2_1.counts + ok lme_tests-test2_1 + ok diff-lme_tests-test2_1 + CC arch-linux-c-debug/tests/lme/tutorials/ex32.o + CLINKER arch-linux-c-debug/tests/lme/tutorials/ex32 + TEST arch-linux-c-debug/tests/counts/lme_tutorials-ex32_1.counts + ok lme_tutorials-ex32_1 + ok diff-lme_tutorials-ex32_1 + TEST arch-linux-c-debug/tests/counts/lme_tutorials-ex32_2.counts + ok lme_tutorials-ex32_2 + ok diff-lme_tutorials-ex32_2 + RM test-rm-lme.c + RM test-rm-lme.cu + RM test-rm-lme.cxx + RM test-rm-lme.F + RM test-rm-lme.F90 + RM test-rm-lme.kokkos.cxx + RM test-rm-lme.hip.cpp + RM test-rm-lme.sycl.cxx + RM test-rm-lme.raja.cxx + +# ------------- +# Summary +# ------------- +# success 2348/2605 tests (90.1%) +# failed 0/2605 tests (0.0%) +# todo 2/2605 tests (0.1%) +# skip 255/2605 tests (9.8%) +# +# Wall clock time for tests: 482 sec +# Approximate CPU time (not incl. build time): 307.07000000000045 sec +# +# Timing summary (actual test time / total CPU time): +# nep_tests-test17_1: 9.84 sec / 28.62 sec +# eps_tutorials-ex2_4_filter: 7.94 sec / 10.97 sec +# svd_tutorials-ex52_5_cyclic: 3.74 sec / 3.79 sec +# nep_tests-test7_2: 3.53 sec / 4.47 sec +# svd_tutorials-ex51_2: 2.09 sec / 2.19 sec +total time used: 482s +``` + +测试结果 + +单元测试运行正常,说明各类型函数和功能都响应正常。测试通过。 + +## 3.性能测试 + +### 3.1.测试平台信息对比 + +| | arm信息 | x86信息 | +| -------- | -------------------------------- | --------------------- | +| 操作系统 | openEuler 22.03 (LTS) | openEuler 22.03 (LTS) | +| 内核版本 | 5.10.0-60.18.0.50.oe2203.aarch64 | 5.15.79.1.oe1.x86_64 | + +### 3.2.测试软件环境信息对比 + +| | arm信息 | x86信息 | +| -------- | ------------- | --------- | +| gcc | bisheng 2.1.0 | gcc 9.3.0 | +| mpi | hmpi1.1.1 | hmpi1.1.1 | +| CMake | 3.23.1 | 3.23.1 | +| OpenBLAS | 0.3.18 | 0.3.18 | +| lapack | 3.8.0 | 3.8.0 | +| Python3 | 3.7.10 | 3.7.10 | +| BOOST | 1.72.0 | 1.72.0 | +| slepc | 3.18.1 | 3.18.1 | + +### 3.3.测试硬件性能信息对比 + +| | arm信息 | x86信息 | +| ------ | ----------- | -------- | +| cpu | Kunpeng 920 | | +| 核心数 | 16 | 4 | +| 内存 | 32 GB | 8 GB | +| 磁盘io | 1.3 GB/s | 400 MB/s | +| 虚拟化 | KVM | KVM | + +### 3.4.测试选择的案例 + +src/eps/tutorials 目录下的文件 eps Tutorial ex5 + +使用用户提供的 PEP 测试 INTERPOL 求解器。 + +测试文件如下 + +```c +/* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + SLEPc - Scalable Library for Eigenvalue Problem Computations + Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain + + This file is part of SLEPc. + SLEPc is distributed under a 2-clause BSD license (see LICENSE). + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +*/ + +static char help[] = "Test the INTERPOL solver with a user-provided PEP.\n\n" + "This is based on ex22.\n" + "The command line options are:\n" + " -n , where = number of grid subdivisions.\n" + " -tau , where is the delay parameter.\n\n"; + +/* + Solve parabolic partial differential equation with time delay tau + + u_t = u_xx + a*u(t) + b*u(t-tau) + u(0,t) = u(pi,t) = 0 + + with a = 20 and b(x) = -4.1+x*(1-exp(x-pi)). + + Discretization leads to a DDE of dimension n + + -u' = A*u(t) + B*u(t-tau) + + which results in the nonlinear eigenproblem + + (-lambda*I + A + exp(-tau*lambda)*B)*u = 0 +*/ + +#include + +int main(int argc,char **argv) +{ + NEP nep; + PEP pep; + Mat Id,A,B; + FN f1,f2,f3; + RG rg; + Mat mats[3]; + FN funs[3]; + PetscScalar coeffs[2],b; + PetscInt n=128,nev,Istart,Iend,i,deg; + PetscReal tau=0.001,h,a=20,xi,tol; + PetscBool terse; + + PetscFunctionBeginUser; + PetscCall(SlepcInitialize(&argc,&argv,(char*)0,help)); + PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); + PetscCall(PetscOptionsGetReal(NULL,NULL,"-tau",&tau,NULL)); + PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n1-D Delay Eigenproblem, n=%" PetscInt_FMT ", tau=%g\n\n",n,(double)tau)); + h = PETSC_PI/(PetscReal)(n+1); + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create a standalone PEP and RG objects with appropriate settings + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + PetscCall(PEPCreate(PETSC_COMM_WORLD,&pep)); + PetscCall(PEPSetType(pep,PEPTOAR)); + PetscCall(PEPSetFromOptions(pep)); + + PetscCall(RGCreate(PETSC_COMM_WORLD,&rg)); + PetscCall(RGSetType(rg,RGINTERVAL)); + PetscCall(RGIntervalSetEndpoints(rg,5,20,-0.1,0.1)); + PetscCall(RGSetFromOptions(rg)); + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Create nonlinear eigensolver context + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + PetscCall(NEPCreate(PETSC_COMM_WORLD,&nep)); + + /* Identity matrix */ + PetscCall(MatCreateConstantDiagonal(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,n,1.0,&Id)); + PetscCall(MatSetOption(Id,MAT_HERMITIAN,PETSC_TRUE)); + + /* A = 1/h^2*tridiag(1,-2,1) + a*I */ + PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); + PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n)); + PetscCall(MatSetFromOptions(A)); + PetscCall(MatSetUp(A)); + PetscCall(MatGetOwnershipRange(A,&Istart,&Iend)); + for (i=Istart;i0) PetscCall(MatSetValue(A,i,i-1,1.0/(h*h),INSERT_VALUES)); + if (i, where = number of grid subdivisions in x dimension.\n" + " -m , where = number of grid subdivisions in y dimension.\n\n"; + +#include + +int main(int argc,char **argv) +{ + Mat M,C,K,A[3]; /* problem matrices */ + PEP pep; /* polynomial eigenproblem solver context */ + PetscInt N,n=10,m,Istart,Iend,II,nev,i,j,nconv; + PetscBool flag,terse; + PetscReal error,re,im; + PetscScalar kr,ki; + Vec xr,xi; + BV V; + PetscRandom rand; + + PetscFunctionBeginUser; + PetscCall(SlepcInitialize(&argc,&argv,(char*)0,help)); + + PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); + PetscCall(PetscOptionsGetInt(NULL,NULL,"-m",&m,&flag)); + if (!flag) m=n; + N = n*m; + PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nQuadratic Eigenproblem, N=%" PetscInt_FMT " (%" PetscInt_FMT "x%" PetscInt_FMT " grid)\n\n",N,n,m)); + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Compute the matrices that define the eigensystem, (k^2*M+k*C+K)x=0 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* K is the 2-D Laplacian */ + PetscCall(MatCreate(PETSC_COMM_WORLD,&K)); + PetscCall(MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,N,N)); + PetscCall(MatSetFromOptions(K)); + PetscCall(MatSetUp(K)); + PetscCall(MatGetOwnershipRange(K,&Istart,&Iend)); + for (II=Istart;II0) PetscCall(MatSetValue(K,II,II-n,-1.0,INSERT_VALUES)); + if (i0) PetscCall(MatSetValue(K,II,II-1,-1.0,INSERT_VALUES)); + if (j0) PetscCall(MatSetValue(C,II,II-1,-1.0,INSERT_VALUES)); + if (j0) { + PetscCall(MatCreateVecs(M,&xr,&xi)); + /* display eigenvalues and relative errors */ + PetscCall(PetscPrintf(PETSC_COMM_WORLD, + "\n k ||P(k)x||/||kx||\n" + " ----------------- ------------------\n")); + for (i=0;i + +- GITLAB托管地址: + +- 特性: + - 线性特征值问题 + - 二次元特征值问题 + - 多项式特征值问题 + - 非线性特征值问题 + - 奇异值分解 + +## 2.环境要求 + +- 操作系统:OpenEuler arm/x86 (本文档以 x86 架构为例) + +## 3.配置编译环境 + +配置环境指导,手动进行配置依赖环境。 + +### 3.1.环境总览 + +- 编译器: gcc + +- MPI:hmpi + +- 其他类库:`CMake`, `OpenBLAS`, `lapack`, `BOOST`, `Python3`, `sowing` + + 具体版本和下载地址如下 + +| 名称 | 版本 | 软件下载地址 | +| -------- | ------ | ---------------------------------------------------------------------------------------------- | +| hmpi | 1.2.0 | | +| gcc | 9.3.0 | | +| CMake | 3.23.1 | | +| OpenBLAS | 0.3.18 | | +| lapack | 3.8.0 | | +| Python3 | 3.7.10 | | +| BOOST | 1.72.0 | | +| sowing | 1.1.26 | | +| petsc | 3.18.1 | | + +### 3.2.创建文件夹 + +```bash +mkdir -p $HOME/build +mkdir -p $HOME/install +mkdir -p $HOME/tmp +``` + +### 3.3.安装预设 + +设置环境变量,方便修改自定义安装目录 + +- 编译目录为 $HOME/build , 根据实际情况进行修改 +- 软件安装目录为 $HOME/install , 根据实际情况进行修改 +- 下载目录为 $HOME/tmp , 根据实际情况进行修改 + +```bash +#为了方便自定义软件安装目录 +#环境变量DEP_INSTALL_DIR将在后文中作为软件安装目录的根目录 +export DEP_INSTALL_DIR=$HOME/install +#环境变量DEP_BUILD_DIR将在后文中作为编译的根目录 +export DEP_BUILD_DIR=$HOME/build +#环境变量DEP_DOWNLOAD_DIR将在后文中作为下载文件的保存目录 +export DEP_DOWNLOAD_DIR=$HOME/tmp + +#注: 以上变量只在一次会话中有效。如果中途断开ssh会话,则在后续的安装过程中不会生效,需要重新运行 +``` + +### 3.4.安装环境依赖和gcc编译器 + +```bash +#环境依赖 +yum -y install wget tar libatomic hostname + +#安装bisheng编译器 +wget -P $DEP_DOWNLOAD_DIR https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz +tar -xf $DEP_DOWNLOAD_DIR/gcc-9.3.0.tar.gz -C $DEP_INSTALL_DIR +sed -i "35s/ftp/http/g" ./contrib/download_prerequisites +./contrib/download_prerequisites +./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared +make -j && make install +#设置环境变量 +echo "export PATH=$DEP_INSTALL_DIR/gcc-9.3.0/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` +``` + +## 3.5.下载并编译hmpi + +```bash +yum -y install libstdc++ libstdc++-devel +yum -y install unzip make autoconf automake git libtool +#下载解压源码文件 +wget https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/hucx-1.2.0-huawei.zip +wget https://github.com/kunpengcompute/xucg/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/xucg-1.2.0-huawei.zip +wget https://github.com/kunpengcompute/hmpi/archive/refs/tags/v1.2.0-huawei.zip -O $DEP_DOWNLOAD_DIR/hmpi-1.2.0-huawei.zip + +cd $DEP_BUILD_DIR +unzip -q $DEP_DOWNLOAD_DIR/hucx-1.2.0-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/xucg-1.2.0-huawei.zip +unzip -q $DEP_DOWNLOAD_DIR/hmpi-1.2.0-huawei.zip +cp -rf xucg-1.2.0-huawei/* hucx-1.2.0-huawei/src/ucg/ + +#编译hucx +cd $DEP_BUILD_DIR/hucx-1.2.0-huawei +./autogen.sh +./contrib/configure-opt --prefix=$DEP_INSTALL_DIR/hmpi/hucx CFLAGS="-DHAVE___CLEAR_CACHE=1" --disable-numa --without-java +for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done +for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done +make -j +make install + +yum -y install flex +#编译hmpi +cd $DEP_BUILD_DIR/hmpi-1.2.0-huawei +./autogen.pl +./configure --prefix=$DEP_INSTALL_DIR/hmpi --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$DEP_INSTALL_DIR/hmpi/hucx +make -j +make install + +echo "export PATH=$DEP_INSTALL_DIR/hmpi/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort +``` + +## 3.6.下载并编译`CMake`, `OpenBLAS`, `lapack`, `BOOST`, `Python3`, `sowing` + +```bash +# 下载CMake +wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.tar.gz -O $DEP_DOWNLOAD_DIR/cmake-3.23.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/cmake-3.23.1-linux-x86_64.tar.gz -C $DEP_INSTALL_DIR/cmake --strip-components=1 +echo "export PATH=$DEP_INSTALL_DIR/cmake/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译OpenBLAS +wget https://github.com/xianyi/OpenBLAS/archive/refs/tags/v0.3.18.tar.gz -O $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz +tar -xzvf $DEP_DOWNLOAD_DIR/OpenBLAS-0.3.18.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/OpenBLAS-0.3.18 +make -j +make PREFIX=$DEP_INSTALL_DIR/OpenBLAS install +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/OpenBLAS/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译lapack +wget https://www.cp2k.org/static/downloads/lapack-3.8.0.tgz -O $DEP_DOWNLOAD_DIR/lapack-3.8.0.tgz +tar -xvf ${JARVIS_DOWNLOAD}/lapack-3.8.0.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/lapack-3.8.0 +cp make.inc.example make.inc +mkdir build && cd build +cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON +make -j +make install -j +echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DEP_INSTALL_DIR/lapack-3.8.0/build/lib" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译BOOST +wget https://boostorg.jfrog.io/artifactory/main/release/1.72.0/source/boost_1_72_0.tar.gz -O $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/boost_1_72_0.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/boost_1_72_0.tar.gz +cd boost_1_72_0 +./bootstrap.sh +./b2 install --prefix=$DEP_INSTALL_DIR/boost +echo "export BOOST_ROOT=$DEP_INSTALL_DIR/boost/" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/boost/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译Python3 +yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel +wget https://repo.huaweicloud.com/python/3.7.10/Python-3.7.10.tgz -O $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz +tar -zxvf $DEP_DOWNLOAD_DIR/Python-3.7.10.tgz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/Python-3.7.10 +./configure --prefix=$DEP_INSTALL_DIR/python3 +make -j +make install +echo "export PATH=$DEP_INSTALL_DIR/python3/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +echo "export LD_LIBRARY_PATH=$DEP_INSTALL_DIR/python3/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && source ~/.bashrc + +# 下载并编译sowing +wget http://wgropp.cs.illinois.edu/projects/software/sowing/sowing.tar.gz -O $DEP_DOWNLOAD_DIR/sowing.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/sowing.tar.gz +cd $DEP_DOWNLOAD_DIR/sowing-1.1.26 +./configure --prefix=$DEP_INSTALL_DIR/sowing +make -j +make install -j + +# 下载并编译petsc +wget https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.18.1.tar.gz -O $DEP_DOWNLOAD_DIR/petsc-3.18.1.tar.gz +tar -xvf $DEP_DOWNLOAD_DIR/petsc-3.18.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/petsc-3.18.1 +./configure F77=$F77 --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpifort --force +make PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug all -j +make PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug install -j +export PETSC_ARCH=arch-linux-c-debug +export PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 +``` + +## 4.编译slepc + +### 4.1.下载并编译slepc + +获取slepc软件源码并解压文件 + +```bash + +# 下载源码文件 +wget https://slepc.upv.es/download/distrib/slepc-3.18.1.tar.gz -O $DEP_DOWNLOAD_DIR/slepc-3.18.1.tar.gz +# 解压源码文件 +tar -xvf $DEP_DOWNLOAD_DIR/slepc-3.18.1.tar.gz -C $DEP_BUILD_DIR +cd $DEP_BUILD_DIR/slepc-3.18.1 +#编译源码 +./configure --prefix=$DEP_DOWNLOAD_DIR/slepc-3.18.1 --with-clean +make SLEPC_DIR=$DEP_DOWNLOAD_DIR/slepc-3.18.1 PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug -j +make SLEPC_DIR=$DEP_DOWNLOAD_DIR/slepc-3.18.1 PETSC_DIR=$DEP_DOWNLOAD_DIR/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug install check -j +``` + +### 4.2. 运行测试文件 + +运行slepc项目测试文件 + +```bash +cd $DEP_BUILD_DIR/slepc-3.18.1/ +export OMPI_ALLOW_RUN_AS_ROOT=1; +export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1; +make test +``` + +## 附A:使用hpcrunner进行一键安装slepc + +推荐使用hpcrunner进行安装slepc + +### 1.克隆仓库 + +```bash +git clone https://gitee.com/openeuler/hpcrunner.git +``` + +## 2.初始化hpcrunner 和 安装必要软件包 + +初始化项目助手 + +```bash +cd hpcrunner +source init.sh +``` + +安装必要软件包 + +**arm / x86 需要的软件包不同,根据实际环境进行选择** + +```bash +# arm +yum install -y environment-modules git wget unzip make flex tar hostname +# x86 +yum install -y environment-modules git wget unzip make flex tar +yum install -y gcc gcc-c++ gcc-gfortran glibc-devel libgfortran +yum install -y tcsh tcl lsof tk bc hostname +``` + +### 3.选择平台对应配置文件 + +- arm平台的配置文件为 `templates/slepc/3.18.1/data.slepc.arm.cpu.config` + + ```bash + ./jarvis -use templates/slepc/3.18.1/data.slepc.arm.cpu.config + ``` + +- x86 平台的配置文件为 `templates/slepc/3.18.1/data.slepc.amd.cpu.config` + + ```bash + ./jarvis -use templates/slepc/3.18.1/data.slepc.amd.cpu.config + ``` + +### 4.下载slepc源码 + +```bash +./jarvis -d +``` + +### 5.一键配置依赖环境 + +```bash +./jarvis -dp +``` + +### 6.一键进行编译 + +```bash +./jarvis -b +``` + +### 7.一键进行运行测试 + +```bash +./jarvis -r +``` + +## 附B:使用singularity运行容器 + +### 使用教程 + +### 下载容器镜像 + +通过链接下载: + +[百度云盘](https://pan.baidu.com/s/1UjHiv6DN_oOVXcuohP5Uqg?pwd=vxit) + +或者扫码下载: + +![百度云](data:image/png;base64,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) + +#### 1.安装singularity + +安装singularity, + +具体步骤如下 + +```bash +mkdir -p ~/install +mkdir -p ~/build + +#安装编译所需依赖 +yum -y install libatomic libstdc++ libstdc++-devel libseccomp-devel glib2-devel gcc squashfs-tools tar + +#安装bisheng编译器 +cd ~/build +wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz +tar -C ~/install -xf bisheng-compiler-2.1.0-aarch64-linux.tar.gz +echo "export PATH=$HOME/install/bisheng-compiler-2.1.0-aarch64-linux/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +export CC=`which clang` +export CXX=`which clang++` + +#安装go编译器 +cd ~/build +wget https://go.dev/dl/go1.19.linux-arm64.tar.gz +tar -C ~/install -xf go1.19.linux-arm64.tar.gz +echo "export PATH=$HOME/install/go/bin:$PATH" >> ~/.bashrc && source ~/.bashrc + +#安装singularity +cd ~/build +wget https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2.tar.gz +tar -xf singularity-ce-3.10.2.tar.gz +cd singularity-ce-3.10.2 +./mconfig --prefix=$HOME/install/singularity +make -C ./builddir +make -C ./builddir install +echo "export PATH=$HOME/install/singularity/bin:$PATH" >> ~/.bashrc && source ~/.bashrc +``` + +#### 2.构建镜像 + +```shell +# x86 +singularity build ./name-of-image.sif openeuler-gcc-9.3.0-hmpi1-slepc-3.18.1.def +# arm +singularity build ./name-of-image.sif openeuler-bisheng2-hmpi1-slepc-3.18.1.def +# 转换为沙盒 +singularity build --sandbox image-sandbox name-of-image.sif +``` + +#### 3.在沙盒中运行 + +```shell +#进入沙盒 +singularity shell -w image-sandbox +#在沙盒中运行内置的测试案例 +cd /hpcrunner +./jarvis -r +``` diff --git a/package/mumps/5.1.2/install.sh b/package/mumps/5.1.2/install.sh new file mode 100755 index 0000000..df755eb --- /dev/null +++ b/package/mumps/5.1.2/install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -x +set -e +. ${DOWNLOAD_TOOL} -u http://graal.ens-lyon.fr/MUMPS/MUMPS_5.1.2.tar.gz +cd ${JARVIS_TMP} +rm -rf MUMPS_5.1.2 +tar -xvf ${JARVIS_DOWNLOAD}/MUMPS_5.1.2.tar.gz +cd MUMPS_5.1.2 +LAPACK_PATH=${LAPACK_PATH} +SCALPACK_PATH=${SCALPACK_PATH} +MPI_PATH=${MPI_PATH} +OPENBLAS_PATH=${OPENBLAS_PATH} +export MUMPS_PATH=$1 +mkdir -p lib +mkdir -p $1/include +cp Make.inc/Makefile.inc.generic ./Makefile.inc +sed -i 's/f90/mpifort/g' ./Makefile.inc +sed -i 's/CC = cc/CC = mpicc/g' ./Makefile.inc +sed -i '94c LIBEXT = .so' ./Makefile.inc +sed -i '107c AR = $(CC) -shared $(OPTC) -o' ./Makefile.inc +sed -i '110c RANLIB = echo' ./Makefile.inc +sed -i '115c LAPACK = -Wl,-rpath,${LAPACK_PATH} -L${LAPACK_PATH} -llapack' ./Makefile.inc +sed -i '118c SCALAP = -Wl,-rpath,${SCALPACK_PATH}/lib -L${SCALPACK_PATH}/lib -lscalapack' ./Makefile.inc +sed -i '121c INCPAR = -I${MPI_PATH}/include' ./Makefile.inc +sed -i '124c LIBPAR = $(SCALAP) $(LAPACK) -L${MPI_PATH}/lib -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi' ./Makefile.inc +sed -i '134c LIBBLAS = -Wl,-rpath,${OPENBLAS_PATH}/lib -L${OPENBLAS_PATH}/lib -lopenblas' ./Makefile.inc +sed -i '153c OPTF = -DALLOW_NON_INIT ${CFLAGS} -fPIC -Wno-argument-mismatch' ./Makefile.inc +sed -i '154c OPTC = ${CFLAGS} -fPIC' ./Makefile.inc +sed -i '155c OPTL = ${CFLAGS} -fPIC' ./Makefile.inc +sed -i 's/$@/$(MUMPS_PATH)/g ' ./Makefile +make clean +make alllib all +cp -r lib/* $1/ +cp -r include/* $1/include/ \ No newline at end of file diff --git a/package/petsc/3.18.1/install.sh b/package/petsc/3.18.1/install.sh new file mode 100755 index 0000000..fcf8c1e --- /dev/null +++ b/package/petsc/3.18.1/install.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x +set -e +. ${DOWNLOAD_TOOL} -u https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.18.1.tar.gz +cd ${JARVIS_TMP} +rm -rf petsc-3.18.1 +tar -xvf ${JARVIS_DOWNLOAD}/petsc-3.18.1.tar.gz +cd petsc-3.18.1 +./configure F77=$F77 --prefix=$1 --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpifort --force +make PETSC_DIR=${JARVIS_TMP}/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug all -j +make PETSC_DIR=${JARVIS_TMP}/petsc-3.18.1 PETSC_ARCH=arch-linux-c-debug install -j +sed -i 's/--oversubscribe/--oversubscribe --mca coll ^ucx/g' ${JARVIS_TMP}/petsc-3.18.1/arch-linux-c-debug/tests/ksp/ksp/tutorials/runex54f_hem.sh \ No newline at end of file diff --git a/package/slepc/3.18.1/install.sh b/package/slepc/3.18.1/install.sh new file mode 100644 index 0000000..669cd93 --- /dev/null +++ b/package/slepc/3.18.1/install.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -x +set -e +. ${DOWNLOAD_TOOL} -u https://slepc.upv.es/download/distrib/slepc-3.18.1.tar.gz +cd ${JARVIS_TMP} +rm -rf slepc-3.18.1 +tar -xvf ${JARVIS_DOWNLOAD}/slepc-3.18.1.tar.gz +cd slepc-3.18.1 +PETSC_PATH=${PETSC_PATH} +PETSC_DIR=${PETSC_PATH} ./configure --prefix=$1 --with-clean +make SLEPC_DIR=${JARVIS_TMP}/slepc-3.18.1 PETSC_DIR=${PETSC_PATH} -j +make SLEPC_DIR=${JARVIS_TMP}/slepc-3.18.1 PETSC_DIR=${PETSC_PATH} install -j \ No newline at end of file diff --git a/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config b/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config index 4637fc6..90ef3d5 100644 --- a/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config +++ b/templates/OpenCoarrays/2.10.1/data.opencoarrays.amd.cpu.config @@ -38,9 +38,5 @@ cd ${JARVIS_ROOT} && ./jarvis -install opencoarrays/2.10.1 gcc+mpi [RUN] run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && ctest --output-on-failure --repeat-until-fail 1 --timeout 200 -# mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums -# /root/hpcrunner/software/mpi/openmpi4-gcc9/4.1.2/bin/mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root xterm -e gdb /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums -#ctest --output-on-failure --repeat-until-fail 1 --timeout 200 || /root/hpcrunner/software/mpi/openmpi4-gcc9/4.1.2/bin/mpiexec -n 2 --hostfile /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/hostfile --allow-run-as-root /root/hpcrunner/tmp/OpenCoarrays-2.10.0/opencoarrays-build/bin/OpenCoarrays-2.10.0-tests/alloc_comp_get_convert_nums -# ctest --output-on-failure --repeat-until-fail 1 --timeout 200 binary = nodes = 1 \ No newline at end of file diff --git a/templates/mumps/5.1.2/data.mumps.amd.cpu.config b/templates/mumps/5.1.2/data.mumps.amd.cpu.config new file mode 100644 index 0000000..f4ec691 --- /dev/null +++ b/templates/mumps/5.1.2/data.mumps.amd.cpu.config @@ -0,0 +1,56 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +./jarvis -install gcc/9.3.0 com +module use ./software/modulefiles +module load gcc/9.3.0 +export CC=`which gcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install hmpi/1.1.1 gcc +module load hmpi/1.1.1 +./jarvis -install zlib/1.2.12 gcc +module load zlib/1.2.12 +./jarvis -install openblas/0.3.18 gcc +module load openblas/0.3.18 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_LIBDIR=$1 && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 gcc +module load lapack/3.8.0 +sed -i '14,18d' package/scalapack/2.1.0/install.sh +sed -i '$a mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=$1 -DBUILD_SHARED_LIBS=ON -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .. && make -j && make install' package/scalapack/2.1.0/install.sh +./jarvis -install scalapack/2.1.0 gcc + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load gcc/9.3.0 +module load hmpi/1.1.1 scalapack/2.1.0 lapack/3.8.0 +module load openblas/0.3.18 zlib/1.2.12 +export LAPACK_PATH=${JARVIS_LIBS}/gcc9.3.0/lapack/3.8.0/ +export SCALPACK_PATH=${JARVIS_LIBS}/gcc9.3.0/scalapack/2.1.0 +export MPI_PATH=${JARVIS_MPI}/hmpi1.1.1-gcc9.3.0/1.1.1 +export OPENBLAS_PATH=${JARVIS_LIBS}/gcc9.3.0/openblas/0.3.18/ +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = mumps +build_dir = ${JARVIS_TMP}/MUMPS_5.1.2 +binary_dir = +case_dir = ${JARVIS_TMP}/MUMPS_5.1.2/examples + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install mumps/5.1.2 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make clean all && export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${JARVIS_LIBS}/gcc9.3.0/hmpi1.1.1/mumps/5.1.2/ && mpirun -np 3 --mca plm_rsh_agent sh --mca opal_warn_on_missing_libcuda 0 --oversubscribe +binary = ./ssimpletest < input_simpletest_real && ./dsimpletest < input_simpletest_real && ./csimpletest < input_simpletest_cmplx && ./zsimpletest < input_simpletest_cmplx && ./c_example && ./multiple_arithmetics_example +nodes = 1 \ No newline at end of file diff --git a/templates/mumps/5.1.2/data.mumps.arm.cpu.config b/templates/mumps/5.1.2/data.mumps.arm.cpu.config new file mode 100644 index 0000000..eed0c6f --- /dev/null +++ b/templates/mumps/5.1.2/data.mumps.arm.cpu.config @@ -0,0 +1,55 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] +mumps/5.1.2 http://graal.ens-lyon.fr/MUMPS/MUMPS_5.1.2.tar.gz + +[DEPENDENCY] +set -e +set -x +module purge +module use ./software/modulefiles +./jarvis -install bisheng/2.4.0 com +module load bisheng/2.4.0 +export CC=clang CXX=clang++ FC=flang +./jarvis -install hmpi/1.1.1 clang +module load hmpi/1.1.1 +./jarvis -install zlib/1.2.12 clang +module load zlib/1.2.12 +./jarvis -install openblas/0.3.18 clang +module load openblas/0.3.18 +./jarvis -install cmake/3.23.1 clang +module load cmake/3.23.1 +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_LIBDIR=$1 && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 bisheng +module load lapack/3.8.0 +sed -i '14,18d' package/scalapack/2.1.0/install.sh +sed -i '$a mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=$1 -DBUILD_SHARED_LIBS=ON -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .. && make -j && make install' package/scalapack/2.1.0/install.sh +./jarvis -install scalapack/2.1.0 bisheng + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load bisheng/2.4.0 +module load hmpi/1.1.1 scalapack/2.1.0 lapack/3.8.0 +module load openblas/0.3.18 zlib/1.2.12 +export LAPACK_PATH=${JARVIS_LIBS}/bisheng2.4.0/lapack/3.8.0/ +export SCALPACK_PATH=${JARVIS_LIBS}/bisheng2.4.0/scalapack/2.1.0 +export MPI_PATH=${JARVIS_MPI}/hmpi1.1.1-bisheng2.4.0/1.1.1 +export OPENBLAS_PATH=${JARVIS_LIBS}/bisheng2.4.0/openblas/0.3.18/ +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = mumps +build_dir = ${JARVIS_TMP}/MUMPS_5.1.2 +binary_dir = +case_dir = ${JARVIS_TMP}/MUMPS_5.1.2/examples + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install mumps/5.1.2 bisheng+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make clean all && export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${JARVIS_LIBS}/bisheng2.4.0/hmpi1.1.1/mumps/5.1.2/ && mpirun -np 3 --mca plm_rsh_agent sh --mca opal_warn_on_missing_libcuda 0 --oversubscribe +binary = ./ssimpletest < input_simpletest_real && ./dsimpletest < input_simpletest_real && ./csimpletest < input_simpletest_cmplx && ./zsimpletest < input_simpletest_cmplx && ./c_example && ./multiple_arithmetics_example +nodes = 1 \ No newline at end of file diff --git a/templates/petsc/3.18.1/data.petsc.amd.cpu.config b/templates/petsc/3.18.1/data.petsc.amd.cpu.config new file mode 100644 index 0000000..ce294d7 --- /dev/null +++ b/templates/petsc/3.18.1/data.petsc.amd.cpu.config @@ -0,0 +1,46 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +./jarvis -install gcc/9.3.0 com +module use ./software/modulefiles +module load gcc/9.3.0 +export CC=`which gcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install hmpi/1.2.0 gcc +module load hmpi/1.2.0 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 gcc +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 gcc +./jarvis -install python3/3.7.10 gcc + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load gcc/9.3.0 +module load hmpi/1.2.0 lapack/3.8.0 +module load python3/3.7.10 openblas/0.3.18 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = petsc +build_dir = ${JARVIS_TMP}/petsc-3.18.1 +binary_dir = +case_dir = ${JARVIS_TMP}/petsc-3.18.1 + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install petsc/3.18.1 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make test +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/petsc/3.18.1/data.petsc.arm.cpu.config b/templates/petsc/3.18.1/data.petsc.arm.cpu.config new file mode 100644 index 0000000..fe56c98 --- /dev/null +++ b/templates/petsc/3.18.1/data.petsc.arm.cpu.config @@ -0,0 +1,44 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +module use ./software/modulefiles +./jarvis -install bisheng/2.4.0 com +module load bisheng/2.4.0 +export CC=clang CXX=clang++ FC=flang +./jarvis -install hmpi/1.2.0 clang +module load hmpi/1.2.0 +./jarvis -install cmake/3.23.1 clang +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 clang +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 clang +./jarvis -install python3/3.7.10 clang + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load bisheng/2.4.0 +module load hmpi/1.2.0 lapack/3.8.0 +module load python3/3.7.10 openblas/0.3.18 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = petsc +build_dir = ${JARVIS_TMP}/petsc-3.18.1 +binary_dir = +case_dir = ${JARVIS_TMP}/petsc-3.18.1 + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install petsc/3.18.1 clang+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make check +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/scotch/7.0.1/data.scotch.amd.cpu.config b/templates/scotch/7.0.1/data.scotch.amd.cpu.config new file mode 100644 index 0000000..f3695ee --- /dev/null +++ b/templates/scotch/7.0.1/data.scotch.amd.cpu.config @@ -0,0 +1,46 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +./jarvis -install gcc/9.3.0 com +module use ./software/modulefiles +module load gcc/9.3.0 +export CC=`which gcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install hmpi/1.1.1 gcc +module load hmpi/1.1.1 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 gcc +module load openblas/0.3.18 +./jarvis -install zlib/1.2.12 gcc +module load zlib/1.2.12 + +[ENV] +module purge +module use ./software/modulefiles +module load gcc/9.3.0 +module load hmpi/1.1.1 +module load cmake/3.23.1 +module load openblas/0.3.18 zlib/1.2.12 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = scotch +build_dir = ${JARVIS_TMP}/scotch-v7.0.1/build +binary_dir = ${JARVIS_LIBS}/gcc9.3.0/hmpi1.1.1/scotch/7.0.1/bin +case_dir = ${JARVIS_TMP}/scotch-v7.0.1/build + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install scotch/7.0.1 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 && export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make test +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/scotch/7.0.1/data.scotch.arm.cpu.config b/templates/scotch/7.0.1/data.scotch.arm.cpu.config new file mode 100644 index 0000000..638cdec --- /dev/null +++ b/templates/scotch/7.0.1/data.scotch.arm.cpu.config @@ -0,0 +1,47 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] + +[DEPENDENCY] +set -e +set -x +module purge +module use ./software/modulefiles +./jarvis -install bisheng/2.4.0 com +module load bisheng/2.4.0 +export CC=clang CXX=clang++ FC=flang +./jarvis -install hmpi/1.1.1 clang +module load hmpi/1.1.1 +./jarvis -install cmake/3.23.1 clang +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 clang +module load openblas/0.3.18 +./jarvis -install zlib/1.2.12 clang +module load zlib/1.2.12 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load bisheng/2.4.0 +export CC=clang CXX=clang++ FC=flang +module load hmpi/1.1.1 +module load cmake/3.23.1 +module load openblas/0.3.18 zlib/1.2.12 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = scotch +build_dir = ${JARVIS_TMP}/scotch-v7.0.1/build +binary_dir = ${JARVIS_LIBS}/bisheng2.4.0/hmpi1.1.1/scotch/7.0.1/bin +case_dir = ${JARVIS_TMP}/scotch-v7.0.1/build + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install scotch/7.0.1 bisheng+mpi + + +[RUN] +run = make test OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/slepc/3.18.1/data.slepc.amd.cpu.config b/templates/slepc/3.18.1/data.slepc.amd.cpu.config new file mode 100644 index 0000000..cc63cd4 --- /dev/null +++ b/templates/slepc/3.18.1/data.slepc.amd.cpu.config @@ -0,0 +1,57 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] +slepc/3.18.1 https://slepc.upv.es/download/distrib/slepc-3.18.1.tar.gz + +[DEPENDENCY] +set -e +set -x +module purge +./jarvis -install gcc/9.3.0 com +module use ./software/modulefiles +module load gcc/9.3.0 +export CC=`which gcc` +export CXX=`which g++` +export FC=`which gfortran` +./jarvis -install hmpi/1.2.0 gcc +module load hmpi/1.2.0 +./jarvis -install cmake/3.23.1 gcc +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 gcc +module load openblas/0.3.18 +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 gcc +module load lapack/3.8.0 +./jarvis -install python3/3.7.10 gcc +module load python3/3.7.10 +export PETSC_ARCH=arch-linux-c-debug +export PETSC_DIR=${JARVIS_TMP}/petsc-3.18.1 +./jarvis -install petsc/3.18.1 gcc+mpi +cd ${JARVIS_TMP} +tar -xvf ${JARVIS_DOWNLOAD}/slepc-3.18.1.tar.gz -C ${JARVIS_TMP} + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load gcc/9.3.0 +module load hmpi/1.2.0 lapack/3.8.0 +module load python3/3.7.10 openblas/0.3.18 +export PETSC_PATH=${JARVIS_LIBS}/gcc9.3.0/hmpi1.2.0/petsc/3.18.1/ +export SLEPC_DIR=${JARVIS_TMP}/slepc-3.18.1 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = slepc +build_dir = ${JARVIS_TMP}/slepc-3.18.1 +binary_dir = +case_dir = ${JARVIS_TMP}/slepc-3.18.1 + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install slepc/3.18.1 gcc+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make PETSC_DIR=${PETSC_PATH} test +binary = +nodes = 1 \ No newline at end of file diff --git a/templates/slepc/3.18.1/data.slepc.arm.cpu.config b/templates/slepc/3.18.1/data.slepc.arm.cpu.config new file mode 100644 index 0000000..d501d2d --- /dev/null +++ b/templates/slepc/3.18.1/data.slepc.arm.cpu.config @@ -0,0 +1,56 @@ +[SERVER] +11.11.11.11 + +[DOWNLOAD] +slepc/3.18.1 https://slepc.upv.es/download/distrib/slepc-3.18.1.tar.gz + +[DEPENDENCY] +set -e +set -x +module purge +module use ./software/modulefiles +./jarvis -install bisheng/2.4.0 com +module load bisheng/2.4.0 +export CC=clang CXX=clang++ FC=flang +./jarvis -install hmpi/1.2.0 clang +module load hmpi/1.2.0 +./jarvis -install cmake/3.23.1 clang +module load cmake/3.23.1 +./jarvis -install openblas/0.3.18 clang +module load openblas/0.3.18 +sed -i '10,12d ' package/lapack/3.8.0/install.sh +sed -i '$a mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=$1 -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=ON && make -j && make install -j ' package/lapack/3.8.0/install.sh +./jarvis -install lapack/3.8.0 clang +module load lapack/3.8.0 +./jarvis -install python3/3.7.10 clang +module load python3/3.7.10 +export PETSC_ARCH=arch-linux-c-debug +export PETSC_DIR=${JARVIS_TMP}/petsc-3.18.1 +./jarvis -install petsc/3.18.1 clang+mpi +cd ${JARVIS_TMP} +tar -xvf ${JARVIS_DOWNLOAD}/slepc-3.18.1.tar.gz -C ${JARVIS_TMP} + +[ENV] +module purge +module use ${JARVIS_ROOT}/software/modulefiles +module load bisheng/2.4.0 +module load hmpi/1.2.0 lapack/3.8.0 +module load python3/3.7.10 openblas/0.3.18 petsc/3.18.1 +export PETSC_ARCH=arch-linux-c-debug +export PETSC_PATH=${JARVIS_LIBS}/bisheng2.4.0/hmpi1.2.0/petsc/3.18.1 +export SLEPC_DIR=${JARVIS_TMP}/slepc-3.18.1 +export CC=mpicc CXX=mpicxx FC=mpifort F77=mpifort + +[APP] +app_name = slepc +build_dir = ${JARVIS_TMP}/slepc-3.18.1 +binary_dir = +case_dir = ${JARVIS_TMP}/slepc-3.18.1 + +[BUILD] +cd ${JARVIS_ROOT} && ./jarvis -install slepc/3.18.1 bisheng+mpi + +[RUN] +run = export OMPI_ALLOW_RUN_AS_ROOT=1 OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 && make PETSC_DIR=${PETSC_PATH} test +binary = +nodes = 1 \ No newline at end of file diff --git a/test/test-mumps.sh b/test/test-mumps.sh new file mode 100644 index 0000000..4237b22 --- /dev/null +++ b/test/test-mumps.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd .. +# release mumps src code +rm -rf tmp/MUMPS_5.1.2.tar.gz +# copy templates +cp -rf templates/mumps/5.1.2/data.mumps.amd.cpu.config ./ +# switch to config +./jarvis -use data.mumps.amd.cpu.config +# download mumps src code +./jarvis -d +# install dependency +./jarvis -dp +# build +./jarvis -b +# run +./jarvis -r \ No newline at end of file diff --git a/test/test-opencoarrays.sh b/test/test-opencoarrays.sh new file mode 100644 index 0000000..6418334 --- /dev/null +++ b/test/test-opencoarrays.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd .. +# release OpenCoarrays src code +rm -rf tmp/OpenCoarrays-2.10.1.tar.gz +# copy templates +cp -rf templates/OpenCoarrays/2.10.1/data.openCoarrays.amd.cpu.config ./ +# switch to config +./jarvis -use data.openCoarrays.amd.cpu.config +# download OpenCoarrays src code +./jarvis -d +# install dependency +./jarvis -dp +# build +./jarvis -b +# run +./jarvis -r \ No newline at end of file diff --git a/test/test-petsc.sh b/test/test-petsc.sh new file mode 100644 index 0000000..8cf09ca --- /dev/null +++ b/test/test-petsc.sh @@ -0,0 +1,14 @@ +#!/bin/bash +cd .. +# release petsc src code +rm -rf tmp/petsc-3.18.1.tar.gz +# copy templates +cp -rf templates/petsc/3.18.1/data.petsc.amd.cpu.config ./ +# switch to config +./jarvis -use data.petsc.amd.cpu.config +# install dependency +./jarvis -dp +# build +./jarvis -b +# run +./jarvis -r \ No newline at end of file diff --git a/test/test-scotch.sh b/test/test-scotch.sh new file mode 100644 index 0000000..45572a7 --- /dev/null +++ b/test/test-scotch.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd .. +# release scotch src code +rm -rf tmp/scotch-v7.0.1 +# copy templates +cp -rf templates/scotch/7.0.1/data.scotch.amd.cpu.config ./ +# switch to config +./jarvis -use data.scotch.amd.cpu.config +# download scotch src code +./jarvis -d +# install dependency +./jarvis -dp +# build +./jarvis -b +# run +./jarvis -r \ No newline at end of file diff --git a/test/test-slepc.sh b/test/test-slepc.sh new file mode 100644 index 0000000..7f41f84 --- /dev/null +++ b/test/test-slepc.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd .. +# release slepc src code +rm -rf tmp/slepc-3.18.1.tar.gz +# copy templates +cp -rf templates/slepc/3.18.1/data.slepc.amd.cpu.config ./ +# switch to config +./jarvis -use data.slepc.amd.cpu.config +# download slepc src code +./jarvis -d +# install dependency +./jarvis -dp +# build +./jarvis -b +# run +./jarvis -r \ No newline at end of file -- Gitee From ff2e3cf34bd7dc89681730feb6eccf9358f6f4ac Mon Sep 17 00:00:00 2001 From: Shaoyuteng Date: Sun, 26 Mar 2023 19:16:59 +0800 Subject: [PATCH 4/4] change --- package/gcc/9.3.0/install.sh | 2 +- package/opencoarrays/2.10.1/install.sh | 8 +++++--- package/zlib/1.2.12/install.sh | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) mode change 100644 => 100755 package/zlib/1.2.12/install.sh diff --git a/package/gcc/9.3.0/install.sh b/package/gcc/9.3.0/install.sh index a6395af..ce1e008 100755 --- a/package/gcc/9.3.0/install.sh +++ b/package/gcc/9.3.0/install.sh @@ -9,4 +9,4 @@ cd gcc-9.3.0 sed -i "35s/ftp/http/g" ./contrib/download_prerequisites ./contrib/download_prerequisites ./configure --disable-multilib --enable-languages="c,c++,fortran" --prefix=$1 --disable-static --enable-shared -make -j6 && make install +make -j && make install diff --git a/package/opencoarrays/2.10.1/install.sh b/package/opencoarrays/2.10.1/install.sh index fe08303..715e6ea 100755 --- a/package/opencoarrays/2.10.1/install.sh +++ b/package/opencoarrays/2.10.1/install.sh @@ -6,6 +6,8 @@ cd ${JARVIS_TMP} rm -rf OpenCoarrays-2.10.1 tar -xvf ${JARVIS_DOWNLOAD}/OpenCoarrays-2.10.1.tar.gz cd OpenCoarrays-2.10.1 -mkdir -p opencoarrays-build && cd opencoarrays-build -cmake ${JARVIS_TMP}/OpenCoarrays-2.10.1/ -DCMAKE_INSTALL_PREFIX=$1 -make -j7 && make install \ No newline at end of file +rm -rf opencoarrays-build +mkdir opencoarrays-build && cd opencoarrays-build +cmake .. -DCMAKE_BUILD_TYPE:STRING="Release" +make -j +make install -j \ No newline at end of file diff --git a/package/zlib/1.2.12/install.sh b/package/zlib/1.2.12/install.sh old mode 100644 new mode 100755 index 3b77899..ac1cbaf --- a/package/zlib/1.2.12/install.sh +++ b/package/zlib/1.2.12/install.sh @@ -2,11 +2,11 @@ set -x set -e zlib_ver='1.2.12' -. ${DOWNLOAD_TOOL} -u https://zlib.net/zlib-${zlib_ver}.tar.gz +. ${DOWNLOAD_TOOL} -u https://zlib.net/fossils/zlib-${zlib_ver}.tar.gz cd ${JARVIS_TMP} rm -rf zlib-${zlib_ver} tar -xvf ${JARVIS_DOWNLOAD}/zlib-${zlib_ver}.tar.gz cd zlib-${zlib_ver} -./configure --prefix=$1 +CC= CXX= ./configure --prefix=$1 make -j make install -- Gitee