From a9350da4b8a8ebf4310691b326eb44fc04966c8e Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Mon, 7 Oct 2024 09:23:28 +0200 Subject: [PATCH] Add SPEC CPU 2017 benchmarks --- overlay.nix | 4 + pkgs/spec-cpu/Makefile | 66 ++++++ pkgs/spec-cpu/Makefile.in | 80 +++++++ pkgs/spec-cpu/default.nix | 59 +++++ pkgs/spec-cpu/gcc-linux-x86.cfg | 391 ++++++++++++++++++++++++++++++++ pkgs/spec-cpu/tools.nix | 106 +++++++++ 6 files changed, 706 insertions(+) create mode 100644 pkgs/spec-cpu/Makefile create mode 100644 pkgs/spec-cpu/Makefile.in create mode 100644 pkgs/spec-cpu/default.nix create mode 100644 pkgs/spec-cpu/gcc-linux-x86.cfg create mode 100644 pkgs/spec-cpu/tools.nix diff --git a/overlay.nix b/overlay.nix index 8527ad1..5164c54 100644 --- a/overlay.nix +++ b/overlay.nix @@ -11,6 +11,10 @@ final: prev: rvb-clang = final.callPackage ./pkgs/rvb/default.nix { stdenv = final.stdenvClangEpi; }; stream = final.callPackage ./pkgs/stream/default.nix { }; + spec-cpu-tools = final.callPackage ./pkgs/spec-cpu/tools.nix { }; + spec-cpu = final.callPackage ./pkgs/spec-cpu/default.nix { }; + spec-cpu-clang = final.callPackage ./pkgs/spec-cpu/default.nix { stdenv = final.stdenvClangEpi; }; + blis = ((prev.blis.override { blas64 = true; withArchitecture = "generic"; diff --git a/pkgs/spec-cpu/Makefile b/pkgs/spec-cpu/Makefile new file mode 100644 index 0000000..5d6519e --- /dev/null +++ b/pkgs/spec-cpu/Makefile @@ -0,0 +1,66 @@ +include Makefile.in + +HPC_BENCHMARKS_DIRS=\ + axpy \ + jacobi-2d \ + somier \ +# Require submodules: +# fft \ +# fftp \ +# Require vehave: +# lulesh \ +# Missing compare_array_double: +# gemm \ +# Broken, not found: +# spmv + +DESKTOP_BENCHMARKS_DIRS=\ + blackscholes \ + canneal \ + particlefilter \ + pathfinder \ + streamcluster \ + swaptions + +MICRO_BENCHMARKS_DIRS=\ + BuffCopyUnit \ + BuffCopyStrided \ + BuffCopyIndexed \ + FpuMicroKernel \ + InstrNopBalance \ + MemArithBalance \ + LatencyVrgather + +.PHONY: default all clean $(HPC_BENCHMARKS_DIRS) $(MICRO_BENCHMARKS_DIRS) + +default: + @cd common; make; cd .. + @$(foreach dir,$(HPC_BENCHMARKS_DIRS),${MAKE} -C hpc_benchmarks/$(dir);) + @$(foreach dir,$(DESKTOP_BENCHMARKS_DIRS),${MAKE} -C desktop_benchmarks/$(dir);) + @$(foreach dir,$(MICRO_BENCHMARKS_DIRS),${MAKE} -C micro_benchmarks/$(dir);) + +all: + @cd common; make all; cd .. + @$(foreach dir,$(HPC_BENCHMARKS_DIRS),${MAKE} -C hpc_benchmarks/$(dir) all ;) + @$(foreach dir,$(DESKTOP_BENCHMARKS_DIRS),${MAKE} -C desktop_benchmarks/$(dir) all ;) + @$(foreach dir,$(MICRO_BENCHMARKS_DIRS),${MAKE} -C micro_benchmarks/$(dir) all ;) + +fftp: + ${MAKE} -C third_party fftw + ${MAKE} -C hpc_benchmarks/fftp all + ${MAKE} -C hpc_benchmarks/fftp/test all + +spmv-ellpack: + rm -rf hpc_benchmarks/spmv-ellpack/spmv/build + mkdir -p hpc_benchmarks/spmv-ellpack/spmv/build + cd hpc_benchmarks/spmv-ellpack/spmv/build;\ + ../configure riscv;\ + INDEX64=1 EPI_EXT=07 PATH=${EPI_LLVM_HOME}/bin:${PATH} make + +clean: + @cd common; make clean; cd .. + @$(foreach dir,$(HPC_BENCHMARKS_DIRS),${MAKE} -C hpc_benchmarks/$(dir) clean ;) + @$(foreach dir,$(DESKTOP_BENCHMARKS_DIRS),${MAKE} -C desktop_benchmarks/$(dir) clean ;) + @$(foreach dir,$(MICRO_BENCHMARKS_DIRS),${MAKE} -C micro_benchmarks/$(dir) clean ;) + @rm -rf hpc_benchmarks/spmv-ellpack/spmv/build + diff --git a/pkgs/spec-cpu/Makefile.in b/pkgs/spec-cpu/Makefile.in new file mode 100644 index 0000000..b828f6e --- /dev/null +++ b/pkgs/spec-cpu/Makefile.in @@ -0,0 +1,80 @@ +#Compile all benchmarks with individual settings defined in their Makefiles + +_default-target: default + +# RVB_ROOT defined as argument + +# TODO: RVB_COMMON_DIR should substitute COMMON_DIR +COMMON_DIR=$(RVB_ROOT)/common +RVB_COMMON_DIR=$(RVB_ROOT)/common + +CC=clang +CXX=clang++ + +# Needs EPI clang +#MEPI=-mepi +MEPI= + +VREPORT_FLAGS=-Rpass=loop-vectorize -Rpass-missed=loop-vectorize -Rpass-analysis=loop-vectorize +#Available CFLAGS conditional compilation: +# -DUSE_MALLOC_HP, redefines the use of malloc and free + +#Makefile: General compiler flags: CFLAGS, CFLAGS_, CFLAGS_, ... +#CFLAGS=-B ${LLVM_BIN} -Wall -Wextra -march=rv64g -O2 -I${RVB_COMMON_DIR} +CFLAGS=-B ${LLVM_BIN} -Wall -Wextra -O2 -I${RVB_COMMON_DIR} +LDFLAGS= + +#Only scalar instructions +CFLAGS_SCALAR=${CFLAGS} -DRVB_USE_SCALAR +LDFLAGS_SCALAR= + +#Vector instructions using intrinsics +CFLAGS_VECTORIAL=${CFLAGS} -fno-vectorize $(MEPI) +LDFLAGS_VECTORIAL= + +# TODO: RVV should substitute VECTORIAL (?) +#Vector instructions using intrinsics +CFLAGS_RVV=${CFLAGS} -DRVB_USE_RVV -fno-vectorize $(MEPI) +LDFLAGS_RVV=${LDFLAGS} + +#Vector instructions only when code is annotate +CFLAGS_EXPLICIT_AUTOVECTORIZATION=${CFLAGS} -fopenmp-simd -fno-vectorize $(MEPI) ${VREPORT_FLAGS} +LDFLAGS_EXPLICIT_AUTOVECTORIZATION= + +# TODO: OMP substitutes EXPLICIT_AUTOVECTORIZATION +#Vector instructions only when code is annotate +CFLAGS_OMP=${CFLAGS} -DRVB_USE_OMP -fopenmp-simd -fno-vectorize $(MEPI) ${VREPORT_FLAGS} +LDFLAGS_OMP=${LDFLAGS} + +#Vector instructions when compiler decides +CFLAGS_AUTOVECTORIZATION=${CFLAGS} -fopenmp-simd $(MEPI) ${VREPORT_FLAGS} +LDFLAGS_AUTOVECTORIZATION= + +# TODO: AUTOVECT shoud substitue AUTOVECTORIZATION (?) +#Vector instructions when compiler decides +CFLAGS_AUTOVECT=${CFLAGS} -DRVB_USE_AUTOVECT -fopenmp-simd $(MEPI) ${VREPORT_FLAGS} +LDFLAGS_AUTOVECT=${LDFLAGS} + +# CBLAS library compile and link flags +CFLAGS_CBLAS=${CFLAGS} -DRVB_USE_CBLAS -I${CBLAS_INC} -I${LLVM_INC} +LDFLAGS_CBLAS=${LDFLAGS} -L${CBLAS_LIB} -lblis -Wl,-rpath,${CBLAS_LIB} -fopenmp + +# BARE-METAL compile and link flags +# You may consider to disable OpenPiton Stream: -DDISABLE_OPSTREAM +CFLAGS_BMETAL=${CFLAGS} -DRVB_USE_BMETAL -B ${RVB_BMETAL_DIR} \ + --target=riscv64-unknown-elf \ + -I../ \ + -I/apps/riscv/llvm/EPI-0.7/cross/development/riscv64-unknown-linux-gnu/sysroot/usr/include \ + -I/usr/include/riscv64-linux-gnu \ + -I/usr/include \ + -I${RVB_BMETAL_DIR}/env \ + -I${RVB_BMETAL_DIR} \ + -DPREALLOCATE=1 -mcmodel=medany \ + -static -std=gnu99 \ + -ffast-math \ + -fno-common \ + -fno-builtin-printf \ + ${RVB_BMETAL_DIR}/syscalls.c \ + ${RVB_BMETAL_DIR}/crt.S \ + -static -nostdlib -T \ + ${RVB_BMETAL_DIR}/test.ld diff --git a/pkgs/spec-cpu/default.nix b/pkgs/spec-cpu/default.nix new file mode 100644 index 0000000..ef8df43 --- /dev/null +++ b/pkgs/spec-cpu/default.nix @@ -0,0 +1,59 @@ +{ + stdenv +, spec-cpu-tools +, libarchive +, xz +, gnutar +, gfortran +, coreutils +, requireFile +, autoPatchelfHook +, libxcrypt-legacy +, lib +}: + +stdenv.mkDerivation rec { + pname = "spec-cpu"; + version = "1.1.7"; + src = null; + unpackPhase = "true"; + # We need a working specxz binary + config = ./gcc-linux-x86.cfg; + buildPhase = '' + cp ${config} config.cfg + chmod +w config.cfg + export SPEC_NOCHECK=1 + mkdir out + runcpu \ + --verbose=80 \ + --tune=base \ + --output_root=$PWD/out \ + --config=$PWD/config.cfg \ + --define build_ncpus=$NIX_BUILD_CORES \ + --action=runsetup \ + all + ''; + # 519.lbm_r + # 502.gcc_r + # all + + # We only need the run directories + installPhase = '' + # Remove build/ and exe/ directories, we only need run/ + rm -rf out/benchspec/CPU/*/build/ + rm -rf out/benchspec/CPU/*/exe/ + + mkdir -p $out + cp -a out/benchspec $out + ''; + + #buildInputs = [ ]; + nativeBuildInputs = [ spec-cpu-tools gfortran ]; + enableParallelBuilding = false; + hardeningDisable = [ "all" ]; + dontStrip = true; + + meta.broken = (stdenv.buildPlatform.config != "x86_64-unknown-linux-gnu") || + (stdenv.hostPlatform.config != "riscv64-unknown-linux-gnu") || + (stdenv.targetPlatform.config != "riscv64-unknown-linux-gnu"); +} diff --git a/pkgs/spec-cpu/gcc-linux-x86.cfg b/pkgs/spec-cpu/gcc-linux-x86.cfg new file mode 100644 index 0000000..7a02182 --- /dev/null +++ b/pkgs/spec-cpu/gcc-linux-x86.cfg @@ -0,0 +1,391 @@ +#------------------------------------------------------------------------------ +# SPEC CPU(R) 2017 config for gcc/g++/gfortran on Linux x86 +#------------------------------------------------------------------------------ +# +# Usage: (1) Copy this to a new name +# cd $SPEC/config +# cp Example-x.cfg myname.cfg +# (2) Change items that are marked 'EDIT' (search for it) +# +# SPEC tested this config file with: +# Compiler version(s): Various. See note "Older GCC" below. +# Operating system(s): Oracle Linux Server 6, 7, 8 / +# Red Hat Enterprise Linux Server 6, 7, 8 +# SUSE Linux Enterprise Server 15 +# Ubuntu 19.04 +# Hardware: Xeon, EPYC +# +# If your system differs, this config file might not work. +# You might find a better config file at https://www.spec.org/cpu2017/results +# +# Note: Older GCC +# +# Please use the newest GCC that you can. The default version packaged with +# your operating system may be very old; look for alternate packages with a +# newer version. +# +# If you have no choice and must use an old version, here is what to expect: +# +# - "peak" tuning: Several benchmarks will fail at peak tuning if you use +# compilers older than GCC 7. +# In that case, please use base only. +# See: https://www.spec.org/cpu2017/Docs/overview.html#Q16 +# https://www.spec.org/cpu2017/Docs/config.html#tune +# Peak tuning is expected to work for all or nearly all +# benchmarks as of GCC 7 or later. +# Exception: +# - See topic "628.pop2_s basepeak", below. +# +# - "base" tuning: This config file is expected to work for base tuning with +# GCC 4.8.5 or later +# Exception: +# - Compilers vintage about 4.9 may need to turn off the +# tree vectorizer, by adding to the base OPTIMIZE flags: +# -fno-tree-loop-vectorize +# +# Unexpected errors? Try reducing the optimization level, or try removing: +# -march=native +# +# Compiler issues: Contact your compiler vendor, not SPEC. +# For SPEC help: https://www.spec.org/cpu2017/Docs/techsupport.html +#------------------------------------------------------------------------------ + + +#--------- Label -------------------------------------------------------------- +# Arbitrary string to tag binaries (no spaces allowed) +# Two Suggestions: # (1) EDIT this label as you try new ideas. +%ifndef %{label} +% define label "nix" # (2) Use a label meaningful to *you*. +%endif + + +#--------- Preprocessor ------------------------------------------------------- +%ifndef %{bits} # EDIT to control 32 or 64 bit compilation. Or, +% define bits 64 # you can set it on the command line using: +%endif # 'runcpu --define bits=nn' + +%ifndef %{build_ncpus} # EDIT to adjust number of simultaneous compiles. +% define build_ncpus 8 # Or, you can set it on the command line: +%endif # 'runcpu --define build_ncpus=nn' + +# Don't change this part. +%if %{bits} == 64 +% define model -m64 +%elif %{bits} == 32 +% define model -m32 +%else +% error Please define number of bits - see instructions in config file +%endif +%if %{label} =~ m/ / +% error Your label "%{label}" contains spaces. Please try underscores instead. +%endif +%if %{label} !~ m/^[a-zA-Z0-9._-]+$/ +% error Illegal character in label "%{label}". Please use only alphanumerics, underscore, hyphen, and period. +%endif + + +#--------- Global Settings ---------------------------------------------------- +# For info, see: +# https://www.spec.org/cpu2017/Docs/config.html#fieldname +# Example: https://www.spec.org/cpu2017/Docs/config.html#tune + +command_add_redirect = 1 +flagsurl = $[top]/config/flags/gcc.xml +ignore_errors = 1 +iterations = 1 +label = %{label}-m%{bits} +line_width = 1020 +log_line_width = 1020 +makeflags = --jobs=%{build_ncpus} +mean_anyway = 1 +output_format = txt,html,cfg,pdf,csv +preenv = 1 +reportable = 0 +tune = base,peak # EDIT if needed: set to "base" for old GCC. + # See note "Older GCC" above. + + +#--------- How Many CPUs? ----------------------------------------------------- +# Both SPECrate and SPECspeed can test multiple chips / cores / hw threads +# - For SPECrate, you set the number of copies. +# - For SPECspeed, you set the number of threads. +# See: https://www.spec.org/cpu2017/Docs/system-requirements.html#MultipleCPUs +# +# q. How many should I set? +# a. Unknown, you will have to try it and see! +# +# To get you started, some suggestions: +# +# copies - This config file defaults to testing only 1 copy. You might +# try changing it to match the number of cores on your system, +# or perhaps the number of virtual CPUs as reported by: +# grep -c processor /proc/cpuinfo +# Be sure you have enough memory. See: +# https://www.spec.org/cpu2017/Docs/system-requirements.html#memory +# +# threads - This config file sets a starting point. You could try raising +# it. A higher thread count is much more likely to be useful for +# fpspeed than for intspeed. +# +intrate,fprate: + copies = 1 # EDIT to change number of copies (see above) +intspeed,fpspeed: + threads = 4 # EDIT to change number of OpenMP threads (see above) + + +#------- Compilers ------------------------------------------------------------ +default: +# EDIT: The parent directory for your compiler. +# Do not include the trailing /bin/ +# Do not include a trailing slash +# Examples: +# 1 On a Red Hat system, you said: +# 'yum install devtoolset-9' +# Use: % define gcc_dir "/opt/rh/devtoolset-9/root/usr" +# +# 2 You built GCC in: /disk1/mybuild/gcc-10.1.0/bin/gcc +# Use: % define gcc_dir "/disk1/mybuild/gcc-10.1.0" +# +# 3 You want: /usr/bin/gcc +# Use: % define gcc_dir "/usr" +# WARNING: See section "Older GCC" above. +# +#%ifndef %{gcc_dir} +#% define gcc_dir "@GCC_DIR@" # EDIT (see above) +#%endif + +# EDIT: If your compiler version is 10 or greater, you must enable the next +# line to avoid compile errors for several FP benchmarks +# +%define GCCge10 # EDIT: remove the '#' from column 1 if using GCC 10 or later + +# EDIT if needed: the preENV line adds library directories to the runtime +# path. You can adjust it, or add lines for other environment variables. +# See: https://www.spec.org/cpu2017/Docs/config.html#preenv +# and: https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html + #preENV_LD_LIBRARY_PATH = %{gcc_dir}/lib64/:%{gcc_dir}/lib/:/lib64 + #preENV_LD_LIBRARY_PATH = %{gcc_dir}/lib64/:%{gcc_dir}/lib/:/lib64:%{ENV_LD_LIBRARY_PATH} + #SPECLANG = %{gcc_dir}/bin/ + CC = %{ENV_CC} -std=c99 + CXX = %{ENV_CXX} -std=c++03 + FC = %{ENV_FC} + # How to say "Show me your version, please" + CC_VERSION_OPTION = --version + CXX_VERSION_OPTION = --version + FC_VERSION_OPTION = --version + +default: +%if %{bits} == 64 + sw_base_ptrsize = 64-bit + sw_peak_ptrsize = 64-bit +%else + sw_base_ptrsize = 32-bit + sw_peak_ptrsize = 32-bit +%endif + + +#--------- Portability -------------------------------------------------------- +default: # data model applies to all benchmarks +%if %{bits} == 32 + # Strongly recommended because at run-time, operations using modern file + # systems may fail spectacularly and frequently (or, worse, quietly and + # randomly) if a program does not accommodate 64-bit metadata. + EXTRA_PORTABILITY = -D_FILE_OFFSET_BITS=64 +%else + EXTRA_PORTABILITY = -DSPEC_LP64 +%endif + +# Benchmark-specific portability (ordered by last 2 digits of bmark number) + +500.perlbench_r,600.perlbench_s: #lang='C' +%if %{bits} == 32 +% define suffix IA32 +%else +% define suffix X64 +%endif + PORTABILITY = -DSPEC_LINUX_%{suffix} + +521.wrf_r,621.wrf_s: #lang='F,C' + CPORTABILITY = -DSPEC_CASE_FLAG + FPORTABILITY = -fconvert=big-endian + +523.xalancbmk_r,623.xalancbmk_s: #lang='CXX' + PORTABILITY = -DSPEC_LINUX + +526.blender_r: #lang='CXX,C' + PORTABILITY = -funsigned-char -DSPEC_LINUX + +527.cam4_r,627.cam4_s: #lang='F,C' + PORTABILITY = -DSPEC_CASE_FLAG + +628.pop2_s: #lang='F,C' + CPORTABILITY = -DSPEC_CASE_FLAG + FPORTABILITY = -fconvert=big-endian + +#---------------------------------------------------------------------- +# GCC workarounds that do not count as PORTABILITY +#---------------------------------------------------------------------- +# The workarounds in this section would not qualify under the SPEC CPU +# PORTABILITY rule. +# - In peak, they can be set as needed for individual benchmarks. +# - In base, individual settings are not allowed; set for whole suite. +# See: +# https://www.spec.org/cpu2017/Docs/runrules.html#portability +# https://www.spec.org/cpu2017/Docs/runrules.html#BaseFlags +# +# Integer workarounds - peak +# + 500.perlbench_r,600.perlbench_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/500.perlbench_r.html + EXTRA_CFLAGS = -fno-strict-aliasing -fno-unsafe-math-optimizations -fno-finite-math-only + 502.gcc_r,602.gcc_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/502.gcc_r.html + EXTRA_CFLAGS = -fno-strict-aliasing -fgnu89-inline + 505.mcf_r,605.mcf_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/505.mcf_r.html + EXTRA_CFLAGS = -fno-strict-aliasing + 525.x264_r,625.x264_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/525.x264_r.html + EXTRA_CFLAGS = -fcommon +# +# Integer workarounds - base - combine the above - https://www.spec.org/cpu2017/Docs/runrules.html#BaseFlags +# + intrate,intspeed=base: + EXTRA_CFLAGS = -fno-strict-aliasing -fno-unsafe-math-optimizations -fno-finite-math-only -fgnu89-inline -fcommon +# +# Floating Point workarounds - peak +# + 511.povray_r=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/511.povray_r.html + EXTRA_CFLAGS = -fno-strict-aliasing + 521.wrf_r,621.wrf_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/521.wrf_r.html +% ifdef %{GCCge10} # workaround for GCC v10 (and presumably later) + EXTRA_FFLAGS = -fallow-argument-mismatch +% endif + 527.cam4_r,627.cam4_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/527.cam4_r.html + EXTRA_CFLAGS = -fno-strict-aliasing +% ifdef %{GCCge10} # workaround for GCC v10 (and presumably later) + EXTRA_FFLAGS = -fallow-argument-mismatch +% endif + # See also topic "628.pop2_s basepeak" below + 628.pop2_s=peak: # https://www.spec.org/cpu2017/Docs/benchmarks/628.pop2_s.html +% ifdef %{GCCge10} # workaround for GCC v10 (and presumably later) + EXTRA_FFLAGS = -fallow-argument-mismatch +% endif +# +# FP workarounds - base - combine the above - https://www.spec.org/cpu2017/Docs/runrules.html#BaseFlags +# + fprate,fpspeed=base: + EXTRA_CFLAGS = -fno-strict-aliasing +% ifdef %{GCCge10} # workaround for GCC v10 (and presumably later) + EXTRA_FFLAGS = -fallow-argument-mismatch +% endif + + +#-------- Tuning Flags common to Base and Peak -------------------------------- +# +# Speed (OpenMP and Autopar allowed) +# +%if %{bits} == 32 + intspeed,fpspeed: + # + # Many of the speed benchmarks (6nn.benchmark_s) do not fit in 32 bits + # If you wish to run SPECint2017_speed or SPECfp2017_speed, please use + # + # runcpu --define bits=64 + # + fail_build = 1 +%else + intspeed,fpspeed: + EXTRA_OPTIMIZE = -fopenmp -DSPEC_OPENMP + fpspeed: + # + # 627.cam4 needs a big stack; the preENV will apply it to all + # benchmarks in the set, as required by the rules. + # + preENV_OMP_STACKSIZE = 120M +%endif + +#-------- Base Tuning Flags ---------------------------------------------- +# EDIT if needed -- If you run into errors, you may need to adjust the +# optimization - for example you may need to remove +# the -march=native. See topic "Older GCC" above. +# +default=base: # flags for all base + OPTIMIZE = -g -O3 -march=native + + +#-------- Peak Tuning Flags ---------------------------------------------- +default=peak: + OPTIMIZE = -g -Ofast -march=native -flto + PASS1_FLAGS = -fprofile-generate + PASS2_FLAGS = -fprofile-use + +# 628.pop2_s basepeak: Depending on the interplay of several optimizations, +# 628.pop2_s might not validate with peak tuning. Use the base +# version instead. See: +# https:// www.spec.org/cpu2017/Docs/benchmarks/628.pop2_s.html +628.pop2_s=peak: + basepeak = yes + + +#------------------------------------------------------------------------------ +# Tester and System Descriptions - EDIT all sections below this point +#------------------------------------------------------------------------------ +# For info about any field, see +# https://www.spec.org/cpu2017/Docs/config.html#fieldname +# Example: https://www.spec.org/cpu2017/Docs/config.html#hw_memory +#------------------------------------------------------------------------------- + +#--------- EDIT to match your version ----------------------------------------- +default: + sw_compiler001 = C/C++/Fortran: Version 10.1.0 of GCC, the + sw_compiler002 = GNU Compiler Collection + +#--------- EDIT info about you ------------------------------------------------ +# To understand the difference between hw_vendor/sponsor/tester, see: +# https://www.spec.org/cpu2017/Docs/config.html#test_sponsor +intrate,intspeed,fprate,fpspeed: # Important: keep this line + hw_vendor = My Corporation + tester = My Corporation + test_sponsor = My Corporation + license_num = nnn (Your SPEC license number) +# prepared_by = # Ima Pseudonym # Whatever you like: is never output + + +#--------- EDIT system availability dates ------------------------------------- +intrate,intspeed,fprate,fpspeed: # Important: keep this line + # Example # Brief info about field + hw_avail = # Nov-2099 # Date of LAST hardware component to ship + sw_avail = # Nov-2099 # Date of LAST software component to ship + fw_bios = # Version Mumble released May-2099 # Firmware information + +#--------- EDIT system information -------------------------------------------- +intrate,intspeed,fprate,fpspeed: # Important: keep this line + # Example # Brief info about field +# hw_cpu_name = # Intel Xeon E9-9999 v9 # chip name + hw_cpu_nominal_mhz = # 9999 # Nominal chip frequency, in MHz + hw_cpu_max_mhz = # 9999 # Max chip frequency, in MHz +# hw_disk = # 9 x 9 TB SATA III 9999 RPM # Size, type, other perf-relevant info + hw_model = # TurboBlaster 3000 # system model name +# hw_nchips = # 99 # number chips enabled + hw_ncores = # 9999 # number cores enabled + hw_ncpuorder = # 1-9 chips # Ordering options + hw_nthreadspercore = # 9 # number threads enabled per core + hw_other = # TurboNUMA Router 10 Gb # Other perf-relevant hw, or "None" + +# hw_memory001 = # 999 GB (99 x 9 GB 2Rx4 PC4-2133P-R, # The 'PCn-etc' is from the JEDEC +# hw_memory002 = # running at 1600 MHz) # label on the DIMM. + + hw_pcache = # 99 KB I + 99 KB D on chip per core # Primary cache size, type, location + hw_scache = # 99 KB I+D on chip per 9 cores # Second cache or "None" + hw_tcache = # 9 MB I+D on chip per chip # Third cache or "None" + hw_ocache = # 9 GB I+D off chip per system board # Other cache or "None" + +# sw_file = # ext99 # File system +# sw_os001 = # Linux Sailboat # Operating system +# sw_os002 = # Distribution 7.2 SP1 # and version + sw_other = # TurboHeap Library V8.1 # Other perf-relevant sw, or "None" +# sw_state = # Run level 99 # Software state. + + power_management = # briefly summarize power settings + +# Note: Some commented-out fields above are automatically set to preliminary +# values by sysinfo +# https://www.spec.org/cpu2017/Docs/config.html#sysinfo +# Uncomment lines for which you already know a better answer than sysinfo diff --git a/pkgs/spec-cpu/tools.nix b/pkgs/spec-cpu/tools.nix new file mode 100644 index 0000000..e7cfd5f --- /dev/null +++ b/pkgs/spec-cpu/tools.nix @@ -0,0 +1,106 @@ +{ + stdenv +, libarchive +, xz +, gnutar +, gfortran +, coreutils +, requireFile +, autoPatchelfHook +, libxcrypt-legacy +, glibc +, lib +}: + +stdenv.mkDerivation rec { + pname = "spec-cpu-tools"; + version = "1.1.7"; + + src = requireFile { + name = "cpu2017-1.1.7.iso"; + sha256 = "02630819h64dyy57wkj33fhwwqgbw6mqc5awh1zm48pkvvl0l600"; + message = '' + Missing SPEC CPU 2017 1.1.7. + + Add it to the store with: + + $ nix-prefetch-url file:/path/to/cpu2017-1.1.7.iso + /nix/store/mk4hr8xwd62akp7iw5khq638ssba8qz0-cpu2017-1.1.7.iso + + Notice that the name must match exactly "cpu2017-1.1.7.iso". + ''; + }; + + unpackPhase = '' + set -x + mkdir iso + bsdtar -C iso -xf $src + chmod +w -R iso + + #for f in iso/install_archives/benchball/*; do + # bsdtar -xf $f + #done + #mkdir src + #bsdtar -C src -xf iso/install_archives/benchball/cpu2017-1.1.7.base.tar.xz + #bsdtar -C src -xf iso/install_archives/benchball/519.lbm_r-1.000503.tar.xz + + sourceRoot="$PWD/iso" + set +x + ''; + + # We need a working specxz binary + configurePhase = '' + patchShebangs install.sh + + set -x + + # Replace "spec*" tools by symlinks to working binaries + pushd tools/bin/linux-x86_64 + ln -fs ${xz}/bin/xz specxz + ln -fs ${gnutar}/bin/tar spectar + patchelf \ + --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + specsha512sum + ls -l spec* + ./specxz -h + ./spectar --help + ldd ./specsha512sum + ./specsha512sum --help + popd + + # sha512sum requires -e, not provided by coreutils + + export SPEC="$sourceRoot" + + # Don't run the tests + sed -i 's/^.*shrc will.*$/exit 0/g' install.sh + + set +x + ''; + + installPhase = '' + bash -x install.sh -f -d $out -u linux-x86_64 + ''; + + preFixup = '' + # Fix temporary directory creation + sed -i '/^sub get_tmp_directory/a\ return tempdir(CLEANUP => 1);' \ + $out/bin/common/util_common.pl + + sed -i '/my $dir = jp($top, $config->resultdir, $subdir);/c\ my $dir = ::get_tmp_directory($config, 1);' \ + $out/bin/harness/log.pl + ''; + + # Missing libdb-4.7.so + autoPatchelfIgnoreMissingDeps = true; + + nativeBuildInputs = [ libxcrypt-legacy libarchive autoPatchelfHook ]; + #buildInputs = [ libxcrypt-legacy ]; + + enableParallelBuilding = false; + hardeningDisable = [ "all" ]; + dontStrip = true; + meta.broken = (stdenv.buildPlatform.config != "x86_64-unknown-linux-gnu") || + (stdenv.hostPlatform.config != "x86_64-unknown-linux-gnu") || + (stdenv.targetPlatform.config != "riscv64-unknown-linux-gnu"); +}