From 8d39bafe2dbc8c3971e6d9991619ab6769913ae2 Mon Sep 17 00:00:00 2001 From: "lamia.dendani" Date: Thu, 12 Jan 2023 12:46:05 +0100 Subject: [PATCH 1/9] build and run miniqmc --- benchmarks/result_base_2_1_1.txt | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 benchmarks/result_base_2_1_1.txt diff --git a/benchmarks/result_base_2_1_1.txt b/benchmarks/result_base_2_1_1.txt new file mode 100644 index 000000000..4e1cbba87 --- /dev/null +++ b/benchmarks/result_base_2_1_1.txt @@ -0,0 +1,66 @@ +miniqmc git branch: develop +miniqmc git commit: 5ed650c8c390884d6a84f002be2bbfa103b7df3e + +Number of orbitals/splines = 384 +Tile size = 384 +Number of tiles = 1 +Number of electrons = 768 +Rmax = 1.7 +AcceptanceRatio = 0.5 +Iterations = 5 +OpenMP threads = 4 +Number of walkers per rank = 4 + +SPO coefficients size = 196608000 bytes (187.5 MB) +delayed update rank = 32 +Using SoA distance table, Jastrow + einspline, +and determinant update. +================================== +Stack timer profile in seconds +Timer Inclusive_time Exclusive_time Calls Time_per_call +Setup 0.0572 0.0572 1 0.057204007 +Total 2.3655 0.3644 1 2.365510626 + Diffusion 0.9438 0.0031 5 0.188756147 + Accept move 0.0015 0.0015 1913 0.000000782 + Complete Updates 0.0296 0.0000 5 0.005926068 + Determinant::update 0.0296 0.0296 10 0.002961351 + Current Gradient 0.0485 0.0014 3840 0.000012624 + Determinant::ratio 0.0464 0.0464 3840 0.000012076 + OneBodyJastrow 0.0004 0.0004 3840 0.000000102 + TwoBodyJastrow 0.0003 0.0003 3840 0.000000082 + Kinetic Energy 0.0090 0.0090 5 0.001805381 + OneBodyJastrow 0.0000 0.0000 5 0.000009225 + TwoBodyJastrow 0.0000 0.0000 5 0.000005901 + Make move 0.0826 0.0826 3840 0.000021510 + New Gradient 0.2125 0.0021 3840 0.000055339 + Determinant::ratio 0.0024 0.0024 3840 0.000000613 + Determinant::spovgl 0.1814 0.0048 3840 0.000047232 + Single-Particle Orbitals 0.1766 0.1766 3840 0.000045983 + OneBodyJastrow 0.0027 0.0027 3840 0.000000692 + TwoBodyJastrow 0.0240 0.0240 3840 0.000006247 + Set active 0.0836 0.0836 3840 0.000021775 + Update 0.4734 0.0010 1913 0.000247448 + Determinant::update 0.4559 0.4559 1913 0.000238301 + OneBodyJastrow 0.0002 0.0002 1913 0.000000106 + TwoBodyJastrow 0.0163 0.0163 1913 0.000008520 + Initialization 0.1507 0.0716 1 0.150714155 + Determinant::inverse 0.0249 0.0249 2 0.012473029 + Determinant::spovgl 0.0504 0.0019 2 0.025175876 + Single-Particle Orbitals 0.0484 0.0484 768 0.000063085 + OneBodyJastrow 0.0005 0.0005 1 0.000466003 + TwoBodyJastrow 0.0033 0.0033 1 0.003317725 + Pseudopotential 0.9067 0.0046 5 0.181331985 + Make move 0.3530 0.3530 15792 0.000022355 + Value 0.5491 0.0062 15792 0.000034768 + Determinant::ratio 0.0051 0.0051 15792 0.000000323 + Determinant::spoval 0.4879 0.0040 15792 0.000030896 + Single-Particle Orbitals 0.4839 0.4839 15792 0.000030640 + OneBodyJastrow 0.0052 0.0052 15792 0.000000331 + TwoBodyJastrow 0.0446 0.0446 15792 0.000002825 + +========== Throughput ============ + +Total throughput ( N_walkers * N_elec^3 / Total time ) = 7.65982e+08 +Diffusion throughput ( N_walkers * N_elec^3 / Diffusion time ) = 1.91987e+09 +Pseudopotential throughput ( N_walkers * N_elec^2 / Pseudopotential time ) = 2.60218e+06 + From bf5cfb5ddb75f8b86316ceefe21c37050971f5d6 Mon Sep 17 00:00:00 2001 From: lamialami1997 Date: Wed, 8 Feb 2023 22:46:55 +0100 Subject: [PATCH 2/9] ajout de gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a007feab0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/* From 1d00b2fda49385ef8110a3b4180159a394097414 Mon Sep 17 00:00:00 2001 From: lamialami1997 Date: Wed, 8 Feb 2023 23:09:44 +0100 Subject: [PATCH 3/9] Ajout de fichier notes --- notes_perf.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 notes_perf.md diff --git a/notes_perf.md b/notes_perf.md new file mode 100644 index 000000000..201496b5b --- /dev/null +++ b/notes_perf.md @@ -0,0 +1,7 @@ +# Optimisation +## ajout de flags de compilation +```bash + cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_CXX_COMPILER=mpicxx CMAKE_CXX_FLAGS="-Ofast -march=native -finline-functions -funroll-loops -ftree-loop-vectorize -ftree-vectorize" .. + +``` +Expliquer les flags \ No newline at end of file From 2b89aa1aed81863b7e22c6975b008903fefa184f Mon Sep 17 00:00:00 2001 From: lamialami1997 Date: Sun, 19 Feb 2023 14:03:01 +0100 Subject: [PATCH 4/9] ajout de gitignore --- .gitignore | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/.gitignore b/.gitignore index a007feab0..61fbc4039 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,46 @@ build/* +CMakeCache.txt +CMakeFiles/ +CTestTestfile.cmake +DartConfiguration.tcl +Makefile +bin/ +cmake_install.cmake +src/CMakeFiles/ +src/CTestTestfile.cmake +src/Drivers/CMakeFiles/ +src/Drivers/CTestTestfile.cmake +src/Drivers/Makefile +src/Drivers/cmake_install.cmake +src/Drivers/tests/CMakeFiles/ +src/Drivers/tests/CTestTestfile.cmake +src/Drivers/tests/Makefile +src/Drivers/tests/cmake_install.cmake +src/Makefile +src/Particle/tests/CMakeFiles/ +src/Particle/tests/CTestTestfile.cmake +src/Particle/tests/Makefile +src/Particle/tests/cmake_install.cmake +src/QMCWaveFunctions/CMakeFiles/ +src/QMCWaveFunctions/CTestTestfile.cmake +src/QMCWaveFunctions/Makefile +src/QMCWaveFunctions/cmake_install.cmake +src/QMCWaveFunctions/tests/CMakeFiles/ +src/QMCWaveFunctions/tests/CTestTestfile.cmake +src/QMCWaveFunctions/tests/Makefile +src/QMCWaveFunctions/tests/cmake_install.cmake +src/Utilities/CMakeFiles/ +src/Utilities/CTestTestfile.cmake +src/Utilities/Makefile +src/Utilities/cmake_install.cmake +src/Utilities/tests/CMakeFiles/ +src/Utilities/tests/CTestTestfile.cmake +src/Utilities/tests/Makefile +src/Utilities/tests/cmake_install.cmake +src/cmake_install.cmake +src/config.h CMakeCache.txt +CMakeFiles/ +CTestTestfile.cmake +DartConfiguration.tcl +Makefile + From 7d62b44e1568beeac5caaee244ef859e6dd8cf97 Mon Sep 17 00:00:00 2001 From: lamialami1997 Date: Mon, 20 Feb 2023 02:35:40 +0100 Subject: [PATCH 5/9] Vectorisation de la boucle interne de la fonction evaluate --- src/Numerics/Spline2/MultiBspline.hpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Numerics/Spline2/MultiBspline.hpp b/src/Numerics/Spline2/MultiBspline.hpp index d687d2fad..559cc507a 100644 --- a/src/Numerics/Spline2/MultiBspline.hpp +++ b/src/Numerics/Spline2/MultiBspline.hpp @@ -55,10 +55,24 @@ inline void evaluate_v(const typename bspline_traits::SplineType* restrict const T* restrict coefs = spline_m->coefs + ((ix + i) * xs + (iy + j) * ys + iz * zs); ASSUME_ALIGNED(coefs); //#pragma omp simd - for (size_t n = 0; n < num_splines; n++) + /*for (size_t n = 0; n < num_splines; n++) vals[n] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + - c[3] * coefs[n + 3 * zs]); + c[3] * coefs[n + 3 * zs]);*/ + // déroulage de boucle par 4 element + #pragma omp simd aligned(coefs:64) + for (size_t n = 0; n < num_splines-(num_splines%4); n+=4) + { + vals[n] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]); + vals[n+1] += pre00 * (c[0] * coefs[n+1] + c[1] * coefs[(n+1) + zs] + c[2] * coefs[(n+1) + 2 * zs] + c[3] * coefs[(n+1) + 3 * zs]); + vals[n+2] += pre00 * (c[0] * coefs[n+2] + c[1] * coefs[(n+2) + zs] + c[2] * coefs[(n+2) + 2 * zs] + c[3] * coefs[(n+2) + 3 * zs]); + vals[n+3] += pre00 * (c[0] * coefs[n+3] + c[1] * coefs[(n+3) + zs] + c[2] * coefs[(n+3) + 2 * zs] + c[3] * coefs[(n+3) + 3 * zs]); + } + for (size_t n = num_splines-(num_splines%4); n< num_splines; n++) + { + vals[n] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]); + } + } } From fe20d77b6315761822459624461d8100963aee9c Mon Sep 17 00:00:00 2001 From: lamialami1997 Date: Sat, 25 Feb 2023 13:35:04 +0100 Subject: [PATCH 6/9] modif --- src/Numerics/Spline2/MultiBspline.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Numerics/Spline2/MultiBspline.hpp b/src/Numerics/Spline2/MultiBspline.hpp index 559cc507a..6ebcad7f5 100644 --- a/src/Numerics/Spline2/MultiBspline.hpp +++ b/src/Numerics/Spline2/MultiBspline.hpp @@ -63,7 +63,7 @@ inline void evaluate_v(const typename bspline_traits::SplineType* restrict #pragma omp simd aligned(coefs:64) for (size_t n = 0; n < num_splines-(num_splines%4); n+=4) { - vals[n] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]); + vals[n+0] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]); vals[n+1] += pre00 * (c[0] * coefs[n+1] + c[1] * coefs[(n+1) + zs] + c[2] * coefs[(n+1) + 2 * zs] + c[3] * coefs[(n+1) + 3 * zs]); vals[n+2] += pre00 * (c[0] * coefs[n+2] + c[1] * coefs[(n+2) + zs] + c[2] * coefs[(n+2) + 2 * zs] + c[3] * coefs[(n+2) + 3 * zs]); vals[n+3] += pre00 * (c[0] * coefs[n+3] + c[1] * coefs[(n+3) + zs] + c[2] * coefs[(n+3) + 2 * zs] + c[3] * coefs[(n+3) + 3 * zs]); From 9dc10c255dcd5c037444a3a379aee5046c5405e0 Mon Sep 17 00:00:00 2001 From: "lamia.dendani" Date: Wed, 1 Mar 2023 22:18:23 +0100 Subject: [PATCH 7/9] =?UTF-8?q?ajout=20des=20block=20simd=20dans=20des=20f?= =?UTF-8?q?onction=20et=20ajout=20des=20benchmarks=20de=20scalabilit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exec.sh | 62 ++++++++++++++++++ plot.gp | 23 +++++++ plot.png | Bin 0 -> 15937 bytes src/QMCWaveFunctions/Jastrow/TwoBodyJastrow.h | 20 +++++- 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 exec.sh create mode 100644 plot.gp create mode 100644 plot.png diff --git a/exec.sh b/exec.sh new file mode 100644 index 000000000..1ac020069 --- /dev/null +++ b/exec.sh @@ -0,0 +1,62 @@ +#!/bin/bash +rm -rf scalabilite_bench.dat +TIME_FORMAT=%R +max_core=$1 + +printf 'running on 1 process\n\n' +echo -n "1 1; " >> scalabilite_bench.dat +OMP_NUM_THREADS=1 ~/time -p ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat +echo ";" >> scalabilite_bench.dat +for((i=2; i<=max_core; i=i*2)) +do + printf 'running on %d mpi process and 1 omp threads\n' "$i" + echo -n "$i 1; " >> scalabilite_bench.dat + OMP_NUM_THREADS=1 ~/time -p mpirun -n $i ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat + echo ";" >> scalabilite_bench.dat + + printf 'running on 1 mpi process and %d omp threads\n' "$i" + echo -n "1 $i; " >> scalabilite_bench.dat + OMP_NUM_THREADS=$i ~/time -p ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat + echo ";" >> scalabilite_bench.dat + + for((k=2; k> scalabilite_bench.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat + echo ";" >> scalabilite_bench.dat + + done + printf "\n" + if((i==max_core)) + then + exit 0 + fi +done + +printf 'running on %d mpi process and 1 omp threads\n' "$max_core" +echo -n "$max_core 1; " >> scalabilite_bench.dat +OMP_NUM_THREADS=1 ~/time -p mpirun -n $max_core ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat +echo ";" >> scalabilite_bench.dat + +printf 'running on 1 mpi process and %d omp threads\n' "$max_core" +echo -n "1 $max_core; " >> scalabilite_bench.dat +OMP_NUM_THREADS=$max_core ~/time -p ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat +echo ";" >> scalabilite_bench.dat + +for((k=2; k<=max_core; k=k*2)) +do + div=$(($max_core/$k)) + if((div == 1 && k!= max_core)); then break; fi + printf 'running on %d mpi process and %d omp threads\n' "$k" "$div" + echo -n "$k $div; " >> scalabilite_bench.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat + echo ";" >> scalabilite_bench.dat + + printf 'running on %d mpi process and %d omp threads\n' "$div" "$k" + echo -n "$div $k; " >> scalabilite_bench.dat + OMP_NUM_THREADS=$k ~/time -p mpirun -n $div ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench.dat + echo ";" >> scalabilite_bench.dat +done +printf "\n" diff --git a/plot.gp b/plot.gp new file mode 100644 index 000000000..7efe60742 --- /dev/null +++ b/plot.gp @@ -0,0 +1,23 @@ +set term png size 1200,700 enhanced font "Terminal,12" +set output "plot.png" +set grid + +set datafile separator ";" + +set auto x + +set style data histogram +set style fill solid border -1 +set boxwidth 0.9 + +set xtic rotate by -44 scale 0 + +set multiplot layout 1, 1 rowsfirst + +set key right +set yrange [0:100] +set ylabel "Time (ms)" +set xlabel "Running on 'Nb' mpi process and 'Nb' omp threads " +set title "Scalability analysis of the miniQMC application " +plot "scalabilite_bench.dat" using (1/$1)*100 :xticlabels(stringcolumn(1)) t "mpi+threads" + diff --git a/plot.png b/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..31ed0068ae72ff883df6711ed801ed16401a8360 GIT binary patch literal 15937 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 literal 0 HcmV?d00001 diff --git a/src/QMCWaveFunctions/Jastrow/TwoBodyJastrow.h b/src/QMCWaveFunctions/Jastrow/TwoBodyJastrow.h index 17bd48e9e..03b426238 100644 --- a/src/QMCWaveFunctions/Jastrow/TwoBodyJastrow.h +++ b/src/QMCWaveFunctions/Jastrow/TwoBodyJastrow.h @@ -122,6 +122,7 @@ struct TwoBodyJastrow : public WaveFunctionComponent { valT curUat(0); const int igt = P.GroupID[iat] * NumGroups; + #pragma simd for (int jg = 0; jg < NumGroups; ++jg) { const FuncType& f2(*F[igt + jg]); @@ -148,8 +149,9 @@ struct TwoBodyJastrow : public WaveFunctionComponent for (int idim = 0; idim < OHMMS_DIM; ++idim) { const valT* restrict dX = displ.data(idim); - valT s = valT(); + valT s = valT(); + #pragma omp simd reduction(+ : s) for (int jat = 0; jat < N; ++jat) s += du[jat] * dX[jat]; grad[idim] = s; @@ -263,6 +265,9 @@ inline void TwoBodyJastrow::computeU3(const ParticleSet& P, std::fill_n(d2u, jelmax, czero); const int igt = P.GroupID[iat] * NumGroups; + + #pragma omp simd + for (int jg = 0; jg < NumGroups; ++jg) { const FuncType& f2(*F[igt + jg]); @@ -319,6 +324,8 @@ void TwoBodyJastrow::acceptMove(ParticleSet& P, int iat) const auto& new_dr = d_table->Temp_dr; const auto& old_dr = d_table->Displacements[iat]; constexpr valT lapfac = OHMMS_DIM - RealType(1); + + #pragma omp simd for (int jat = 0; jat < N; jat++) { const valT du = cur_u[jat] - old_u[jat]; @@ -337,6 +344,8 @@ void TwoBodyJastrow::acceptMove(ParticleSet& P, int iat) const valT* restrict old_du_pt = old_du.data(); valT* restrict save_g = dUat.data(idim); valT cur_g = cur_dUat[idim]; + + #pragma omp simd for (int jat = 0; jat < N; jat++) { const valT newg = cur_du_pt[jat] * new_dX[jat]; @@ -376,6 +385,8 @@ void TwoBodyJastrow::recompute(ParticleSet& P) { const valT* restrict dX = displ.data(idim); valT s = valT(); + + #pragma omp simd reduction(+ : s) for (int jat = 0; jat < iat; ++jat) s += du[jat] * dX[jat]; grad[idim] = s; @@ -383,15 +394,20 @@ void TwoBodyJastrow::recompute(ParticleSet& P) dUat(iat) = grad; d2Uat[iat] = -lap; // add the contribution from the upper triangle + + #pragma omp simd for (int jat = 0; jat < iat; jat++) { Uat[jat] += u[jat]; d2Uat[jat] -= d2u[jat] + lapfac * du[jat]; } + for (int idim = 0; idim < OHMMS_DIM; ++idim) { valT* restrict save_g = dUat.data(idim); const valT* restrict dX = displ.data(idim); + + #pragma omp simd for (int jat = 0; jat < iat; jat++) save_g[jat] -= du[jat] * dX[jat]; } @@ -418,6 +434,8 @@ void TwoBodyJastrow::evaluateGL(ParticleSet& P, if (fromscratch) recompute(P); LogValue = valT(0); + + #pragma omp simd reduction(+ : LogValue) for (int iat = 0; iat < N; ++iat) { LogValue += Uat[iat]; From 60eb64bd528da6eb1cec65956c7bb745e62a7f38 Mon Sep 17 00:00:00 2001 From: "lamia.dendani" Date: Thu, 2 Mar 2023 14:50:04 +0100 Subject: [PATCH 8/9] modification de benchmarks --- plot.gp | 22 ++++++++++++---------- plot.png | Bin 15937 -> 16582 bytes 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/plot.gp b/plot.gp index 7efe60742..dd39a0a5e 100644 --- a/plot.gp +++ b/plot.gp @@ -1,9 +1,8 @@ -set term png size 1200,700 enhanced font "Terminal,12" +set term png size 1700,700 enhanced font "Terminal,12" set output "plot.png" -set grid +#set grid set datafile separator ";" - set auto x set style data histogram @@ -11,13 +10,16 @@ set style fill solid border -1 set boxwidth 0.9 set xtic rotate by -44 scale 0 - +set logscale y set multiplot layout 1, 1 rowsfirst -set key right -set yrange [0:100] -set ylabel "Time (ms)" -set xlabel "Running on 'Nb' mpi process and 'Nb' omp threads " -set title "Scalability analysis of the miniQMC application " -plot "scalabilite_bench.dat" using (1/$1)*100 :xticlabels(stringcolumn(1)) t "mpi+threads" +set key left +set ylabel "Time (s)" +set xlabel "Running on 'Nb' mpi process and 'Nb' omp threads" +set title "Scalability analysis of the miniQMC application with differents problems size" +plot "scalabilite_bench211.dat" using 2:xticlabels(stringcolumn(1)) t "miniQMC+211",\ + "scalabilite_bench221.dat" using 2:xticlabels(stringcolumn(1)) t "miniQMC+221",\ + "scalabilite_bench222.dat" using 2:xticlabels(stringcolumn(1)) t "miniQMC+222",\ + "scalabilite_bench422.dat" using 2:xticlabels(stringcolumn(1)) t "miniQMC+422" + diff --git a/plot.png b/plot.png index 31ed0068ae72ff883df6711ed801ed16401a8360..da0d44a1d0de8f37a19c66f25326372cfac5343c 100644 GIT binary patch literal 16582 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 From 7916d5fdb363fe4bafba45abd0bd500690db2e87 Mon Sep 17 00:00:00 2001 From: "lamia.dendani" Date: Fri, 3 Mar 2023 11:40:45 +0100 Subject: [PATCH 9/9] =?UTF-8?q?=20ajout=20des=20benchmarks=20et=20r=C3=A9o?= =?UTF-8?q?rganisation=20du=20projet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plot.gp => Benchmark_base/plot.gp | 0 Benchmark_base/plot.png | Bin 0 -> 16582 bytes Benchmark_base/scalabilite_bench.dat | 31 +++++++++ Benchmark_base/scalabilite_bench211.dat | 40 +++++++++++ Benchmark_base/scalabilite_bench221.dat | 41 ++++++++++++ Benchmark_base/scalabilite_bench222.dat | 34 ++++++++++ Benchmark_base/scalabilite_bench422.dat | 40 +++++++++++ Benchmarks_omp/plot.gp | 26 ++++++++ Benchmarks_omp/plot.png | Bin 0 -> 16569 bytes Benchmarks_omp/scalabilite_bench211.dat | 37 +++++++++++ Benchmarks_omp/scalabilite_bench221.dat | 40 +++++++++++ Benchmarks_omp/scalabilite_bench222.dat | 39 +++++++++++ Benchmarks_omp/scalabilite_bench422.dat | 40 +++++++++++ bench.sh | 4 ++ bench_comparaison/plot.gp | 25 +++++++ bench_comparaison/plot.png | Bin 0 -> 17086 bytes .../scalabilite_bench422base.dat | 40 +++++++++++ bench_comparaison/scalabilite_bench422omp.dat | 40 +++++++++++ exec211.sh | 62 ++++++++++++++++++ exec221.sh | 62 ++++++++++++++++++ exec222.sh | 62 ++++++++++++++++++ exec422.sh | 62 ++++++++++++++++++ src/Numerics/Spline2/MultiBspline.hpp | 17 +++-- src/Particle/Lattice/ParticleBConds.h | 2 + 24 files changed, 739 insertions(+), 5 deletions(-) rename plot.gp => Benchmark_base/plot.gp (100%) create mode 100644 Benchmark_base/plot.png create mode 100644 Benchmark_base/scalabilite_bench.dat create mode 100644 Benchmark_base/scalabilite_bench211.dat create mode 100644 Benchmark_base/scalabilite_bench221.dat create mode 100644 Benchmark_base/scalabilite_bench222.dat create mode 100644 Benchmark_base/scalabilite_bench422.dat create mode 100644 Benchmarks_omp/plot.gp create mode 100644 Benchmarks_omp/plot.png create mode 100644 Benchmarks_omp/scalabilite_bench211.dat create mode 100644 Benchmarks_omp/scalabilite_bench221.dat create mode 100644 Benchmarks_omp/scalabilite_bench222.dat create mode 100644 Benchmarks_omp/scalabilite_bench422.dat create mode 100644 bench.sh create mode 100644 bench_comparaison/plot.gp create mode 100644 bench_comparaison/plot.png create mode 100644 bench_comparaison/scalabilite_bench422base.dat create mode 100644 bench_comparaison/scalabilite_bench422omp.dat create mode 100644 exec211.sh create mode 100644 exec221.sh create mode 100644 exec222.sh create mode 100644 exec422.sh diff --git a/plot.gp b/Benchmark_base/plot.gp similarity index 100% rename from plot.gp rename to Benchmark_base/plot.gp diff --git a/Benchmark_base/plot.png b/Benchmark_base/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..da0d44a1d0de8f37a19c66f25326372cfac5343c GIT binary patch literal 16582 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 literal 0 HcmV?d00001 diff --git a/bench_comparaison/scalabilite_bench422base.dat b/bench_comparaison/scalabilite_bench422base.dat new file mode 100644 index 000000000..d6f805206 --- /dev/null +++ b/bench_comparaison/scalabilite_bench422base.dat @@ -0,0 +1,40 @@ +1 1; 101.33 +1 2; 101.38 +1 4; 106.76 +1 8; 112.05 +1 16; 120.38 +1 32; 210.00 +1 48; 312.79 +2 1; 103.69 +2 2; 165.27 +2 4; 336.69 +2 8; 676.17 +2 16; 1395.95 +2 24; 2059.04 +3 16; 385.52 +4 1; 100.67 +4 2; 109.86 +4 4; 116.53 +4 8; 197.72 +4 12; 290.18 +6 8; 289.73 +8 1; 110.60 +8 2; 116.01 +8 4; 189.65 +8 6; 289.75 +12 4; 288.98 +16 1; 114.77 +16 2; 193.47 +16 3; 290.29 +24 2; 290.24 +32 1; 0.15 +48 1; 0.15 + + + + + + + + + diff --git a/bench_comparaison/scalabilite_bench422omp.dat b/bench_comparaison/scalabilite_bench422omp.dat new file mode 100644 index 000000000..9dc6951b6 --- /dev/null +++ b/bench_comparaison/scalabilite_bench422omp.dat @@ -0,0 +1,40 @@ +1 1; 119.23 +1 2; 120.35 +1 4; 127.97 +1 8; 132.13 +1 16; 139.62 +1 32; 233.18 +1 48; 329.06 +2 1; 121.54 +2 2; 206.11 +2 4; 405.85 +2 8; 822.06 +2 16; 1667.00 +2 24; 2504.87 +3 16; 433.31 +4 1; 118.62 +4 2; 129.26 +4 4; 137.09 +4 8; 225.07 +4 12; 315.16 +6 8; 313.06 +8 1; 130.30 +8 2; 135.34 +8 4; 214.02 +8 6; 313.55 +12 4; 312.25 +16 1; 135.76 +16 2; 212.71 +16 3; 313.45 +24 2; 313.00 +32 1; 0.15 +48 1; 0.16 +; + + + + + + + + diff --git a/exec211.sh b/exec211.sh new file mode 100644 index 000000000..ea4cb2db2 --- /dev/null +++ b/exec211.sh @@ -0,0 +1,62 @@ +#!/bin/bash +rm -rf scalabilite_bench211.dat +TIME_FORMAT=%R +max_core=$1 + +printf 'running on 1 process\n\n' +echo -n "1 1; " >> scalabilite_bench211.dat +OMP_NUM_THREADS=1 ~/time -p ./build/bin/miniqmc -g "2 1 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat +echo ";" >> scalabilite_bench211.dat +for((i=2; i<=max_core; i=i*2)) +do + printf 'running on %d mpi process and 1 omp threads\n' "$i" + echo -n "$i 1; " >> scalabilite_bench211.dat + OMP_NUM_THREADS=1 ~/time -p mpirun -n $i ./build/bin/miniqmc -g "2 1 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat + echo ";" >> scalabilite_bench211.dat + + printf 'running on 1 mpi process and %d omp threads\n' "$i" + echo -n "1 $i; " >> scalabilite_bench211.dat + OMP_NUM_THREADS=$i ~/time -p ./build/bin/miniqmc -g "2 1 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat + echo ";" >> scalabilite_bench211.dat + + for((k=2; k> scalabilite_bench211.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 1 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat + echo ";" >> scalabilite_bench211.dat + + done + printf "\n" + if((i==max_core)) + then + exit 0 + fi +done + +printf 'running on %d mpi process and 1 omp threads\n' "$max_core" +echo -n "$max_core 1; " >> scalabilite_bench211.dat +OMP_NUM_THREADS=1 ~/time -p mpirun -n $max_core ./build/bin/miniqmc -g "2 1 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat +echo ";" >> scalabilite_bench211.dat + +printf 'running on 1 mpi process and %d omp threads\n' "$max_core" +echo -n "1 $max_core; " >> scalabilite_bench211.dat +OMP_NUM_THREADS=$max_core ~/time -p ./build/bin/miniqmc -g "2 1 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat +echo ";" >> scalabilite_bench211.dat + +for((k=2; k<=max_core; k=k*2)) +do + div=$(($max_core/$k)) + if((div == 1 && k!= max_core)); then break; fi + printf 'running on %d mpi process and %d omp threads\n' "$k" "$div" + echo -n "$k $div; " >> scalabilite_bench211.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 1 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat + echo ";" >> scalabilite_bench211.dat + + printf 'running on %d mpi process and %d omp threads\n' "$div" "$k" + echo -n "$div $k; " >> scalabilite_bench211.dat + OMP_NUM_THREADS=$k ~/time -p mpirun -n $div ./build/bin/miniqmc -g "2 1 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench211.dat + echo ";" >> scalabilite_bench211.dat +done +printf "\n" diff --git a/exec221.sh b/exec221.sh new file mode 100644 index 000000000..2d0ddd7a1 --- /dev/null +++ b/exec221.sh @@ -0,0 +1,62 @@ +#!/bin/bash +rm -rf scalabilite_bench221.dat +TIME_FORMAT=%R +max_core=$1 + +printf 'running on 1 process\n\n' +echo -n "1 1; " >> scalabilite_bench221.dat +OMP_NUM_THREADS=1 ~/time -p ./build/bin/miniqmc -g "2 2 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat +echo ";" >> scalabilite_bench221.dat +for((i=2; i<=max_core; i=i*2)) +do + printf 'running on %d mpi process and 1 omp threads\n' "$i" + echo -n "$i 1; " >> scalabilite_bench221.dat + OMP_NUM_THREADS=1 ~/time -p mpirun -n $i ./build/bin/miniqmc -g "2 2 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat + echo ";" >> scalabilite_bench221.dat + + printf 'running on 1 mpi process and %d omp threads\n' "$i" + echo -n "1 $i; " >> scalabilite_bench221.dat + OMP_NUM_THREADS=$i ~/time -p ./build/bin/miniqmc -g "2 2 1" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat + echo ";" >> scalabilite_bench221.dat + + for((k=2; k> scalabilite_bench221.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat + echo ";" >> scalabilite_bench221.dat + + done + printf "\n" + if((i==max_core)) + then + exit 0 + fi +done + +printf 'running on %d mpi process and 1 omp threads\n' "$max_core" +echo -n "$max_core 1; " >> scalabilite_bench221.dat +OMP_NUM_THREADS=1 ~/time -p mpirun -n $max_core ./build/bin/miniqmc -g "2 2 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat +echo ";" >> scalabilite_bench221.dat + +printf 'running on 1 mpi process and %d omp threads\n' "$max_core" +echo -n "1 $max_core; " >> scalabilite_bench221.dat +OMP_NUM_THREADS=$max_core ~/time -p ./build/bin/miniqmc -g "2 2 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat +echo ";" >> scalabilite_bench221.dat + +for((k=2; k<=max_core; k=k*2)) +do + div=$(($max_core/$k)) + if((div == 1 && k!= max_core)); then break; fi + printf 'running on %d mpi process and %d omp threads\n' "$k" "$div" + echo -n "$k $div; " >> scalabilite_bench221.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat + echo ";" >> scalabilite_bench221.dat + + printf 'running on %d mpi process and %d omp threads\n' "$div" "$k" + echo -n "$div $k; " >> scalabilite_bench221.dat + OMP_NUM_THREADS=$k ~/time -p mpirun -n $div ./build/bin/miniqmc -g "2 2 1"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench221.dat + echo ";" >> scalabilite_bench221.dat +done +printf "\n" diff --git a/exec222.sh b/exec222.sh new file mode 100644 index 000000000..1e772f577 --- /dev/null +++ b/exec222.sh @@ -0,0 +1,62 @@ +#!/bin/bash +rm -rf scalabilite_bench222.dat +TIME_FORMAT=%R +max_core=$1 + +printf 'running on 1 process\n\n' +echo -n "1 1; " >> scalabilite_bench222.dat +OMP_NUM_THREADS=1 ~/time -p ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat +echo ";" >> scalabilite_bench222.dat +for((i=2; i<=max_core; i=i*2)) +do + printf 'running on %d mpi process and 1 omp threads\n' "$i" + echo -n "$i 1; " >> scalabilite_bench222.dat + OMP_NUM_THREADS=1 ~/time -p mpirun -n $i ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat + echo ";" >> scalabilite_bench222.dat + + printf 'running on 1 mpi process and %d omp threads\n' "$i" + echo -n "1 $i; " >> scalabilite_bench222.dat + OMP_NUM_THREADS=$i ~/time -p ./build/bin/miniqmc -g "2 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat + echo ";" >> scalabilite_bench222.dat + + for((k=2; k> scalabilite_bench222.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat + echo ";" >> scalabilite_bench222.dat + + done + printf "\n" + if((i==max_core)) + then + exit 0 + fi +done + +printf 'running on %d mpi process and 1 omp threads\n' "$max_core" +echo -n "$max_core 1; " >> scalabilite_bench222.dat +OMP_NUM_THREADS=1 ~/time -p mpirun -n $max_core ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat +echo ";" >> scalabilite_bench222.dat + +printf 'running on 1 mpi process and %d omp threads\n' "$max_core" +echo -n "1 $max_core; " >> scalabilite_bench222.dat +OMP_NUM_THREADS=$max_core ~/time -p ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat +echo ";" >> scalabilite_bench222.dat + +for((k=2; k<=max_core; k=k*2)) +do + div=$(($max_core/$k)) + if((div == 1 && k!= max_core)); then break; fi + printf 'running on %d mpi process and %d omp threads\n' "$k" "$div" + echo -n "$k $div; " >> scalabilite_bench222.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat + echo ";" >> scalabilite_bench222.dat + + printf 'running on %d mpi process and %d omp threads\n' "$div" "$k" + echo -n "$div $k; " >> scalabilite_bench222.dat + OMP_NUM_THREADS=$k ~/time -p mpirun -n $div ./build/bin/miniqmc -g "2 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench222.dat + echo ";" >> scalabilite_bench222.dat +done +printf "\n" diff --git a/exec422.sh b/exec422.sh new file mode 100644 index 000000000..0d77c5668 --- /dev/null +++ b/exec422.sh @@ -0,0 +1,62 @@ +#!/bin/bash +rm -rf scalabilite_bench422.dat +TIME_FORMAT=%R +max_core=$1 + +printf 'running on 1 process\n\n' +echo -n "1 1; " >> scalabilite_bench422.dat +OMP_NUM_THREADS=1 ~/time -p ./build/bin/miniqmc -g "4 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat +echo ";" >> scalabilite_bench422.dat +for((i=2; i<=max_core; i=i*2)) +do + printf 'running on %d mpi process and 1 omp threads\n' "$i" + echo -n "$i 1; " >> scalabilite_bench422.dat + OMP_NUM_THREADS=1 ~/time -p mpirun -n $i ./build/bin/miniqmc -g "4 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat + echo ";" >> scalabilite_bench422.dat + + printf 'running on 1 mpi process and %d omp threads\n' "$i" + echo -n "1 $i; " >> scalabilite_bench422.dat + OMP_NUM_THREADS=$i ~/time -p ./build/bin/miniqmc -g "4 2 2" |& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat + echo ";" >> scalabilite_bench422.dat + + for((k=2; k> scalabilite_bench422.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "4 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat + echo ";" >> scalabilite_bench422.dat + + done + printf "\n" + if((i==max_core)) + then + exit 0 + fi +done + +printf 'running on %d mpi process and 1 omp threads\n' "$max_core" +echo -n "$max_core 1; " >> scalabilite_bench422.dat +OMP_NUM_THREADS=1 ~/time -p mpirun -n $max_core ./build/bin/miniqmc -g "4 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat +echo ";" >> scalabilite_bench422.dat + +printf 'running on 1 mpi process and %d omp threads\n' "$max_core" +echo -n "1 $max_core; " >> scalabilite_bench422.dat +OMP_NUM_THREADS=$max_core ~/time -p ./build/bin/miniqmc -g "4 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat +echo ";" >> scalabilite_bench422.dat + +for((k=2; k<=max_core; k=k*2)) +do + div=$(($max_core/$k)) + if((div == 1 && k!= max_core)); then break; fi + printf 'running on %d mpi process and %d omp threads\n' "$k" "$div" + echo -n "$k $div; " >> scalabilite_bench422.dat + OMP_NUM_THREADS=$div ~/time -p mpirun -n $k ./build/bin/miniqmc -g "4 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat + echo ";" >> scalabilite_bench422.dat + + printf 'running on %d mpi process and %d omp threads\n' "$div" "$k" + echo -n "$div $k; " >> scalabilite_bench422.dat + OMP_NUM_THREADS=$k ~/time -p mpirun -n $div ./build/bin/miniqmc -g "4 2 2"|& grep -E "real [0-9][0-9]*\.[0-9][0-9]*" | sed "s/real //g" >> scalabilite_bench422.dat + echo ";" >> scalabilite_bench422.dat +done +printf "\n" diff --git a/src/Numerics/Spline2/MultiBspline.hpp b/src/Numerics/Spline2/MultiBspline.hpp index 6ebcad7f5..25cc5f5cf 100644 --- a/src/Numerics/Spline2/MultiBspline.hpp +++ b/src/Numerics/Spline2/MultiBspline.hpp @@ -48,6 +48,7 @@ inline void evaluate_v(const typename bspline_traits::SplineType* restrict ASSUME_ALIGNED(vals); std::fill(vals, vals + num_splines, zero); + for (size_t i = 0; i < 4; i++) for (size_t j = 0; j < 4; j++) { @@ -60,7 +61,8 @@ inline void evaluate_v(const typename bspline_traits::SplineType* restrict (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]);*/ // déroulage de boucle par 4 element - #pragma omp simd aligned(coefs:64) + + #pragma omp parallel for simd aligned(coefs:64) for (size_t n = 0; n < num_splines-(num_splines%4); n+=4) { vals[n+0] += pre00 * (c[0] * coefs[n] + c[1] * coefs[n + zs] + c[2] * coefs[n + 2 * zs] + c[3] * coefs[n + 3 * zs]); @@ -135,7 +137,10 @@ evaluate_vgl(const typename bspline_traits::SplineType* restrict spline_m, ASSUME_ALIGNED(coefs3zs); #pragma noprefetch -#pragma omp simd +#pragma omp parallel + +{ + #pragma omp for simd for (int n = 0; n < num_splines; n++) { const T coefsv = coefs[n]; @@ -164,7 +169,7 @@ evaluate_vgl(const typename bspline_traits::SplineType* restrict spline_m, const T dyInv2 = dyInv * dyInv; const T dzInv2 = dzInv * dzInv; -#pragma omp simd +#pragma omp for simd for (int n = 0; n < num_splines; n++) { gx[n] *= dxInv; @@ -174,6 +179,7 @@ evaluate_vgl(const typename bspline_traits::SplineType* restrict spline_m, } } +} template inline void evaluate_vgh(const typename bspline_traits::SplineType* restrict spline_m, T x, T y, T z, @@ -243,7 +249,8 @@ evaluate_vgh(const typename bspline_traits::SplineType* restrict spline_m, const T pre02 = a[i] * d2b[j]; const int iSplitPoint = num_splines; -#pragma omp simd + +#pragma omp parallel for simd for (int n = 0; n < iSplitPoint; n++) { T coefsv = coefs[n]; @@ -278,7 +285,7 @@ evaluate_vgh(const typename bspline_traits::SplineType* restrict spline_m, const T dxz = dxInv * dzInv; const T dyz = dyInv * dzInv; -#pragma omp simd +#pragma omp parallel for simd for (int n = 0; n < num_splines; n++) { gx[n] *= dxInv; diff --git a/src/Particle/Lattice/ParticleBConds.h b/src/Particle/Lattice/ParticleBConds.h index 36961880e..57a21c22d 100644 --- a/src/Particle/Lattice/ParticleBConds.h +++ b/src/Particle/Lattice/ParticleBConds.h @@ -82,6 +82,8 @@ struct DTD_BConds { const int n = dr.size(); const T cone(1); + + #pragma omp simd for (int i = 0; i < n; ++i) { r[i] = std::sqrt(apply_bc(dr[i]));