SPEC CPU(R)2017 Floating Point Rate Result Fujitsu PRIMERGY RX2450 M1, AMD EPYC 7F52, 3.50 GHz Test Sponsor: Fujitsu CPU2017 License: 19 Test date: Feb-2021 Test sponsor: Fujitsu Hardware availability: Apr-2021 Tested by: Fujitsu Software availability: Jul-2020 Base Base Base Peak Peak Peak Benchmarks Copies Run Time Rate Copies Run Time Rate --------------- ------- --------- --------- ------- --------- --------- 503.bwaves_r 64 879 730 S 503.bwaves_r 64 876 732 * 503.bwaves_r 64 873 735 S 507.cactuBSSN_r 64 161 504 * 507.cactuBSSN_r 64 161 504 S 507.cactuBSSN_r 64 161 502 S 508.namd_r 64 279 218 S 508.namd_r 64 279 218 * 508.namd_r 64 279 218 S 510.parest_r 64 472 355 S 510.parest_r 64 469 357 S 510.parest_r 64 471 356 * 511.povray_r 64 463 323 * 511.povray_r 64 464 322 S 511.povray_r 64 463 323 S 519.lbm_r 64 394 171 S 519.lbm_r 64 393 172 * 519.lbm_r 64 393 172 S 521.wrf_r 64 395 363 * 521.wrf_r 64 395 363 S 521.wrf_r 64 391 367 S 526.blender_r 64 286 341 * 526.blender_r 64 286 341 S 526.blender_r 64 285 342 S 527.cam4_r 64 352 318 * 527.cam4_r 64 352 318 S 527.cam4_r 64 352 318 S 538.imagick_r 64 184 864 S 538.imagick_r 64 186 854 S 538.imagick_r 64 185 862 * 544.nab_r 64 274 393 S 544.nab_r 64 275 391 S 544.nab_r 64 275 392 * 549.fotonik3d_r 64 1037 241 S 549.fotonik3d_r 64 1037 240 * 549.fotonik3d_r 64 1038 240 S 554.roms_r 64 489 208 * 554.roms_r 64 488 208 S 554.roms_r 64 489 208 S ================================================================================= 503.bwaves_r 64 876 732 * 507.cactuBSSN_r 64 161 504 * 508.namd_r 64 279 218 * 510.parest_r 64 471 356 * 511.povray_r 64 463 323 * 519.lbm_r 64 393 172 * 521.wrf_r 64 395 363 * 526.blender_r 64 286 341 * 527.cam4_r 64 352 318 * 538.imagick_r 64 185 862 * 544.nab_r 64 275 392 * 549.fotonik3d_r 64 1037 240 * 554.roms_r 64 489 208 * SPECrate(R)2017_fp_base 347 SPECrate(R)2017_fp_peak Not Run HARDWARE -------- CPU Name: AMD EPYC 7F52 Max MHz: 3900 Nominal: 3500 Enabled: 32 cores, 2 chips, 2 threads/core Orderable: 2 chips Cache L1: 32 KB I + 32 KB D on chip per core L2: 512 KB I+D on chip per core L3: 256 MB I+D on chip per chip, 16 MB per core Other: None Memory: 2 TB (32 x 64 GB 2Rx4 PC4-3200V-L) Storage: 1 x PCIe SSD, 2TB Other: None SOFTWARE -------- OS: SUSE Linux Enterprise Server 15 SP2 (x86_64) kernel version 5.3.18-22-default Compiler: C/C++/Fortran: Version 2.0.0 of AOCC Parallel: No Firmware: Fujitsu BIOS Version 1.2.V1 Released Apr-2021 tested as Dec-2020 File System: xfs System State: Run level 3 (multi-user) Base Pointers: 64-bit Peak Pointers: Not Applicable Other: jemalloc: jemalloc memory allocator library v5.2.0 Power Management: BIOS set to prefer performance at the cost of additional power usage Compiler Notes -------------- The AMD64 AOCC Compiler Suite is available at http://developer.amd.com/amd-aocc/ Submit Notes ------------ The config file option 'submit' was used. 'numactl' was used to bind copies to the cores. See the configuration file for details. Operating System Notes ---------------------- 'ulimit -s unlimited' was used to set environment stack size 'ulimit -l 2097152' was used to set environment locked pages in memory limit runcpu command invoked through numactl i.e.: numactl --interleave=all runcpu Set dirty_ratio=8 to limit dirty cache to 8% of memory Set swappiness=1 to swap only if necessary Set zone_reclaim_mode=1 to free local node memory and avoid remote memory sync then drop_caches=3 to reset caches before invoking runcpu dirty_ratio, swappiness, zone_reclaim_mode and drop_caches were all set using privileged echo (e.g. echo 1 > /proc/sys/vm/swappiness). Transparent huge pages set to 'always' for this run (OS default) Environment Variables Notes --------------------------- Environment variables set by runcpu before the start of the run: LD_LIBRARY_PATH = "/home/Benchmark/speccpu/amd_rate_aocc200_rome_C_lib/64;/home/Benchmark/ speccpu/amd_rate_aocc200_rome_C_lib/32:" MALLOC_CONF = "retain:true" General Notes ------------- Binaries were compiled on a system with 2x AMD EPYC 7601 CPU + 512GB Memory using Fedora 26 NA: The test sponsor attests, as of date of publication, that CVE-2017-5754 (Meltdown) is mitigated in the system as tested and documented. Yes: The test sponsor attests, as of date of publication, that CVE-2017-5753 (Spectre variant 1) is mitigated in the system as tested and documented. Yes: The test sponsor attests, as of date of publication, that CVE-2017-5715 (Spectre variant 2) is mitigated in the system as tested and documented. jemalloc: configured and built with GCC v9.1.0 in Ubuntu 19.04 with -O3 -znver2 -flto jemalloc 5.2.0 is available here: https://github.com/jemalloc/jemalloc/releases/download/5.2.0/jemalloc-5.2.0.tar.bz2 Platform Notes -------------- BIOS configuration: cTDP = 240 Determinism Slider = Power Package Power Limit = 240 SVM Mode = Disabled NUMA Nodes Per Socket = NPS4 L1 Stream HW Prefetcher = Enabled L2 Stream HW Prefetcher = Enabled DRAM Scrub Time = Disabled Sysinfo program /home/Benchmark/speccpu/bin/sysinfo Rev: r6538 of 2020-09-24 e8664e66d2d7080afeaa89d4b38e2f1c running on localhost Thu Dec 24 02:14:24 2020 SUT (System Under Test) info as seen by some common utilities. For more information on this section, see https://www.spec.org/cpu2017/Docs/config.html#sysinfo From /proc/cpuinfo model name : AMD EPYC 7F52 16-Core Processor 2 "physical id"s (chips) 64 "processors" cores, siblings (Caution: counting these is hw and system dependent. The following excerpts from /proc/cpuinfo might not be reliable. Use with caution.) cpu cores : 16 siblings : 32 physical 0: cores 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 physical 1: cores 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 From lscpu: Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 43 bits physical, 48 bits virtual CPU(s): 64 On-line CPU(s) list: 0-63 Thread(s) per core: 2 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 8 Vendor ID: AuthenticAMD CPU family: 23 Model: 49 Model name: AMD EPYC 7F52 16-Core Processor Stepping: 0 CPU MHz: 1800.078 CPU max MHz: 3500.0000 CPU min MHz: 2500.0000 BogoMIPS: 7000.49 Virtualization: AMD-V L1d cache: 32K L1i cache: 32K L2 cache: 512K L3 cache: 16384K NUMA node0 CPU(s): 0-3,32-35 NUMA node1 CPU(s): 4-7,36-39 NUMA node2 CPU(s): 8-11,40-43 NUMA node3 CPU(s): 12-15,44-47 NUMA node4 CPU(s): 16-19,48-51 NUMA node5 CPU(s): 20-23,52-55 NUMA node6 CPU(s): 24-27,56-59 NUMA node7 CPU(s): 28-31,60-63 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca /proc/cpuinfo cache data cache size : 512 KB From numactl --hardware WARNING: a numactl 'node' might or might not correspond to a physical chip. available: 8 nodes (0-7) node 0 cpus: 0 1 2 3 32 33 34 35 node 0 size: 257777 MB node 0 free: 257542 MB node 1 cpus: 4 5 6 7 36 37 38 39 node 1 size: 258043 MB node 1 free: 257840 MB node 2 cpus: 8 9 10 11 40 41 42 43 node 2 size: 258043 MB node 2 free: 257836 MB node 3 cpus: 12 13 14 15 44 45 46 47 node 3 size: 257997 MB node 3 free: 257791 MB node 4 cpus: 16 17 18 19 48 49 50 51 node 4 size: 258043 MB node 4 free: 257833 MB node 5 cpus: 20 21 22 23 52 53 54 55 node 5 size: 258043 MB node 5 free: 257752 MB node 6 cpus: 24 25 26 27 56 57 58 59 node 6 size: 258043 MB node 6 free: 257743 MB node 7 cpus: 28 29 30 31 60 61 62 63 node 7 size: 257803 MB node 7 free: 257592 MB node distances: node 0 1 2 3 4 5 6 7 0: 10 12 12 12 32 32 32 32 1: 12 10 12 12 32 32 32 32 2: 12 12 10 12 32 32 32 32 3: 12 12 12 10 32 32 32 32 4: 32 32 32 32 10 12 12 12 5: 32 32 32 32 12 10 12 12 6: 32 32 32 32 12 12 10 12 7: 32 32 32 32 12 12 12 10 From /proc/meminfo MemTotal: 2113328652 kB HugePages_Total: 0 Hugepagesize: 2048 kB /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor has performance From /etc/*release* /etc/*version* os-release: NAME="SLES" VERSION="15-SP2" VERSION_ID="15.2" PRETTY_NAME="SUSE Linux Enterprise Server 15 SP2" ID="sles" ID_LIKE="suse" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:suse:sles:15:sp2" uname -a: Linux localhost 5.3.18-22-default #1 SMP Wed Jun 3 12:16:43 UTC 2020 (720aeba/lp-1a956f1) x86_64 x86_64 x86_64 GNU/Linux Kernel self-reported vulnerability status: CVE-2018-12207 (iTLB Multihit): Not affected CVE-2018-3620 (L1 Terminal Fault): Not affected Microarchitectural Data Sampling: Not affected CVE-2017-5754 (Meltdown): Not affected CVE-2018-3639 (Speculative Store Bypass): Mitigation: Speculative Store Bypass disabled via prctl and seccomp CVE-2017-5753 (Spectre variant 1): Mitigation: usercopy/swapgs barriers and __user pointer sanitization CVE-2017-5715 (Spectre variant 2): Mitigation: Full AMD retpoline, IBPB: conditional, IBRS_FW, STIBP: conditional, RSB filling CVE-2020-0543 (Special Register Buffer Data Sampling): Not affected CVE-2019-11135 (TSX Asynchronous Abort): Not affected run-level 3 Dec 23 02:56 SPEC is set to: /home/Benchmark/speccpu Filesystem Type Size Used Avail Use% Mounted on /dev/nvme0n1p3 xfs 1.3T 16G 1.3T 2% /home From /sys/devices/virtual/dmi/id Vendor: FUJITSU Product: S26361-K2634-V100 Serial: MACUxxxxxx Additional information from dmidecode follows. WARNING: Use caution when you interpret this section. The 'dmidecode' program reads system data which is "intended to allow hardware to be accurately determined", but the intent may not be met, as there are frequent changes to hardware, firmware, and the "DMTF SMBIOS" standard. Memory: 32x Samsung M393A8G40AB2-CWE 64 GB 2 rank 3200 BIOS: BIOS Vendor: American Megatrends Inc. BIOS Version: 1.2.V1 BIOS Date: 12/22/2020 BIOS Revision: 5.14 (End of data from sysinfo program) Compiler Version Notes ---------------------- ============================================================================== C | 519.lbm_r(base) 538.imagick_r(base) 544.nab_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ ============================================================================== C++ | 508.namd_r(base) 510.parest_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ ============================================================================== C++, C | 511.povray_r(base) 526.blender_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ ============================================================================== C++, C, Fortran | 507.cactuBSSN_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ ============================================================================== Fortran | 503.bwaves_r(base) 549.fotonik3d_r(base) 554.roms_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ ============================================================================== Fortran, C | 521.wrf_r(base) 527.cam4_r(base) ------------------------------------------------------------------------------ AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin AOCC.LLVM.2.0.0.B191.2019_07_19 clang version 8.0.0 (CLANG: Jenkins AOCC_2_0_0-Build#191) (based on LLVM AOCC.LLVM.2.0.0.B191.2019_07_19) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /sppo/dev/compilers/aocc-compiler-2.0.0/bin ------------------------------------------------------------------------------ Base Compiler Invocation ------------------------ C benchmarks: clang C++ benchmarks: clang++ Fortran benchmarks: flang Benchmarks using both Fortran and C: flang clang Benchmarks using both C and C++: clang++ clang Benchmarks using Fortran, C, and C++: clang++ clang flang Base Portability Flags ---------------------- 503.bwaves_r: -DSPEC_LP64 507.cactuBSSN_r: -DSPEC_LP64 508.namd_r: -DSPEC_LP64 510.parest_r: -DSPEC_LP64 511.povray_r: -DSPEC_LP64 519.lbm_r: -DSPEC_LP64 521.wrf_r: -DSPEC_CASE_FLAG -Mbyteswapio -DSPEC_LP64 526.blender_r: -funsigned-char -D__BOOL_DEFINED -DSPEC_LP64 527.cam4_r: -DSPEC_CASE_FLAG -DSPEC_LP64 538.imagick_r: -DSPEC_LP64 544.nab_r: -DSPEC_LP64 549.fotonik3d_r: -DSPEC_LP64 554.roms_r: -DSPEC_LP64 Base Optimization Flags ----------------------- C benchmarks: -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -O3 -ffast-math -march=znver2 -fstruct-layout=3 -mllvm -unroll-threshold=50 -fremap-arrays -mllvm -function-specialize -mllvm -enable-gvn-hoist -mllvm -reduce-array-computations=3 -mllvm -global-vectorize-slp -mllvm -vector-library=LIBMVEC -mllvm -inline-threshold=1000 -flv-function-specialization -z muldefs -lmvec -lamdlibm -ljemalloc -lflang C++ benchmarks: -std=c++98 -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -Wl,-mllvm -Wl,-suppress-fmas -O3 -ffast-math -march=znver2 -mllvm -loop-unswitch-threshold=200000 -mllvm -vector-library=LIBMVEC -mllvm -unroll-threshold=100 -flv-function-specialization -mllvm -enable-partial-unswitch -z muldefs -lmvec -lamdlibm -ljemalloc -lflang Fortran benchmarks: -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -O3 -march=znver2 -funroll-loops -Mrecursive -mllvm -vector-library=LIBMVEC -z muldefs -Kieee -fno-finite-math-only -lmvec -lamdlibm -ljemalloc -lflang Benchmarks using both Fortran and C: -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -O3 -ffast-math -march=znver2 -fstruct-layout=3 -mllvm -unroll-threshold=50 -fremap-arrays -mllvm -function-specialize -mllvm -enable-gvn-hoist -mllvm -reduce-array-computations=3 -mllvm -global-vectorize-slp -mllvm -vector-library=LIBMVEC -mllvm -inline-threshold=1000 -flv-function-specialization -funroll-loops -Mrecursive -z muldefs -Kieee -fno-finite-math-only -lmvec -lamdlibm -ljemalloc -lflang Benchmarks using both C and C++: -std=c++98 -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -Wl,-mllvm -Wl,-suppress-fmas -O3 -ffast-math -march=znver2 -fstruct-layout=3 -mllvm -unroll-threshold=50 -fremap-arrays -mllvm -function-specialize -mllvm -enable-gvn-hoist -mllvm -reduce-array-computations=3 -mllvm -global-vectorize-slp -mllvm -vector-library=LIBMVEC -mllvm -inline-threshold=1000 -flv-function-specialization -mllvm -loop-unswitch-threshold=200000 -mllvm -unroll-threshold=100 -mllvm -enable-partial-unswitch -z muldefs -lmvec -lamdlibm -ljemalloc -lflang Benchmarks using Fortran, C, and C++: -std=c++98 -flto -Wl,-mllvm -Wl,-function-specialize -Wl,-mllvm -Wl,-region-vectorize -Wl,-mllvm -Wl,-vector-library=LIBMVEC -Wl,-mllvm -Wl,-reduce-array-computations=3 -Wl,-mllvm -Wl,-suppress-fmas -O3 -ffast-math -march=znver2 -fstruct-layout=3 -mllvm -unroll-threshold=50 -fremap-arrays -mllvm -function-specialize -mllvm -enable-gvn-hoist -mllvm -reduce-array-computations=3 -mllvm -global-vectorize-slp -mllvm -vector-library=LIBMVEC -mllvm -inline-threshold=1000 -flv-function-specialization -mllvm -loop-unswitch-threshold=200000 -mllvm -unroll-threshold=100 -mllvm -enable-partial-unswitch -funroll-loops -Mrecursive -z muldefs -Kieee -fno-finite-math-only -lmvec -lamdlibm -ljemalloc -lflang The flags files that were used to format this result can be browsed at http://www.spec.org/cpu2017/flags/aocc200-flags-C4.html http://www.spec.org/cpu2017/flags/Fujitsu-Platform-Settings-V1.0-ROME-RevD.html You can also download the XML flags sources by saving the following links: http://www.spec.org/cpu2017/flags/aocc200-flags-C4.xml http://www.spec.org/cpu2017/flags/Fujitsu-Platform-Settings-V1.0-ROME-RevD.xml SPEC CPU and SPECrate are registered trademarks of the Standard Performance Evaluation Corporation. All other brand and product names appearing in this result are trademarks or registered trademarks of their respective holders. ---------------------------------------------------------------------------------------------------------------------------------- For questions about this result, please contact the tester. For other inquiries, please contact info@spec.org. Copyright 2017-2021 Standard Performance Evaluation Corporation Tested with SPEC CPU(R)2017 v1.1.5 on 2020-12-23 12:14:24-0500. Report generated on 2021-03-16 15:30:46 by CPU2017 text formatter v6255. Originally published on 2021-03-16.