SPEC(R) CPU2017 Floating Point Rate Result Supermicro A+ Server 1113S-WN10RT (H11SSW-NT , AMD EPYC 7301) CPU2017 License: 001176 Test date: Nov-2018 Test sponsor: Supermicro Hardware availability: Sep-2018 Tested by: Supermicro Software availability: Feb-2018 Base Base Base Peak Peak Peak Benchmarks Copies Run Time Rate Copies Run Time Rate --------------- ------- --------- --------- ------- --------- --------- 503.bwaves_r 32 1012 317 S 32 1012 317 S 503.bwaves_r 32 1014 317 * 32 1011 318 S 503.bwaves_r 32 1015 316 S 32 1012 317 * 507.cactuBSSN_r 32 475 85.3 S 32 475 85.3 S 507.cactuBSSN_r 32 477 84.9 * 32 477 84.9 * 507.cactuBSSN_r 32 485 83.6 S 32 485 83.6 S 508.namd_r 32 473 64.3 S 32 428 71.0 S 508.namd_r 32 474 64.1 S 32 428 71.0 * 508.namd_r 32 473 64.3 * 32 429 70.9 S 510.parest_r 32 1070 78.3 S 32 1070 78.3 S 510.parest_r 32 1069 78.3 * 32 1069 78.3 * 510.parest_r 32 1069 78.3 S 32 1069 78.3 S 511.povray_r 32 928 80.6 S 32 891 83.8 * 511.povray_r 32 929 80.4 * 32 891 83.9 S 511.povray_r 32 929 80.4 S 32 892 83.8 S 519.lbm_r 32 536 62.9 * 32 477 70.8 S 519.lbm_r 32 527 63.9 S 32 462 73.0 S 519.lbm_r 32 540 62.5 S 32 471 71.7 * 521.wrf_r 32 733 97.8 S 32 733 97.8 S 521.wrf_r 32 739 97.0 * 32 739 97.0 * 521.wrf_r 32 770 93.0 S 32 770 93.0 S 526.blender_r 32 532 91.6 S 32 532 91.6 S 526.blender_r 32 533 91.4 * 32 533 91.4 * 526.blender_r 32 533 91.4 S 32 533 91.4 S 527.cam4_r 32 679 82.5 * 32 679 82.5 * 527.cam4_r 32 676 82.8 S 32 676 82.8 S 527.cam4_r 32 690 81.1 S 32 690 81.1 S 538.imagick_r 32 686 116 S 32 674 118 * 538.imagick_r 32 680 117 S 32 675 118 S 538.imagick_r 32 682 117 * 32 674 118 S 544.nab_r 32 545 98.7 S 32 545 98.7 S 544.nab_r 32 546 98.7 * 32 546 98.7 * 544.nab_r 32 609 88.4 S 32 609 88.4 S 549.fotonik3d_r 32 1400 89.1 S 32 1397 89.3 S 549.fotonik3d_r 32 1396 89.3 S 32 1372 90.9 S 549.fotonik3d_r 32 1397 89.3 * 32 1396 89.3 * 554.roms_r 32 939 54.2 * 32 934 54.4 S 554.roms_r 32 926 54.9 S 32 937 54.3 * 554.roms_r 32 939 54.1 S 32 937 54.2 S ================================================================================= 503.bwaves_r 32 1014 317 * 32 1012 317 * 507.cactuBSSN_r 32 477 84.9 * 32 477 84.9 * 508.namd_r 32 473 64.3 * 32 428 71.0 * 510.parest_r 32 1069 78.3 * 32 1069 78.3 * 511.povray_r 32 929 80.4 * 32 891 83.8 * 519.lbm_r 32 536 62.9 * 32 471 71.7 * 521.wrf_r 32 739 97.0 * 32 739 97.0 * 526.blender_r 32 533 91.4 * 32 533 91.4 * 527.cam4_r 32 679 82.5 * 32 679 82.5 * 538.imagick_r 32 682 117 * 32 674 118 * 544.nab_r 32 546 98.7 * 32 546 98.7 * 549.fotonik3d_r 32 1397 89.3 * 32 1396 89.3 * 554.roms_r 32 939 54.2 * 32 937 54.3 * SPECrate2017_fp_base 90.6 SPECrate2017_fp_peak 92.7 HARDWARE -------- CPU Name: AMD EPYC 7301 Max MHz.: 2700 Nominal: 2200 Enabled: 16 cores, 1 chip, 2 threads/core Orderable: 1 chip Cache L1: 64 KB I + 32 KB D on chip per core L2: 512 KB I+D on chip per core L3: 64 MB I+D on chip per chip, 8 MB shared / 2 cores Other: None Memory: 512 GB (8 x 64 GB 4Rx4 PC4-2666V-L) Storage: 1 x 200 GB SATAIII SSD Other: None SOFTWARE -------- OS: SUSE Linux Enterprise Server 12 SP3 (x86_64) kernel 4.4.114-94.11-default Compiler: C/C++: Version 1.0.0 of AOCC Fortran: Version 4.8.2 of GCC Parallel: No Firmware: Supermicro BIOS version 1.0 released Sep-2018 File System: xfs System State: Run level 3 (multi-user) Base Pointers: 64-bit Peak Pointers: 64-bit Other: jemalloc general purpose malloc implementation V4.5.0 Compiler Notes -------------- The AMD64 AOCC Compiler Suite is available at http://developer.amd.com/amd-aocc/ The AOCC Gold Linker plugin was installed and used for the link stage. The AOCC Fortran Plugin version 1.0 was used to leverage AOCC optimizers with gfortran. It is available here: 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 runspec command invoked through numactl i.e.: numactl --interleave=all runspec 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 were enabled for this run (OS default) General Notes ------------- Environment variables set by runcpu before the start of the run: LD_LIBRARY_PATH = "/home/cpu2017/amd1704-rate-libs-revD/64;/home/cpu2017/amd1704-rate-libs-revD/32:" MALLOC_CONF = "lg_chunk:28" Binaries were compiled on a system with 2x AMD EPYC 7601 CPU + 512GB Memory using RHEL 7.4 jemalloc, a general purpose malloc implementation, was obtained at https://github.com/jemalloc/jemalloc/releases/download/4.5.0/jemalloc-4.5.0.tar.bz2 jemalloc was built with GCC v4.8.5 in RHEL v7.2 under default conditions. jemalloc uses environment variable MALLOC_CONF with values narenas and lg_chunk: narenas: sets the maximum number of arenas to use for automatic multiplexing of threads and arenas. lg_chunk: set the virtual memory chunk size (log base 2). For example, lg_chunk:21 sets the default chunk size to 2^21 = 2MiB. 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. Platform Notes -------------- BIOS Settings: Determinism Slider = Power Sysinfo program /home/cpu2017/bin/sysinfo Rev: r5974 of 2018-05-19 9bcde8f2999c33d61f64985e45859ea9 running on linux-pm02 Thu Nov 8 01:18:48 2018 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 7301 16-Core Processor 1 "physical id"s (chips) 32 "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 1 4 5 8 9 12 13 16 17 20 21 24 25 28 29 From lscpu: Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 32 On-line CPU(s) list: 0-31 Thread(s) per core: 2 Core(s) per socket: 16 Socket(s): 1 NUMA node(s): 4 Vendor ID: AuthenticAMD CPU family: 23 Model: 1 Model name: AMD EPYC 7301 16-Core Processor Stepping: 2 CPU MHz: 2200.000 CPU max MHz: 2200.0000 CPU min MHz: 1200.0000 BogoMIPS: 4399.75 Virtualization: AMD-V L1d cache: 32K L1i cache: 64K L2 cache: 512K L3 cache: 8192K NUMA node0 CPU(s): 0-3,16-19 NUMA node1 CPU(s): 4-7,20-23 NUMA node2 CPU(s): 8-11,24-27 NUMA node3 CPU(s): 12-15,28-31 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 extd_apicid amd_dcm aperfmperf eagerfpu 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 skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_l2 mwaitx arat cpb hw_pstate retpoline retpoline_amd npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold vmmcall avic fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf ibpb 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: 4 nodes (0-3) node 0 cpus: 0 1 2 3 16 17 18 19 node 0 size: 128826 MB node 0 free: 128662 MB node 1 cpus: 4 5 6 7 20 21 22 23 node 1 size: 129022 MB node 1 free: 128869 MB node 2 cpus: 8 9 10 11 24 25 26 27 node 2 size: 129022 MB node 2 free: 128874 MB node 3 cpus: 12 13 14 15 28 29 30 31 node 3 size: 129021 MB node 3 free: 128877 MB node distances: node 0 1 2 3 0: 10 16 16 16 1: 16 10 16 16 2: 16 16 10 16 3: 16 16 16 10 From /proc/meminfo MemTotal: 528274456 kB HugePages_Total: 0 Hugepagesize: 2048 kB From /etc/*release* /etc/*version* SuSE-release: SUSE Linux Enterprise Server 12 (x86_64) VERSION = 12 PATCHLEVEL = 3 # This file is deprecated and will be removed in a future service pack or release. # Please check /etc/os-release for details about this release. os-release: NAME="SLES" VERSION="12-SP3" VERSION_ID="12.3" PRETTY_NAME="SUSE Linux Enterprise Server 12 SP3" ID="sles" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:suse:sles:12:sp3" uname -a: Linux linux-pm02 4.4.114-94.11-default #1 SMP Thu Feb 1 19:28:26 UTC 2018 (4309ff9) x86_64 x86_64 x86_64 GNU/Linux Kernel self-reported vulnerability status: CVE-2017-5754 (Meltdown): Not affected CVE-2017-5753 (Spectre variant 1): Mitigation: Barriers CVE-2017-5715 (Spectre variant 2): Mitigation: Full AMD retpoline + IBPB run-level 3 Nov 7 14:03 SPEC is set to: /home/cpu2017 Filesystem Type Size Used Avail Use% Mounted on /dev/sda4 xfs 145G 5.7G 139G 4% /home 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. BIOS American Megatrends Inc. 1.0 09/04/2018 Memory: 8x NO DIMM NO DIMM 8x Samsung M386A8K40BM2-CTD 64 GB 4 rank 2667 (End of data from sysinfo program) Compiler Version Notes ---------------------- ============================================================================== CC 519.lbm_r(base, peak) 538.imagick_r(base, peak) 544.nab_r(base, peak) ------------------------------------------------------------------------------ AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin ------------------------------------------------------------------------------ ============================================================================== CXXC 508.namd_r(base, peak) 510.parest_r(base, peak) ------------------------------------------------------------------------------ AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin ------------------------------------------------------------------------------ ============================================================================== CC 511.povray_r(base, peak) 526.blender_r(base, peak) ------------------------------------------------------------------------------ AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin ------------------------------------------------------------------------------ ============================================================================== FC 507.cactuBSSN_r(base, peak) ------------------------------------------------------------------------------ AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin GNU Fortran (GCC) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. GNU Fortran comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Fortran under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING ------------------------------------------------------------------------------ ============================================================================== FC 503.bwaves_r(base, peak) 549.fotonik3d_r(base, peak) 554.roms_r(base, peak) ------------------------------------------------------------------------------ GNU Fortran (GCC) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. GNU Fortran comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Fortran under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING ------------------------------------------------------------------------------ ============================================================================== CC 521.wrf_r(base, peak) 527.cam4_r(base, peak) ------------------------------------------------------------------------------ GNU Fortran (GCC) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. GNU Fortran comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Fortran under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING AOCC.LLVM.4.0.0.B35.2017_04_26 clang version 4.0.0 (CLANG:) (based on LLVM AOCC.LLVM.4.0.0.B35.2017_04_26) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /root/work/compilers/AOCC-1.0-Compiler/bin ------------------------------------------------------------------------------ Base Compiler Invocation ------------------------ C benchmarks: clang C++ benchmarks: clang++ Fortran benchmarks: clang gfortran Benchmarks using both Fortran and C: clang gfortran Benchmarks using both C and C++: clang++ clang Benchmarks using Fortran, C, and C++: clang++ clang gfortran 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 -fconvert=big-endian -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,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -ffast-math -march=znver1 -fstruct-layout=2 -mllvm -unroll-threshold=100 -fremap-arrays -mno-avx2 -mllvm -inline-threshold=1000 -mllvm -disable-vect-cmp -z muldefs -ljemalloc C++ benchmarks: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -march=znver1 -mllvm -unroll-threshold=100 -finline-aggressive -fremap-arrays -mllvm -inline-threshold=1000 -mllvm -disable-vect-cmp -z muldefs -ljemalloc Fortran benchmarks: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -mavx -madx -funroll-loops -ffast-math -z muldefs -fplugin=dragonegg.so -fplugin-arg-dragonegg-llvm-option=-merge-constant -fplugin-arg-dragonegg-llvm-option=-disable-vect-cmp -ljemalloc -lgfortran -lamdlibm Benchmarks using both Fortran and C: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -ffast-math -march=znver1 -fstruct-layout=2 -mllvm -unroll-threshold=100 -fremap-arrays -mno-avx2 -mllvm -inline-threshold=1000 -mllvm -disable-vect-cmp -mavx -madx -funroll-loops -z muldefs -fplugin=dragonegg.so -fplugin-arg-dragonegg-llvm-option=-merge-constant -fplugin-arg-dragonegg-llvm-option=-disable-vect-cmp -ljemalloc -lgfortran -lamdlibm Benchmarks using both C and C++: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -ffast-math -march=znver1 -fstruct-layout=2 -mllvm -unroll-threshold=100 -fremap-arrays -mno-avx2 -mllvm -inline-threshold=1000 -mllvm -disable-vect-cmp -finline-aggressive -z muldefs -ljemalloc Benchmarks using Fortran, C, and C++: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Wl,-plugin-opt=-disable-vect-cmp -O3 -ffast-math -march=znver1 -fstruct-layout=2 -mllvm -unroll-threshold=100 -fremap-arrays -mno-avx2 -mllvm -inline-threshold=1000 -mllvm -disable-vect-cmp -finline-aggressive -mavx -madx -funroll-loops -z muldefs -fplugin=dragonegg.so -fplugin-arg-dragonegg-llvm-option=-merge-constant -fplugin-arg-dragonegg-llvm-option=-disable-vect-cmp -ljemalloc Peak Compiler Invocation ------------------------ C benchmarks: clang C++ benchmarks: clang++ Fortran benchmarks: clang gfortran Benchmarks using both Fortran and C: clang gfortran Benchmarks using both C and C++: clang++ clang Benchmarks using Fortran, C, and C++: clang++ clang gfortran Peak Portability Flags ---------------------- Same as Base Portability Flags Peak Optimization Flags ----------------------- C benchmarks: 519.lbm_r: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Ofast -march=znver1 -fstruct-layout=3 -mllvm -vectorize-memory-aggressively -mno-avx2 -mllvm -unroll-threshold=100 -fremap-arrays -mllvm -inline-threshold=1000 -ljemalloc 538.imagick_r: Same as 519.lbm_r 544.nab_r: basepeak = yes C++ benchmarks: 508.namd_r: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Ofast -march=znver1 -finline-aggressive -mllvm -unroll-threshold=100 -fremap-arrays -mllvm -inline-threshold=1000 -ljemalloc 510.parest_r: basepeak = yes Fortran benchmarks: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -O3 -mavx2 -madx -funroll-loops -ffast-math -fplugin=dragonegg.so -fplugin-arg-dragonegg-llvm-option=-merge-constant -fplugin-arg-dragonegg-llvm-option=-inline-threshold:1000 -ljemalloc -lgfortran -lamdlibm Benchmarks using both Fortran and C: 521.wrf_r: basepeak = yes 527.cam4_r: basepeak = yes Benchmarks using both C and C++: 511.povray_r: -flto -Wl,-plugin-opt=-merge-constant -Wl,-plugin-opt=-lsr-in-nested-loop -Ofast -march=znver1 -fstruct-layout=3 -mllvm -vectorize-memory-aggressively -mno-avx2 -mllvm -unroll-threshold=100 -fremap-arrays -mllvm -inline-threshold=1000 -finline-aggressive -ljemalloc 526.blender_r: basepeak = yes Benchmarks using Fortran, C, and C++: 507.cactuBSSN_r: basepeak = yes The flags files that were used to format this result can be browsed at http://www.spec.org/cpu2017/flags/aocc100-flags-revC-I.2018-11-13.html http://www.spec.org/cpu2017/flags/gcc.2018-02-16.html http://www.spec.org/cpu2017/flags/Supermicro-Platform-Settings-V1.2-Naples-revD.html You can also download the XML flags sources by saving the following links: http://www.spec.org/cpu2017/flags/aocc100-flags-revC-I.2018-11-13.xml http://www.spec.org/cpu2017/flags/gcc.2018-02-16.xml http://www.spec.org/cpu2017/flags/Supermicro-Platform-Settings-V1.2-Naples-revD.xml SPEC is a registered trademark 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-2018 Standard Performance Evaluation Corporation Tested with SPEC CPU2017 v1.0.5 on 2018-11-07 12:18:47-0500. Report generated on 2018-11-27 13:31:02 by CPU2017 ASCII formatter v6067. Originally published on 2018-11-27.