From 7e99e256bbca92841907cf9b913ab61ec4c5caac Mon Sep 17 00:00:00 2001 From: Vicente Adolfo Bolea Sanchez Date: Fri, 7 Oct 2022 17:42:12 -0400 Subject: [PATCH] perftest: add perf regression test --- CMake/testing/VTKmPerformanceTest.cmake | 129 ++++++++++++++++++ CMake/testing/VTKmPerformanceTestFetch.cmake | 17 +++ CMake/testing/VTKmPerformanceTestLib.cmake | 36 +++++ CMake/testing/VTKmPerformanceTestReport.cmake | 77 +++++++++++ CMake/testing/VTKmPerformanceTestRun.cmake | 35 +++++ CMake/testing/VTKmPerformanceTestUpload.cmake | 23 ++++ benchmarking/CMakeLists.txt | 15 ++ docs/CI-README.md | 103 ++++++++++++++ docs/perftest_arch.png | Bin 0 -> 71400 bytes 9 files changed, 435 insertions(+) create mode 100644 CMake/testing/VTKmPerformanceTest.cmake create mode 100644 CMake/testing/VTKmPerformanceTestFetch.cmake create mode 100644 CMake/testing/VTKmPerformanceTestLib.cmake create mode 100644 CMake/testing/VTKmPerformanceTestReport.cmake create mode 100644 CMake/testing/VTKmPerformanceTestRun.cmake create mode 100644 CMake/testing/VTKmPerformanceTestUpload.cmake create mode 100644 docs/perftest_arch.png diff --git a/CMake/testing/VTKmPerformanceTest.cmake b/CMake/testing/VTKmPerformanceTest.cmake new file mode 100644 index 000000000..71f058862 --- /dev/null +++ b/CMake/testing/VTKmPerformanceTest.cmake @@ -0,0 +1,129 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +#----------------------------------------------------------------------------- +# Adds a performance benchmark test +# +# add_benchmark_test(benchmark [ ]) +# +# Usage: +# add_benchmark_test(FiltersBenchmark BenchThreshold BenchTetrahedralize) +# +# benchmark: Target of an executable that uses Google Benchmark. +# +# filter_regex: CMake regexes that selects the specific benchmarks within the binary +# to be used. It populates the Google Benchmark +# --benchmark_filter parameter. When multiple regexes are passed +# as independent positional arguments, they are joined using the "|" +# regex operator before populating the `--benchmark_filter` parameter +# +function(add_benchmark_test benchmark) + + # We need JSON support among other things for this to work + if (CMAKE_VERSION VERSION_LESS 3.19) + message(FATAL_ERROR "Performance regression testing needs CMAKE >= 3.19") + return() + endif() + + ###TEST VARIABLES############################################################ + + # Optional positional parameters for filter_regex + set(VTKm_PERF_FILTER_NAME ".*") + if (${ARGC} GREATER_EQUAL 2) + string(REPLACE ";" "|" VTKm_PERF_FILTER_NAME "${ARGN}") + endif() + + set(VTKm_PERF_REMOTE_URL "https://gitlab.kitware.com/vbolea/vtk-m-benchmark-records.git") + + # Parameters for the null hypothesis test + set(VTKm_PERF_ALPHA 0.05) + set(VTKm_PERF_REPETITIONS 10) + set(VTKm_PERF_MIN_TIME 1) + set(VTKm_PERF_DIST "normal") + + set(VTKm_PERF_REPO "${CMAKE_BINARY_DIR}/vtk-m-benchmark-records") + set(VTKm_PERF_COMPARE_JSON "${CMAKE_BINARY_DIR}/nocommit_${benchmark}.json") + set(VTKm_PERF_STDOUT "${CMAKE_BINARY_DIR}/benchmark_${benchmark}.stdout") + set(VTKm_PERF_COMPARE_STDOUT "${CMAKE_BINARY_DIR}/compare_${benchmark}.stdout") + + if (DEFINED ENV{CI_COMMIT_SHA}) + set(VTKm_PERF_COMPARE_JSON "${CMAKE_BINARY_DIR}/$ENV{CI_COMMIT_SHA}_${benchmark}.json") + endif() + + set(test_name "PerformanceTest${benchmark}") + + ###TEST INVOKATIONS########################################################## + add_test(NAME "${test_name}Run" + COMMAND ${CMAKE_COMMAND} + "-DVTKm_PERF_BENCH_DEVICE=Any" + "-DVTKm_PERF_BENCH_PATH=${CMAKE_BINARY_DIR}/bin/${benchmark}" + "-DVTKm_PERF_FILTER_NAME=${VTKm_PERF_FILTER_NAME}" + "-DVTKm_PERF_REPETITIONS=${VTKm_PERF_REPETITIONS}" + "-DVTKm_PERF_MIN_TIME=${VTKm_PERF_MIN_TIME}" + "-DVTKm_PERF_COMPARE_JSON=${VTKm_PERF_COMPARE_JSON}" + "-DVTKm_PERF_STDOUT=${VTKm_PERF_STDOUT}" + "-DVTKm_SOURCE_DIR=${VTKm_SOURCE_DIR}" + -P "${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestRun.cmake" + ) + + add_test(NAME "${test_name}Fetch" + COMMAND ${CMAKE_COMMAND} + "-DVTKm_PERF_REPO=${VTKm_PERF_REPO}" + "-DVTKm_SOURCE_DIR=${VTKm_SOURCE_DIR}" + "-DVTKm_PERF_REMOTE_URL=${VTKm_PERF_REMOTE_URL}" + -P "${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestFetch.cmake" + ) + + add_test(NAME "${test_name}Upload" + COMMAND ${CMAKE_COMMAND} + "-DVTKm_PERF_REPO=${VTKm_PERF_REPO}" + "-DVTKm_PERF_COMPARE_JSON=${VTKm_PERF_COMPARE_JSON}" + "-DVTKm_SOURCE_DIR=${VTKm_SOURCE_DIR}" + -P "${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestUpload.cmake" + ) + + add_test(NAME "${test_name}Report" + COMMAND ${CMAKE_COMMAND} + "-DBENCHMARK_NAME=${benchmark}" + "-DVTKm_PERF_ALPHA=${VTKm_PERF_ALPHA}" + "-DVTKm_PERF_DIST=${VTKm_PERF_DIST}" + "-DVTKm_PERF_REPO=${VTKm_PERF_REPO}" + "-DVTKm_PERF_COMPARE_JSON=${VTKm_PERF_COMPARE_JSON}" + "-DVTKm_SOURCE_DIR=${VTKm_SOURCE_DIR}" + "-DVTKm_BINARY_DIR=${VTKm_BINARY_DIR}" + "-DVTKm_PERF_COMPARE_STDOUT=${VTKm_PERF_COMPARE_STDOUT}" + -P "${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestReport.cmake" + ) + + add_test(NAME "${test_name}CleanUp" + COMMAND ${CMAKE_COMMAND} -E rm -rf "${VTKm_PERF_REPO}" + ) + + ###TEST PROPERTIES########################################################### + set_tests_properties("${test_name}Report" "${test_name}Upload" + PROPERTIES + FIXTURE_REQUIRED "${test_name}Run;${test_name}Fetch" + FIXTURE_CLEANUP "${test_name}CleanUp" + REQUIRED_FILES "${VTKm_PERF_COMPARE_JSON}") + + set_tests_properties("${test_name}Run" + "${test_name}Report" + "${test_name}Upload" + "${test_name}Fetch" + "${test_name}CleanUp" + PROPERTIES RUN_SERIAL ON) + + set_tests_properties(${test_name}Run PROPERTIES TIMEOUT 1800) + + # Only upload when we are inside a CI build + if (NOT DEFINED ENV{CI_COMMIT_SHA} OR NOT DEFINED ENV{VTKM_BENCH_RECORDS_TOKEN}) + set_tests_properties(${test_name}Upload PROPERTIES DISABLED TRUE) + endif() +endfunction() diff --git a/CMake/testing/VTKmPerformanceTestFetch.cmake b/CMake/testing/VTKmPerformanceTestFetch.cmake new file mode 100644 index 000000000..9342c898b --- /dev/null +++ b/CMake/testing/VTKmPerformanceTestFetch.cmake @@ -0,0 +1,17 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +include(${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestLib.cmake) + +REQUIRE_FLAG_MUTABLE("VTKm_PERF_REPO") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_REMOTE_URL") + +file(REMOVE_RECURSE vtk-m-benchmark-records) +execute(COMMAND /usr/bin/git clone -b records ${VTKm_PERF_REMOTE_URL} ${VTKm_PERF_REPO}) diff --git a/CMake/testing/VTKmPerformanceTestLib.cmake b/CMake/testing/VTKmPerformanceTestLib.cmake new file mode 100644 index 000000000..ba5de8336 --- /dev/null +++ b/CMake/testing/VTKmPerformanceTestLib.cmake @@ -0,0 +1,36 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +macro(REQUIRE_FLAG flag) + if (NOT DEFINED ${flag}) + message(FATAL_ERROR "Need to pass the ${flag}") + endif() +endmacro(REQUIRE_FLAG) + +macro(REQUIRE_FLAG_MUTABLE flag) + REQUIRE_FLAG(${flag}) + + # Env var overrides default value + if (DEFINED ENV{${flag}}) + set(${flag} "$ENV{${flag}}") + endif() +endmacro(REQUIRE_FLAG_MUTABLE) + +macro(execute) + execute_process( + ${ARGV} + COMMAND_ECHO STDOUT + ECHO_OUTPUT_VARIABLE + ECHO_ERROR_VARIABLE + COMMAND_ERROR_IS_FATAL ANY + ) +endmacro() + +message("CTEST_FULL_OUTPUT") diff --git a/CMake/testing/VTKmPerformanceTestReport.cmake b/CMake/testing/VTKmPerformanceTestReport.cmake new file mode 100644 index 000000000..17013d36b --- /dev/null +++ b/CMake/testing/VTKmPerformanceTestReport.cmake @@ -0,0 +1,77 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +include("${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestLib.cmake") + +REQUIRE_FLAG("BENCHMARK_NAME") +REQUIRE_FLAG("VTKm_PERF_COMPARE_JSON") +REQUIRE_FLAG("VTKm_PERF_COMPARE_STDOUT") + +REQUIRE_FLAG_MUTABLE("VTKm_PERF_REPO") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_ALPHA") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_DIST") + +###FIND MOST RECENT BASELINE#################################################### +execute(COMMAND /usr/bin/git -C "${VTKm_SOURCE_DIR}" merge-base origin/master @ + OUTPUT_VARIABLE GIT_BASE_COMMIT) + +string(STRIP "${GIT_BASE_COMMIT}" GIT_BASE_COMMIT) + +execute_process(COMMAND /usr/bin/git -C "${VTKm_SOURCE_DIR}" log --format=%H --first-parent "${GIT_BASE_COMMIT}" + OUTPUT_VARIABLE GIT_ANCESTOR_COMMITS + COMMAND_ECHO STDOUT + ECHO_ERROR_VARIABLE + COMMAND_ERROR_IS_FATAL ANY + ) + +string(REPLACE "\n" ";" GIT_ANCESTOR_COMMITS ${GIT_ANCESTOR_COMMITS}) + +foreach(commit IN LISTS GIT_ANCESTOR_COMMITS) + if (EXISTS "${VTKm_PERF_REPO}/${commit}_${BENCHMARK_NAME}.json") + set(BASELINE_REPORT "${VTKm_PERF_REPO}/${commit}_${BENCHMARK_NAME}.json") + break() + endif() +endforeach() + +if (NOT DEFINED BASELINE_REPORT) + message(FATAL_ERROR "PerformanceTestReport: no ancestor benchmarks record found") +endif() + +###RUN COMPARE_PY SCRIPT######################################################## +execute(COMMAND /usr/bin/python3 + "${VTKm_SOURCE_DIR}/Utilities/Scripts/compare.py" + --alpha "${VTKm_PERF_ALPHA}" + --dist "${VTKm_PERF_DIST}" + benchmarks "${BASELINE_REPORT}" "${VTKm_PERF_COMPARE_JSON}" + OUTPUT_VARIABLE compare_py_output + ) + +# Write compare.py output to disk +file(WRITE "${VTKm_PERF_COMPARE_STDOUT}" "${compare_py_output}") + +###PERFORM NULL HYPHOTESIS###################################################### +string(REGEX MATCHALL "[^\n]*time_pvalue[^\n]*" pvalues_list ${compare_py_output}) + +foreach(pvalue_line IN LISTS pvalues_list) + # We only take into consideration the wall time of the test + string(REGEX MATCH "(.*)/manual_time_pvalue[ \t]+([0-9.]+)[ ]+" ignoreme ${pvalue_line}) + if (CMAKE_MATCH_0) + set(benchmark_name "${CMAKE_MATCH_1}") + set(benchmark_pvalue "${CMAKE_MATCH_2}") + if("${benchmark_pvalue}" LESS "${VTKm_PERF_ALPHA}") + list(APPEND time_failed_benchs ${benchmark_name}) + endif() + endif() +endforeach() + +if(time_failed_benchs) + string(REPLACE ";" "\n" time_failed_benchs "${time_failed_benchs}") + message(FATAL_ERROR "Time-failed Benchmarks:\n${time_failed_benchs}") +endif() diff --git a/CMake/testing/VTKmPerformanceTestRun.cmake b/CMake/testing/VTKmPerformanceTestRun.cmake new file mode 100644 index 000000000..06cf51b74 --- /dev/null +++ b/CMake/testing/VTKmPerformanceTestRun.cmake @@ -0,0 +1,35 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +include("${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestLib.cmake") + +REQUIRE_FLAG("VTKm_PERF_BENCH_PATH") +REQUIRE_FLAG("VTKm_PERF_FILTER_NAME") +REQUIRE_FLAG("VTKm_PERF_COMPARE_JSON") +REQUIRE_FLAG("VTKm_PERF_STDOUT") + +REQUIRE_FLAG_MUTABLE("VTKm_PERF_BENCH_DEVICE") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_REPETITIONS") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_MIN_TIME") + +execute( + COMMAND "${VTKm_PERF_BENCH_PATH}" + --vtkm-device "${VTKm_PERF_BENCH_DEVICE}" + "--benchmark_filter=${VTKm_PERF_FILTER_NAME}" + "--benchmark_out=${VTKm_PERF_COMPARE_JSON}" + "--benchmark_repetitions=${VTKm_PERF_REPETITIONS}" + "--benchmark_min_time=${VTKm_PERF_MIN_TIME}" + --benchmark_out_format=json + --benchmark_counters_tabular=true + OUTPUT_VARIABLE report_output + ) + +# Write compare.py output to disk +file(WRITE "${VTKm_PERF_STDOUT}" "${report_output}") diff --git a/CMake/testing/VTKmPerformanceTestUpload.cmake b/CMake/testing/VTKmPerformanceTestUpload.cmake new file mode 100644 index 000000000..4c5567164 --- /dev/null +++ b/CMake/testing/VTKmPerformanceTestUpload.cmake @@ -0,0 +1,23 @@ +##============================================================================ +## Copyright (c) Kitware, Inc. +## All rights reserved. +## See LICENSE.txt for details. +## +## This software is distributed WITHOUT ANY WARRANTY; without even +## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +## PURPOSE. See the above copyright notice for more information. +##============================================================================ + +include("${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTestLib.cmake") + +REQUIRE_FLAG("VTKm_PERF_COMPARE_JSON") +REQUIRE_FLAG_MUTABLE("VTKm_PERF_REPO") + +file(COPY "${VTKm_PERF_COMPARE_JSON}" DESTINATION "${VTKm_PERF_REPO}/") +get_filename_component(perf_report_name "${VTKm_PERF_COMPARE_JSON}" NAME) + +execute(COMMAND /usr/bin/git -C "${VTKm_PERF_REPO}" config --local user.name vtk-m\ benchmark\ job) +execute(COMMAND /usr/bin/git -C "${VTKm_PERF_REPO}" config --local user.email do_not_email_the_robot@kitware.com) +execute(COMMAND /usr/bin/git -C "${VTKm_PERF_REPO}" add "${perf_report_name}") +execute(COMMAND /usr/bin/git -C "${VTKm_PERF_REPO}" commit -m "Added ${perf_report_name} record") +execute(COMMAND /usr/bin/git -C "${VTKm_PERF_REPO}" push origin records) diff --git a/benchmarking/CMakeLists.txt b/benchmarking/CMakeLists.txt index aa2946cce..ae8cfe509 100644 --- a/benchmarking/CMakeLists.txt +++ b/benchmarking/CMakeLists.txt @@ -63,3 +63,18 @@ if(TARGET vtkm_rendering) add_benchmark(NAME BenchmarkRayTracing FILE BenchmarkRayTracing.cxx LIBS vtkm_rendering vtkm_source) add_benchmark(NAME BenchmarkInSitu FILE BenchmarkInSitu.cxx LIBS vtkm_rendering vtkm_source vtkm_filter vtkm_io) endif() + +if(VTKm_ENABLE_PERFORMANCE_TESTING) + include("${VTKm_SOURCE_DIR}/CMake/testing/VTKmPerformanceTest.cmake") + add_benchmark_test(BenchmarkFilters + BenchThreshold + BenchContour/IsStructuredDataSet:1/NIsoVals:12/MergePts:1/GenNormals:0 + BenchContour/IsStructuredDataSet:1/NIsoVals:12/MergePts:0/GenNormals:1/FastNormals:1 + BenchContour/IsStructuredDataSet:0/NIsoVals:12/MergePts:1/GenNormals:0 + BenchContour/IsStructuredDataSet:0/NIsoVals:12/MergePts:0/GenNormals:/FastNormals:1 + BenchTetrahedralize + BenchVertexClustering/NumDivs:256) + if(TARGET vtkm_rendering) + add_benchmark_test(BenchmarkInSitu "BenchContour") + endif() +endif() diff --git a/docs/CI-README.md b/docs/CI-README.md index 1028ed82e..f63745125 100644 --- a/docs/CI-README.md +++ b/docs/CI-README.md @@ -19,6 +19,10 @@ Gitlab CI 4. ECP Continuous Integration - OLCF Ascent testing machine +5. Automated Performance Regression tests + - Overview + - Details + # Kitware Gitlab CI GitLab CI/CD allows for software development through continous integration, delivery, and deployment. @@ -308,4 +312,103 @@ GCC8. For a view of only ascent jobs refer to the following [link][cdash-ascent]. +# Automated Performance Regression tests + +## Overview + +The design of the performance regression test is composed of the following +components: + +1. The Kitware Gitlab instance which trigger the benchmark jobs when a git + commit is pushed. +2. Gitlab CI jobs for performing the benchmarks and for generating the + comparison with the historical results. +3. A Git repository that is used for storing the historical results. +4. The Kitware CDASH instance which files, displays the performance report and + inform the developer if a performance regression has occurred. + +The performance regression test is performed whenever a git commit is pushed. +The job _performancetest_ which invoke the benchmark suite in a Gitlab runner +job and later compare its results against the historical results, stored in +CDASH, of its most immediate master ancestor. The results of this comparison are +then displayed in a brief report in the form of a comment in its corresponding +Gitlab merge-request. + +![perftest_arch](perftest_arch.png) + +## Details + +### Selection of Benchmarks + +While we can possibly run all of the provided benchmarks in the continuous +build track to avoid potential performance and latency issues in the CI, I +have initially limited the benchmark suites to: + +- BenchmarkFilters +- BenchmarkInsitu + +### Benchmark ctest + +We provide a CMake function named `add_benchmark_test` which sets the +performance regression test for the given Google Benchmark suite. It admits one +argument to filter the number of benchmarks to be executed. If ran locally, it +will not upload the results to the online record repository. + +### Requirements + +- Python3 with the SciPy package +- Benchmark tests will be enabled in a CMAKE build that sets both + `VTKm_ENABLE_BENCHMARKS` and `VTKm_ENABLE_PERFORMANCE_TESTING` + +### New Gitlab Runner requirements + +- It must have disabled every type of CPU scaling option both at the BIOS and + Kernel level (`cpugovern`). +- It must provide a gitlab runner with a concurrency level 1 to avoid other + jobs being scheduled while the benchmark is being executed. + +### How to make sense of the results + +Results of both of the benchmark and the comparison against its most recent +commit ancestor can be accessed in the CDASH Notes for the performance +regression build. The CDASH Notes can be accessed by clicking the note-like +miniature image in the build name column. + +Performance Regressions test that report a performance failure are reported in +the form of a test failure of the test `PerformanceTest($TestName)Report`. The +results of the comparison can be seen by clicking this failed test. + +Performance regression test success is determined by the performance of a null +hypothesis test with the hypothesis that the given tests performs similarly +or better than the baseline test with a confidence level 1-alpha. If a pvalue is +small enough (less than alpha), we reject the null hypothesis and we report that +the current commit introduces a performance regression. By default we use a +t-distribution with an alpha value of 5%. The pvalues can be seen in the +uploaded reports. + +The following parameters can be modified by editing the corresponding +environmental variables: + +- Alpha value: `VTKm_PERF_ALPHA` +- Minimum number of repetitions for each benchmark: `VTKm_PERF_REPETITIONS` +- Minimum time to spend for each benchmark: `VTKm_PERF_MIN_TIME` +- Statistical distribution to use: `VTKm_PERF_DIST` + +Below is an example of this raw output of the comparison of the current commit +against the baseline results: + +``` +Benchmark Time CPU Time Old Time New CPU Old CPU New +------------------------------------------------------------------------------------------------------------ +BenchThreshold/manual_time +0.0043 +0.0036 73 73 92 92 +BenchThreshold/manual_time +0.0074 +0.0060 73 73 91 92 +BenchThreshold/manual_time -0.0003 -0.0007 73 73 92 92 +BenchThreshold/manual_time -0.0019 -0.0018 73 73 92 92 +BenchThreshold/manual_time -0.0021 -0.0017 73 73 92 92 +BenchThreshold/manual_time +0.0001 +0.0006 73 73 92 92 +BenchThreshold/manual_time +0.0033 +0.0031 73 73 92 92 +BenchThreshold/manual_time -0.0071 -0.0057 73 73 92 92 +BenchThreshold/manual_time -0.0050 -0.0041 73 73 92 92 +``` + [cdash-ascent]: https://open.cdash.org/index.php?project=VTKM&filtercount=1&showfilters=1&field1=site&compare1=63&value1=ascent diff --git a/docs/perftest_arch.png b/docs/perftest_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..f35520092030c6f1e48f2dcc199e08b2f0471ee2 GIT binary patch literal 71400 zcmeFZWmKF^v?fYI2mt~Ff&_=gg9Qj~NpN>NwICJ=i4sX#?6aC{+QE|PCwy%Z)RUcIOn&j#e~@Uz zzI^W1_^m8AT-&Uvw_iIm4eHXHInuZ8>7A)NsL%`SXj8$8UgzIDK2Ez zJRGfNt|LMBqfsD^j6AA#_p9uCiG~ztQWMtFV+KSEFZkXgwfOeAx%iOBsny5};KyQF zmNnzA0>%;SqlJfokpZ6N_lk^7eHZ7kU9xo7mMTm6Ek)(J$fO$^?NNRne;el zA)86SYRf_NvQPb(RCzdp&6i_WC~qHxNQo6*dH?i3E9tIIommQ&1GiLrcMXiCVCDC( zW{#9p^t_9O+#RksmF4Yf5W;O;Rx1^sN564o{;(_mdHJ`wHc5}nDS!T#n`DCpUV(a2 z*#1hNov;@nQDzz`#qHhlT$cD-{^{@5y!LRWfP7KBJShzhq(AjRhUMZJrM>;NBHZ`$ zB>nU~fvpXWmOFQ4J1aDT3!HVAE-wk4FH4vi!>Tq|)0<)_-*8&+nBSfR_J)C_ux%vX zPVgWLvu|&dH1Ax!uob#oKksw&ak4G&IJ=1C0(~SgR;H?$>#gW4XE`3Ku{Ds?G*<2x z?6aNQ$;`b|jXW_N%cUwgVx-v;c&N**@M=0{Hs7|+PhPnSkpLBSw9n$WLaRTC(R62G zEuMO=UeDaza%zSwv*Qbs6G2)gTS(ZSvmc(3w~^`0RB=KSUU@hi?v_9981#A}NRV?K zBo8m$`=+cLVLx7Cf`l~kCJQVxd!9~34Jg}Y5;;j0*`^+S7*ox}!O?6wpNX_g=oi^4 z5f9%KqXA`jb2ffJ_a!x5czv^5(taDa4h9p|Xx-`*1tWzrm>PK+MVDZ2#ft0?21}`! zJ_O|2>EBGYLkEJTwr}^5#q+U4zk(RaAE1op-N{>IvWFmU^jW)^q_r*%fH~IW%W}+@>Kil zV5wJn(_aKG*=a%wfvM&fmg_1Vat1(1cW0$xWRZ^nhT@#j*#f6*yWNh3s*Ztdxs}n{ zRAFDuh|8~OI_2OB#fqfarG?sG$v^6J7qXnTh)3>W4SVhl^D=)eKfw7aUJJDw=@!g8 zZ-s$sE@jl6?Svf0_gtWM1_84{_po;}GehO2(RI4A?Q!vr8%MDa-G``B=RIArh?eMC zcMqT}*gv-*Qr|4)f%cbfPf+zxuhU5ti&bup@i*IzIp=P_w-vE55m>DBhH@pa7IOA2Y=nC%Mu*NL$Sn6ioqOcMLJ6K^cMUO{d-CP!&Ps)4(GWOE zI#RFF?@y4;!Pjmu4ZcL0T>tOFv#npf^I=j@4$({39e5{w`QK6|KFw$`yJMqaFim`4 zn)IMn6ah7$XvsfxU{6GQRw@){@=D*24--krpE8-b${||rJq27@Qep3SGrpqUxjN

)3v#@i$mAaxn%2RCcl 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 I5|4iWKXy1o$^ZZW literal 0 HcmV?d00001