SPEC CPU2006 Config Files

Last updated: $Date: 2008-06-17 16:13:40 -0400 (Tue, 17 Jun 2008) $ by $Author: cloyce $
(To check for possible updates to this document, please see http://www.spec.org/cpu2006/Docs/ )

Overview

Click one of the following to go to the detailed contents about that item:

I. Introduction

II. Config file options for runspec

III. Config file options for specmake

IV. Config file options for the shell

V. Config file options for readers

VI. Using Feedback Directed Optimization (FDO)

VII. The config file preprocessor

VIII. Output files - and how they relate to your config file

IX. About Alternate Sources

X. Troubleshooting

Contents

I. Introduction

A. What is a config file? (Background: benchmark philosophy.)

B. What does a config file affect?

1. runspec

2. specmake

3. The shell

4. Readers of the results

5. The config file preprocessor

C. Config file structure

1. Comments and whitespace

2. Header section

3. Named sections

a. Precedence for the benchmark specifier

Default benchmark

Named suite

Named benchmark

Order of differing sections does not matter

Order of the same section does matter

b. Precedence for the tuning specifier

c. Precedence for the extension specifier

Extension found in config file

Extension not found in config file

Extension override

d. Combining specifier types

e. Precedence among section types

4. MD5 section

5. Shell-like "here documents" and continued lines

6. Included files

D. Variable substitution

1. By runspec

a. At startup: $[variable]

b. During a run: $variable and ${variable}

c. Example: cleaning files before a training run

d. Example: submit to multiple nodes, Tru64 Unix

e. Example: bind to processors, SPEC TurboBlaster9000

2. By the shell \$VARIABLE

a. Protecting shell variables

b. Example: submitting to multiple nodes, SGI Origin 2000

3. By specmake $(VARIABLE)

4. Limitations on variable substitution

5. Unsetting a variable with "%undef%"

II. Config file options for runspec

A. Precedence: config file vs. runspec command line

B. Options

action allow_extension_override backup_config basepeak bind build_in_build_dir check_md5 check_version command_add_redirect copies delay deletework difflines env_vars expand_notes expid ext fail fail_build fail_run feedback flagsurl http_proxy http_timeout ignore_errors ignore_sigint info_wrap_columns inherit_from iterations keeptmp line_width locking log_line_width log_timestamp mach mail_reports mailcompress mailmethod mailport mailserver mailto make make_no_clobber makeflags max_active_compares mean_anyway minimize_builddirs minimize_rundirs no_input_handler no_monitor nobuild notes_wrap_columns notes_wrap_indent output_format output_root parallel_setup parallel_setup_prefork parallel_setup_type parallel_test parallel_test_submit plain_train preenv rate rebuild reportable runlist section_specifier_fatal sendmail setprocgroup size src.alt strict_rundir_verify sysinfo_program table teeout train_with tune use_submit_for_speed verbose version_url

III. Config file options for specmake

CC, CXX, FC
CLD, CXXLD, FLD
ONESTEP
OPTIMIZE, COPTIMIZE, CXXOPTIMIZE, FOPTIMIZE
PORTABILITY, CPORTABILITY, CXXPORTABILITY, FPORTABILITY...
RM_SOURCES
PASSn_CFLAGS, PASSn_CXXFLAGS, PASSn_FFLAGS

About Automatic Rebuilds

IV. Config file options for the shell

A. Options

bench_post_setup fdo_pre0 fdo_preN fdo_make_cleanN fdo_pre_makeN fdo_make_passN fdo_post_makeN fdo_runN fdo_postN post_setup submit

B. Using and Changing fdo Options

C. Using submit

1. Basic Usage

2. Useful features related to submit

3. Continuation of Submit Lines

Sidebar: About Quoting and Submit

4. Reporting of submit usage

V. Config file options for readers

A. Descriptive fields

company_name hw_avail hw_cpu_name hw_cpu_char hw_cpu_mhz hw_disk hw_fpu hw_memory hw_model hw_nchips hw_ncores hw_ncoresperchip hw_ncpuorder hw_nthreadspercore hw_ocache hw_other hw_pcache hw_scache hw_tcache hw_vendor license_num machine_name prepared_by sw_auto_parallel sw_avail sw_base_ptrsize sw_compiler sw_file sw_os sw_parallel_defeat sw_parallel_other sw_state sw_other sw_peak_ptrsize tester tester_name test_date test_sponsor VENDOR

B. Field scoping and continuation

C. Additional notes for the reader

1 Notes sections

notes_comp_NNN notes_port_NNN notes_base_NNN notes_peak_NNN notes_submit_NNN notes_os_NNN notes_plat_NNN notes_part_NNN notes_NNN

2 Note numbering

3 Additional tags

4 Links in notes sections

5 Attachments

D. About Auto Parallel Reporting

VI. Using Feedback Directed Optimization (FDO)

A. The minimum requirement: PASSn* or fdo*n

B. Combining PASS*n and fdo*n; fake is your friend

C. Interaction with the config file feedback option

D. If the config file feedback option is used at multiple levels

E. Interaction with runspec --feedback

F. More examples

VII. The config file preprocessor

A. Defining macros

B. Un-doing macro definition

C. Using macros

D. Conditionals

1. %ifdef .. %endif

2. %ifndef .. %endif

3. %if .. %endif

4. %else

5. %elif

E. Informational directives

1. %warning

2. %error

VIII. Output files - and how they relate to your config file

A. Automatic backup of config files

B. The log file and verbosity levels

1. Useful Search Strings

2. About Temporary Debug Logs

3. Definitions of verbosity levels

C. Log file example: Feedback-directed optimization.

D. Help, I've got too many logs

E. Finding the build directory

F. Files in the build directory

G. For more information

IX. About Alternate Sources

A. Example: Applying a src.alt

B. Developing a src.alt (brief introduction)

X. Troubleshooting

 

I. Introduction

SPEC CPU2006 config files provide very detailed control of testing. Before learning about these details, most users will find it helpful to begin with:

Note: links to SPEC CPU2006 documents on this web page assume that you are reading the page from a directory that also contains the other SPEC CPU2006 documents. If by some chance you are reading this web page from a location where the links do not work, try accessing the referenced documents at one of the following locations:

  • www.spec.org/cpu2006/Docs/
  • The $SPEC/Docs/ (Unix) or %SPEC%\Docs\ (Windows) directory on a system where SPEC CPU2006 has been installed.
  • The Docs/ directory on your SPEC CPU2006 distribution DVD.

The runspec document discusses the primary user interface for running SPEC CPU2006; with this document, attention turns more toward how things work inside.

q. This document looks big and intimidating. Where do I start?

a. Don't start here. Start with runspec.html. But, once you do read this document, please be sure to notice:

  • Section I.B, which explains that a config file contains options that are used by five (5) different consumers.
  • The table of contents, which lists the options accepted by each of those consumers. For example, the shell options are listed here.

If you keep track of which options are addressed to which consumer, you will considerably ease your learning curve.

I.A. What is a config file? (Background: benchmark philosophy.)

A config file contains:

A key decision that must be made by designers of a benchmark suite is whether to allow the benchmark source code to be changed when the suite is used.

If source code changes are allowed:

 +  The benchmark can be adapted to the system under test.
 +  Portability may be easier.
 –  But it may be hard to compare results between systems, unless some formal audit is done to ensure that comparable work is done.

If source code changes are not allowed:

 +  Results may be easier to compare.
 –  It may take more time and effort to develop the benchmark, because portability will have to be built in ahead of time.
 –  Portability may be hard to achieve, at least for real applications. Simple loops of 15 lines can port with little effort, and such benchmarks have their uses. But real applications are more complex.

SPEC has chosen not to allow source code changes for the CPU2006 suite, except under very limited circumstances.

By restricting source code changes, SPEC separates the activity of porting benchmarks, which has a goal of being performance neutral, from the activity of using the benchmarks, where the goal is getting the best score possible. Prior to the first production use of CPU2006, SPEC invested substantial effort to port the suite to as many platforms as practical, including 32 and 64-bit systems; little-endian and big-endian hardware; Unix, Linux, Mac OS X, and Microsoft Windows systems.

Are source code changes ever allowed? Normally, no. But if you discover a reason why you believe such a change is essential, SPEC wants to hear about it, and will consider such requests for a future revision of the suite. SPEC will normally not publish CPU2006 results using modified source code, unless such modifications are unavoidable for the target environment, are reviewed by SPEC, are made available to all users of the suite, and are formally approved by a vote.

So, if source code changes are not allowed, but the benchmarks must be compiled in a wide variety of environments, can the users at least write their own makefiles, and select -D options to select different environments? The answer to these two questions are "no", and "yes", respectively:

You do this in the config file, which contains a centralized collection of all the portability options and optimization options for all the benchmarks in the CPU2006 suite. The SPEC tools then automatically generate the makefiles for you.

The config file contains places where you can specify the characteristics of both your compile time and run time environments. It allows the advanced user to perform detailed manipulation of makefile options, but retains all the changes in one place so that they can be examined and reproduced.

The config file is one of the key ingredients in making results reproducible. For example, if a customer would like to run the CPU2006 suite on her own SuperHero Model 4 and discover how close results are in her environment to the environment used when the vendor published a CPU2006 result, she should be able to do that using only 3 ingredients:

  1. The SPEC CPU2006 media, ordered from SPEC.
  2. The software and hardware as specified in the full disclosure when the vendor published the original results.
  3. The config file from the vendor's submission.

I.B. What does a config file affect?

A config file contains options targetting five distinct consumers:

  1. The runspec tool, which provides overall control of the test,
  2. The tool that compiles benchmarks: specmake,
  3. Your shell, which is used for certain operations such as submiting to specific processors,
  4. Readers of the results, and
  5. The config file preprocessor.

To understand how to write a config file effectively, you need to understand which consumer you are addressing at any given point.

The above point seems worth emphasizing:

To understand how to write a config file effectively, you need to understand which consumer you are addressing at any given point.

This section gives you an overview of the consumers; more detail is included in later sections.

I.B.1. runspec

Various aspects of the operation of runspec can be affected by setting options within a config file. You'll find a list of these options in the table of contents for section II - including some that are available both on the runspec command line and some that can only be set within a config file.

For example, if michael.cfg includes the lines:

   output_format = asc,ps
   tune          = base
   reportable    = 1
   runlist       = fp

then the defaults for the runspec command would change as specified. A user who types either of the following two commands would get precisely the same effect:

   runspec --config=michael
   runspec --config=michael --output=asc,ps --tune=base --reportable fp 

I.B.2. specmake

The tool specmake is simply GNU make renamed to avoid any possible conflicts with other versions of make that may be on your system. The options commonly used for specmake are listed in the table of contents for section III.

For example, these config file lines:

   CC           = cc
   CPORTABILITY = -DSPEC_CPU_LP64
   OPTIMIZE     = -O4

are written to the makefile set that is ultimately used to build the benchmark, and are interpreted by specmake.

I.B.3. The shell

Some config file lines define commands that are handed off to the shell or, on Windows, the command interpreter. The list of these is in the table of contents for section IV.

For example, consider a config file that contains:

   fdo_pre0     = mkdir /tmp/joydeep/feedback; rm -f /tmp/joydeep/feedback/* 

When using this config file, runspec will pass the above command to the shell prior to running a training run for feedback directed optimization. It is the shell that actually carries out the requested commands, not runspec, so the syntax of the command depends on whether you are using the Unix shell (/bin/sh) or the Windows command interpreter (cmd.exe).

Because runspec can cause arbitrary commands to be executed, it is therefore important to read a config file you are given before using it.

I.B.4. Readers of the results

If a SPEC CPU2006 result is published (for example, at http://www.spec.org/), it is expected to contain all the information needed for a reader to understand exactly what was tested. Fields that are informative for readers are listed in the table of contents for section V.

For example, config file lines such as these are addressed to the human reader:

   hw_avail  = Apr-2008
   sw_avail  = May-2008
   notes_base_015  = Note: Feedback directed optimization was not used

In addition, for results published by SPEC, the config file itself is available to readers at http://www.spec.org/cpu2006/. The config file is presented as you wrote it, with three exceptions (protected comments, the MD5 section, and rawfile corrections for reader fields). The config file is made available because it is so important to reproducing results, as described in the Introduction. The config file is saved on every run, as a compressed portion of the rawfile, and can be accessed with runspec --rawformat --output_format=config <rawfile>.

I.B.5. The config file preprocessor

There is also a config file preprocessor, which is addressed via lines that begin with % in the first column. (The config file preprocessor is new with CPU2006.)

I.C. Config file structure

A config file contains:

About "scope": Every line of the config file is considered to be within the scope of one of the above three. Lines prior to the first section marker are in the scope of the header section. All other lines are either in the scope of the most recently preceding user-defined section marker, or else in the MD5 section.

A line within the scope of a named section may be overridden by a line within the scope of a different named section, according to rules that are described below.

I.C.1. Comments and whitespace

Comment lines begin with a #, and can be placed anywhere in a config file. When the config file is saved as an encoded portion of the rawfile, the comments are included. But if a comment line begins with #>, it is a "protected comment" that will not be saved in the rawfile. Thus you could use # for most of your comments, and use #> for proprietary information, such as:

   #> I didn't use the C++ beta version because of Bob's big back-end bug.

Blank lines can be placed anywhere in a config file.

Trailing spaces and tabs are stripped, unless they are preceeded by a backslash:

   CC_PATH=/path/with/no/trailing/spaces  

That is turned into "/path/with/no/trailing/spaces". To preserve those trailing spaces, you'd simply add a backslash:

   CC_PATH=/path/with/trailing/spaces\ 

That is turned into "/path/with/trailing/spaces ".

Spaces within a line are usually ignored. Of course, you wouldn't want to spell OPTIMIZE as OPT I MIZE, but you are perfectly welcome to do either of the following:

   OPTIMIZE=-O2
   OPTIMIZE   =  -02

One place where spaces are considered significant is in notes, where the tools assume you are trying to line up your comments in the full disclosure reports. (Notes are printed in a fixed-width font.)

Spaces at the beginning of lines are ignored, except when attempting to address the preprocessor. Preprocessor directives always begin with a percent sign (%) in the first column. You can put spaces after the percent sign, if you wish, as shown by the examples below.

I.C.2. Header section

The header section is simply the first section, prior to the first occurence of a named section.

Most attempts to address runspec itself must be done in the header section. For example, if you want to set reportable=1, you must do so before any occurrences of section markers.

I.C.3. Named Sections

A named section is a portion of the config file that begins with a section marker and continues until the next section marker or the MD5 section is reached. The contents of the named section are applied based upon the precedence rules described in the following sections.

A "section marker" is a one- to four-part string of the form:

   benchmark[,...]=tuning[,...]=extension[,...]=machine[,...]:

These are referred to below as the 4 "section specifiers". The allowed values for the section specifiers are:

benchmark: default
cpu2006
int
fp
Any individual benchmark, such as 465.tonto
A list of benchmarks, such as 450.soplex,403.gcc The ability to specify more than one benchmark is new with CPU2006.
A benchmark set, using one of the bset names found in $SPEC/benchspec/CPU2006 or %SPEC%\benchspec\CPU2006 The ability to specify bset names is new with CPU2006 (and is documented for the first time with CPU2006 V1.1).
tuning: default
base
peak
A list of tuning levels, such as base,peak The ability to specify more than one tuning level is new with CPU2006 (and is documented for the first time with CPU2006 V1.1).
extension: default
An arbitrary string, such as "cloyce-naturalblonde"
A list of extensions, separated by commas The ability to specify more than one extension is new with CPU2006 (and is documented for the first time with CPU2006 V1.1).
machine: default
An arbitrary string [*]
A list of machine types, separated by commas The ability to specify more than one machine type is new with CPU2006 (and is documented for the first time with CPU2006 V1.1).

Trailing default section specifiers may be omitted from a section marker. Thus all three of these section markers are equivalent:

   465.tonto=base=default=default:
   465.tonto=base=default:
   465.tonto=base:

[*] The "machine" specifier works similarly to the extension specifier, but it does not affect the name of the executable produced, which, in many environments, makes it less useful than the extension specifier. This document does not describe the usage of the "machine" specifier, other than to note that it exists; if you feel particularly courageous, you can experiment with it.

But please be aware that if you use a single config file to build with two different machine settings, you will likely overwrite the original binaries on the second build, since the machine specifier does not affect the name of the generated executable.

An example of the usage of the machine specifier may be found in your config directory, in Example-solaris-sparc-sunstudio.cfg. That config file applies -DSPEC_CPU_LP64 when the machine native64 is selected; it also takes steps to work around the limitation mentioned in the previous paragraph.

Section markers can be entered in any order. Section markers can be repeated; material from identical section markers will automatically be consolidated. That is, you are welcome to start one section, start a different one, then go back and add more material to the first section. But please note that since there is no marker for the header section, you cannot go back to it.

By constructing section markers, you specify how you would like your options applied, with powerful defaulting and overriding capabilities. The next several sections walk through examples to demonstrate precedence, including how sections interact with each other.

I.C.3.a. Precedence for the benchmark specifier

For the benchmark specifier, the precedence is:

  highest   named benchmark(s)
            suite name
  lowest    default

Using default as the benchmark specifier

For example, consider this config file that only mentions default for the benchmark specifier:

   $ cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   default=default=default=default:
   OPTIMIZE = -xO1 -w

   $ runspec --config=tmp | grep sjeng.c
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO1 -w    sjeng.c
   $ 

The config file above is designed for quick, simple testing: it runs only one benchmark, namely 458.sjeng, using the smallest (test) workload, runs it only once, uses only base tuning, outputs only the text-format (ASCII) report, and displays the build commands to the screen (teeout). To use it, we issue a runspec command, and pipe the output to grep to search for the actual generated compile command. (Alternatively, on Windows, we could use findstr on the generated log file).

The careful reader may ask, "Why does the runlist reference sjeng rather than 458.sjeng?" The answer is that the runlist can use benchmark numbers or any abbreviation that is sufficient for uniqueness; any of the following would have the same effect: "458.sjeng", "458", "sjeng", "sj", "458.sj". This is the same rule as for the corresponding option on the command line.

The results show that the tuning applied was the expected -xO1 -w (which mean optimization level 1 and suppress warnings, for the Sun Studio Compilers). The tools have automatically added -c -o sjeng.o to specify where the object file is to be written. The switches -DSPEC_CPU -DNDEBUG were also added automatically. The former may enable benchmark code changes from SPEC's porting process (if any), and the latter turns off C language "assert" statements (if any).

Using a named suite as the benchmark specifier

The next example differs from the previous one by adding a section marker with int, for the integer suite, as the first section specifier:

   $  cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   default=default=default=default:
   OPTIMIZE = -xO2 -w

   int=default=default=default:
   OPTIMIZE = -xO3 -w

   $ runspec --config=tmp | grep sjeng.c
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO3 -w     sjeng.c
   $

The second OPTIMIZE line is used above because the reference to the integer suite is considered to be more specific than the overall default.

Newly documented with CPU2006 V1.1: you can also mention the "bsets" found in $SPEC/benchspec/CPU2006 or %SPEC%\benchspec\CPU2006. For example, you could reference all the C++ benchmarks by saying:

   all_cpp=default=default=default:
   OPTIMIZE = -xO3 -w

You can mention multiple sets:

   all_c,all_cpp=default=default=default:
   OPTIMIZE = -xO3 -w

Using a named benchmark as the benchmark specifier

Furthermore, we can add a specifier that mentions sjeng by name:

   $  cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   default=default=default=default:
   OPTIMIZE = -xO2 -w

   int=default=default=default:
   OPTIMIZE = -xO3 -w

   458.sjeng=default=default=default:
   OPTIMIZE = -xO4 -w

   $ runspec --config=tmp | grep sjeng.c
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO4 -w      sjeng.c
   $

The third OPTIMIZE line wins above, because it is included in the section that is considered to be the most specific.

Newly documented with CPU2006 V1.1: You can name more than one benchmark if you wish, as in:

   401.bzip2,458.sjeng=default=default=default:
   OPTIMIZE = -xO4 -w

Order of differing sections does not matter:

Let's change the example from the previous section to a different order.

   $ cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   458.sjeng=default=default=default:
   OPTIMIZE = -xO4 -w

   default=default=default=default:
   OPTIMIZE = -xO2 -w

   int=default=default=default:
   OPTIMIZE = -xO3 -w

   $ runspec --config=tmp | grep sjeng.c
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO4 -w      sjeng.c

Notice above that the order of entry is not significant; it's the order of precedence from least specific to most specific.

Order of the same section does matter:

When a specifier is listed more than once at the same descriptive level, the last instance of the specifier is used. Consider this case:

   458.sjeng=default=default=default:
   OPTIMIZE = -xO4

   400.perlbench=default:
   OPTIMIZE = -fast

   458.sjeng=default=default=default:
   OPTIMIZE = -xO3

The ending value of OPTIMIZE for 458.sjeng is -xO3, not -xO4.

I.C.3.b. Precedence for the tuning specifier

For the tuning specifier, either base or peak has higher precedence than default.

Here is an example of its use:

   $ cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base,peak
   output_format = text
   teeout        = 1

   default=default=default=default:
   CC       = /opt/SUNWspro/bin/cc -w

   default=base=default=default:
   CC       = /update1/bin/cc -w

   default=peak=default=default:
   CC       = /update2/bin/cc -w

   $ runspec --config=tmp | grep sjeng.c
   /update1/bin/cc -w -c -o sjeng.o -DSPEC_CPU -DNDEBUG    sjeng.c
   /update2/bin/cc -w -c -o sjeng.o -DSPEC_CPU -DNDEBUG    sjeng.c
   $ 

In the above example, we compile sjeng twice: once for base tuning, and once for peak. Notice that in both cases the compilers defined by the more specific section markers have been used, namely /update1/bin/cc and /update2/bin/cc, rather than /opt/SUNWspro/bin/cc from default=default=default=default.

I.C.3.c. Precedence for the extension specifier

For the extension specifier, any named extension is at a higher precedence level than the default.

Using an extension found in the config file

The next example, builds with either the library for the "bsdmalloc" memory allocation routines, or the multi-threaded "mtmalloc" routines. (Note: the SPEC CPU2006 benchmarks do not require multi-threading, and do not contain threading directives; but a compiler is allowed to choose to try to automatically decompose threads, and there's nothing in the run rules to prohibit you from linking with your preferred version of a supported malloc library.)

   $ cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   default=default=default:
   LIBS = -lslowmalloc

   default=default=myke:
   LIBS = -lbsdmalloc

   default=default=yusuf:
   LIBS = -lthread -lmtmalloc
   $
   $ runspec --config=tmp --extension=myke | grep sjeng.o
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG                    sjeng.c
   cc  attacks.o book.o crazy.o draw.o ecache.o epd.o eval.o leval.o moves.o 
   neval.o partner.o proof.o rcfile.o search.o see.o seval.o sjeng.o ttable.o 
   utils.o     -lbsdmalloc          -o sjeng
   $
   $ runspec --config=tmp --extension=yusuf | grep sjeng.o
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG                    sjeng.c
   cc  attacks.o book.o crazy.o draw.o ecache.o epd.o eval.o leval.o moves.o 
   neval.o partner.o proof.o rcfile.o search.o see.o seval.o sjeng.o ttable.o 
   utils.o     -lthread -lmtmalloc          -o sjeng
   $ 
   $ cd $SPEC/benchspec/CPU2006/458.sjeng/exe
   $ ls -lt | head -3
   total 5888
   -rwxrwxr-x   1 alan  staff      244688 May 11 16:32 sjeng_base.yusuf
   -rwxrwxr-x   1 alan  staff      244628 May 11 16:31 sjeng_base.myke
   $ 

Notice above that two different versions of sjeng were built from the same config file, and neither one used slowmalloc, since the named extension is higher priority than the default. Both executables are present in the exe directory for 458.sjeng.

Using an extension that is not found in the config file

The previous section demonstrated use of the runspec switch --extension to select among extensions defined in the config file. But what if the extension on the command line is not mentioned in the config file? The example below continues immediately from the example just above:

   $ runspec --config=tmp --extension=yusoff
   runspec v4200 - Copyright 1999-2006 Standard Performance Evaluation Corporation
   ...
   ERROR: The extension 'yusoff' defines no settings in the config file!
          If this is okay and you'd like to use the extension to just change
          the extension applied to executables, please put
       allow_extension_override = yes
          into the header section of your config file.

By default, if you mention an extension on the runspec command line that does not exist in the config file, the tools refuse to build.

Extension override

But if you add allow_extension_override=yes to the top of the config file, then the tools will build or run with the extension you specified, using the same settings as they would have used if no extension had been entered on the runspec command line.

The next example continues with a config file that adds allow_extension_override to the previous example config file:

   $ diff tmp.cfg tmp2.cfg
   0a1
   > allow_extension_override=yes
   $
   $ runspec --config=tmp2 --extension=yusoff | grep sjeng.o
   cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG                    sjeng.c
   cc attacks.o book.o crazy.o draw.o ecache.o epd.o eval.o leval.o moves.o 
   neval.o partner.o proof.o rcfile.o search.o see.o seval.o sjeng.o ttable.o 
   utils.o           -lslowmalloc          -o sjeng
   $
   $ cd $SPEC/benchspec/CPU2006/458.sjeng/exe
   $ ls -lt | head -2
   total 6384
   -rwxrwxr-x   1   alan   staff        244628 May 11 16:39 sjeng_base.yusoff

Notice above that although the tools now consent to build with the requested extension, the library settings now falls back to the default, since "yusoff" does not match any section markers.

(For CPU2000, the tools silently accepted any extension, including typos, which sometimes led to surprising results. CPU2006 tries to reduce surprises by rejecting your typos, unless you set allow_extension_override.)

I.C.3.d. Combining specifier types

If more than one section applies to a particular benchmark without disagreement among them, then all are applied.

Consider this example:

   $ cat tmp.cfg
   runlist       = sjeng
   size          = test
   iterations    = 1
   tune          = base
   output_format = text
   teeout        = 1

   default=default=default=default:
   OPTIMIZE = -xO2 -w
   CC       = /opt/SUNWspro/bin/cc 
   LIBS     = -lbsdmalloc

   458.sjeng=default=default=default:
   OPTIMIZE = -xO4 -w

   default=peak=default=default:
   CC       = /update1/bin/cc 

   default=default=mt=default:
   LIBS     = -lthread -lmtmalloc

   $ runspec --config=tmp --tune=peak --ext=mt | grep sjeng.o
   /update1/bin/cc  -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO4 -w  sjeng.c
   /update1/bin/cc   -xO4 -w attacks.o book.o crazy.o draw.o ecache.o epd.o 
   eval.o leval.o moves.o neval.o partner.o proof.o rcfile.o search.o see.o 
   seval.o sjeng.o ttable.o utils.o    -lthread -lmtmalloc         -o sjeng
   $ 

Notice above that all three sections applied: the section specifier for 458.sjeng, the specifier for peak tuning, and the specifier for extension mt.

I.C.3.e. Precedence among section types

If sections conflict with each other, the order of precedence is:

     highest     benchmark
                 suite
                 tuning
     lowest      extension

And this order can be demonstrated as follows:

    $  cat tmp.cfg
     runlist       = sjeng
     size          = test
     iterations    = 1
     tune          = base
     output_format = text
     teeout        = 1
     makeflags     = -j30
  
     default=default=default=default:
     OPTIMIZE = -xO1 -w
  
     int=default=default=default:
     OPTIMIZE = -xO2 -w
  
     458.sjeng=default=default=default:
     OPTIMIZE = -xO3 -w
  
     default=peak=default=default:
     OPTIMIZE = -xO4 -w
  
     default=default=mt=default:
     OPTIMIZE = -xO5 -w
     $
     $ runspec --config=tmp sjeng | grep sjeng.c  
[1]  cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO3 -w        sjeng.c
     $ runspec --config=tmp --tune=peak sjeng | grep sjeng.c
[2]  cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO3 -w        sjeng.c
     $ runspec --config=tmp --extension=mt sjeng | grep sjeng.c
[3]  cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO3 -w        sjeng.c
     $ 
     $ runspec --config=tmp --tune=base bzip | grep bzip2.c
[4]  cc -c -o bzip2.o -DSPEC_CPU -DNDEBUG   -xO2 -w        bzip2.c
     $ runspec --config=tmp --tune=peak bzip | grep bzip2.c
[5]  cc -c -o bzip2.o -DSPEC_CPU -DNDEBUG   -xO2 -w        bzip2.c
     $ runspec --config=tmp --extension=mt bzip | grep bzip2.c
[6]  cc -c -o bzip2.o -DSPEC_CPU -DNDEBUG   -xO2 -w        bzip2.c
     $ 
     $ runspec --config=tmp --tune=base sphinx3 | grep utt.c
[7]  cc -c -o utt.o -DSPEC_CPU -DNDEBUG -I. -DSPEC_CPU -DHAVE_CONFIG_H 
     -I. -Ilibutil   -xO1 -w   utt.c
     $ runspec --config=tmp --tune=peak sphinx3 | grep utt.c
[8]  cc -c -o utt.o -DSPEC_CPU -DNDEBUG -I. -DSPEC_CPU -DHAVE_CONFIG_H 
     -I. -Ilibutil   -xO4 -w   utt.c
     $ runspec --config=tmp --extension=mt sphinx3 | grep utt.c
[9]  cc -c -o utt.o -DSPEC_CPU -DNDEBUG -I. -DSPEC_CPU -DHAVE_CONFIG_H 
     -I. -Ilibutil   -xO5 -w   utt.c
     $ runspec --config=tmp --tune=peak --extension=mt sphinx3 | grep utt.c
[10] cc -c -o utt.o -DSPEC_CPU -DNDEBUG -I. -DSPEC_CPU -DHAVE_CONFIG_H 
     -I. -Ilibutil   -xO4 -w   utt.c
     $ 

Notice above that the named benchmark always wins: lines [1], [2], and [3]. If there is no section specifier that names a benchmark, but there is a section specifier that names a suite, then the suite wins: lines [4], [5], and [6]. If there are no applicable benchmark or suite specifiers, then tuning or extension can be applied: lines [8] and [9]. But if both tuning and extension are applied, tuning wins [10].

I.C.4. MD5 Section

The final section of your config file is generated automatically by the tools when the benchmarks are compiled, and looks something like this:

   __MD5__
   458.sjeng=base=none=default:
   # Last updated Thu May 11 08:53:12 2006
   optmd5=a0104c0975ee3b341e73437843df57a9
   baggage=
   compile_options=\
   @eNpz9vcNsFJITlbQBaJ8hfyCksz8vGK9fAVdl+AAV+d454BQINPPxdUp1F1BQUG3wt9YQbdcAR3Y\
   FOeXFiWn2nE5Wyk4O9sqJScrgZn+Tl7+ASG2SiimK3EBrQQa7Obj6B4MlMO0SYnL30oBqNHT1zPK\
   FagCYqsSl4+nnzfYtVgcYpOflJWaXFJshySGsBPkGh8XiMOwmw1W4B8KciySSwGYpEmr
   exemd5=9b42a21f12b1fbb4e87cd9bacd781c43

The "MD5" is a checksum that ensures that the binaries referenced in the config file are in fact built using the options described therein. For example, if you edit the config file to change the optimization level for 458.sjeng, the next time the file is used for sjeng, the tools will notice the change and will recompile it.

You can optionally disable this behavior, but doing so is strongly discouraged. See the acerbic remarks in the description of check_md5, below.

If you would like to see what portions of your config file are used in computing the MD5 hash, runspec with --debug=30 or higher, and examine the log file.

For published results, the published config file (from rawformat --output_format=config) does not include the MD5 section.

I.C.5. Shell-like "here documents" and continued lines

Shell-style "here documents" are supported for setting variables to multi-line values. Continued lines (with \) are also supported:

   $ cat tmp2.cfg
   expand_notes  = 1
   size          = test
   runlist       = sjeng
   iterations    = 1
   output_format = text

   foo =<<EOT

   This +
   is a +
   test +
   EOT

   bar = \
         and +\
         so  +\
         is  +\
         this+

   notes01 = $foo
   notes02 = $bar

   $ runspec --config=tmp2 | grep txt
           format: ASCII -> /ailuropoda/raj/spec/result/CINT2006.159.test.txt
   $ grep + ../result/*159*txt
       This +
       is a +
       test +
             and +
             so  +
             is  +
             this+
   $

Note: although continued lines are supported, they are rarely used. The more common method of continuation is by appending a number to a field, as described in the section "Field scoping and continuation".

I.C.6. Included files

It is possible to include another file in your config file. A typical use for this feature might be to keep all the software information in the main config file, but to include the hardware information about the current System Under Test (SUT) in another file. For example:

   $ cat tmp.cfg
   output_format = text
   iterations    = 1
   size          = test
   sw_compiler   = myC V1.0
   sw_avail      = Mar-2007
   runlist       = sjeng
   include: SUT.inc

   default=base:
   OPTIMIZE = -O
   $ cat SUT.inc
   hw_model = SuperHero IV
   hw_avail = Feb-2008

   $ runspec --config tmp | grep txt
           format: ASCII -> /manas/spec/result/CINT2006.160.test.txt
   $ grep avail ../result/*160.test.txt
    [...]       Hardware availability: Feb-2008
    [...]       Software availability: Mar-2007
   $ 

Notice above that the report mentions both the hardware and software dates.

I.D. Variable Substitution

You can do variable substitution using your config file. But, as described in the Introduction, the contents of a config file are directed to various consumers. Therefore, effective use of variable substitution requires you to be aware of which software is doing the substitution. Differing syntax is used for each.

%{macro_name}

The config file preprocessor does macro substitution. Macros to be substituted always use a percent sign and curly brackets: %{macro_name} See the preprocessor section for more information.

$[variable]

A dollar sign and square brackets cause runspec to do substitution immediately after reading the config file. This is useful for variables that don't change during a run, for example $[top] to refer to the directory where SPEC CPU2006 has been installed.

$variable
${variable}

A dollar sign and the name of a variable cause Perl variable interpolation to be used, for example $hw_avail. Curly brackets can be used to help the parser avoid confusion with contiguous other content: ${hw_avail}ish.

\$VARIABLE

If runspec generates an external command which is handed off to your shell (or command interpreter), the variable will be interpreted according to the rules of your shell. Such a variable might look like this: \$SPEC.

$(VARIABLE)

If the variable is handed off to specmake, it is interpreted by the usual rules of GNU make. Such variables might look like this: $(FOPTIMIZE).

q. Wait a minute... all these choices for substitution? Which one do I want?

a. You probably want the preprocessor.

Have a look at the example at the top of Section VII. If that looks like what you want, you're all set; otherwise, you'll have to think through which consumer you are addressing (runspec, specmake, or the shell) and pick your syntax accordingly.

I.D.1. By runspec

Substitution by runspec itself uses two different methods: the first is immediately after the config file is read, and the second is via Perl variable interpolation.

I.D.1.a At startup: $[variable]

Substitution for variables of the form $[variable] happens immediately after the config file is read. Any value that's set in the config file and is visible in the scope where the variable is used can be substituted. Because of the named section scoping restriction, if you want to use variable substitution to note your optimization flags, the notes for the individual benchmarks must be in those benchmarks' sections:

400.perlbench=peak=default=default:
PEAKFLAG=-gofast
# The following will turn into what you expect
notes_peak_400_1=I use $[PEAKFLAG]

400.perlbench=base=default=default:
BASEFLAG=-besafe
# The following will turn into what you expect:
notes_base_400_1=I use $[BASEFLAG]
# The following will NOT WORK:
notes_base_400_2=My brother likes $[PEAKFLAG]

You can't substitute variables that don't exist or whose values aren't known when the config file is read.

Wrong:

ext = foo

default:
OPTIMIZE = -xO2
notes01 = my ext is $[ext]

default=default=bar:
OPTIMIZE = -xO1
notes02 = my ext is $[ext]

This doesn't work because the sorting of which extensions to use doesn't happen until after the config file is processed. In this particular example, it's obvious (to you) what the value should be, but the tools aren't as clever as you are.

Perhaps the most useful variable is the one for the top of the SPEC CPU2006 tree, $[top], often found in contexts such as:

    flagsurl = $[top]/myflagsdir/myflagsfile.xml

Variables of possible interest might include:

configpath The location of your config file
dirprot protection that is applied to directories created by runspec
endian 4321 for big endian, 1234 for little
flag_url_base directory where flags files are looked up
OS unix or windows
os_exe_ext exe for windows, nil elsewhere
realuser the user name according to the OS
top the top directory of your installed SPEC CPU2006 tree
username the username for purposes of tagging run directories
uid the numeric user id

You can substitute for most options that you enter into the config file, including: action, allow_extension_override, backup_config, basepeak, check_md5, check_version, command_add_redirect, config, copies, delay, deletework, difflines, env_vars, expand_notes, expid, ext, fake, feedback, flagsurl, http_proxy, http_timeout, ignore_errors, ignore_sigint, info_wrap_columns, iterations, line_width, locking, log_line_width, mach, mail_reports, mailcompress, mailmethod, mailport, mailserver, mailto, make, make_no_clobber, makeflags, max_active_compares, mean_anyway, minimize_builddirs, minimize_rundirs, no_input_handler, no_monitor, notes_wrap_columns, notes_wrap_indent, output_format, output_root, plain_train, rate, rawformat, rebuild, reportable, runlist, section_specifier_fatal, sendmail, setprocgroup, size, strict_rundir_verify, sysinfo_program, table, teeout, tune, use_submit_for_speed, username, verbose, version_url.

You can also print out the value of additional variables that you may have created.

Here is a sample config file that illustrates square bracket variable substitution:

$ cat x.cfg
expand_notes = 1
runlist      = fp
action       = validate
myfriend     = jamiemeow
output_root  = /tmp
flagsurl     = $[top]/Docs/flags/flags-advanced.xml

notes01      = Today, I am running $[runlist] in $[top] on a $[OS] system 
notes02      = Today the flags file is $[flagsurl]
notes03      = Today, my favorite friend is $[myfriend]

$ runspec --config=x  --fakereportable | grep txt
        format: ASCII -> /tmp/result/CFP2006.002.txt
$ grep Today /tmp/result/CFP2006.002.txt
     Today, I am running fp in /spec/cpu2006 on a unix system 
     Today the flags file is /spec/cpu2006/Docs/flags/flags-advanced.xml
     Today, my favorite friend is jamiemeow

You can't use square brackets to substitute variables whose value changes during a run or build.

Wrong:

default=default=default=default:
#        I executed ''
notes0 = I executed '$[command]'

What did you expect?

Don't worry -- you'll receive a warning if you use a variable that the tools don't know about. It's up to you to heed them.

I.D.1.b During a run: $variable, ${variable}

The second round uses Perl variable interpolation. Only Perl scalars (denoted by a leading $) can be interpolated. For example, notes001 below uses the log file number (generated by the tools) and the hardware availability date (which was set directly):

$ cat tmp.cfg
runlist       = mcf
tune          = base
size          = test

iterations    = 1
output_format = asc

expand_notes  = 1
hw_avail      = May-2006
notes001      = This run is from log.$lognum with hw_avail $hw_avail

$ runspec -c tmp | grep txt
        format: ASCII -> /spec/david/result/CINT2006.029.test.txt
$ grep with ../result/*029*txt
     This run is from log.029 with hw_avail May-2006
$ 

In this case, $hw_avail could also have been substituted in the first round by writing it as $[hw_avail]. In general, for variable interpolation, the earlier the better.

To put text immediately after a variable, you need to make it possible for the parser to see the variable that you want, by using braces:

   % tail -2 tmp.cfg
   notes001 =You have done ${lognum}x runs tonight, go to bed.

   % runspec -c tmp | grep txt
      format: ASCII -> /john/result/CINT2006.103.test.txt
   % grep done /john/result/CINT2006.103.test.txt
      You have done 103x runs tonight, go to bed.

Interpolation won't always do what you wish it might do: for example, some variables are only defined at certain times, and your submit or notes line might be interpolated at a different time. When debugging a config files that uses variable interpolation, you will probably find --size test useful.

Some things that you might choose to interpolate include:

baseexe The first part of the executable name, which is <baseexe>_<tune>.<ext>. For example, in "libquantum_base.foo", baseexe is "libquantum".
benchmark The number and name of the benchmark currently being run, for example 462.libquantum
benchname The name of the benchmark currently being run, for example libquantum
benchnum The number of the benchmark currently being run, for example 462
benchtop The top directory for the benchmark currently being run, for example /spec/cpu2006/benchspec/CPU2006/462.libquantum
BIND A value from your bind list. This variable is actually interpreted by specinvoke, and cannot be spelled with braces. Say $BIND, do not say ${BIND}.
command The shell command line to run the current benchmark, for example ../run_peak_test_foo.0001/bzip2_peak.foo dryer.jpg 2 > dryer.jpg.out 2>> dryer.jpg.err
commandexe The executable for the current command, for example ../run_peak_test_foo.0001/bzip2_peak.foo
ext The extension for the benchmark being run
iter The current iteration number
logname The complete log file name, for example /spec/cpu2006/result/CPU2006.168.log
lognum The log file number, for example 168
SPECCOPYNUM The current copy number, when running a rate run. This variable is actually interpreted by specinvoke, and cannot be spelled with braces. Say $SPECCOPYNUM, do not say ${SPECCOPYNUM}.
SPECUSERNUM Do not use. This is the older, obsolete, CPU2000 spelling for what is now called SPECCOPYNUM. If you use it, it will be silently ignored - no warning is printed.
tune The tuning for the benchmark being run (base or peak)
workload The current workload number (within the iteration)

For example, let's say you want to go for minimal performance. You might want to do this with the nice command. You can say:

   submit=nice 20 '$command'

and the $command gets expanded to whatever would normally be executed but with nice 20 stuck in front of it.

If you'd like a complete list of the variables that you can use in your commands (relative to the config file you're using), set runspec's verbosity to 35 or higher (-v 35) and do a run that causes a command substitution to happen, with expand_notes=1.

I.D.1.c Example: cleaning files before a training run

Perhaps a more useful example is this one, which directs the shell to clean files related to the current executable in the temporary directory, before a training run for feedback directed optimization:

   fdo_pre0     = mkdir /tmp/pb; rm -f /tmp/pb/${baseexe}*

NOTICE in this example that although the commands are carried out by the shell, the variable substitution is done by runspec.

I.D.1.d Example: submit to multiple nodes, Tru64 Unix

The following lines submit to multiple nodes on a Compaq AlphaServer SC Series Supercomputer running Tru64 Unix:

   submit= echo "$command" > dobmk; prun -n 1 sh dobmk
   command_add_redirect=1

In this example, the command that actually runs the benchmark is written to a small file, dobmk, which is then submitted to a remote node selected by prun. The parallel run command, prun, can execute multiple copies of a process, but in this case we have requested just one copy by saying -n 1. The SPEC tools will create as many copies as required.

The command_add_redirect is crucial. What happens without it?

$ head prun1.cfg
submit= echo "$command" > dobmk; prun -n 1 sh dobmk

ext            = prun
action         = validate
runlist        = libquantum
size           = test
use_submit_for_speed = 1
iterations     = 1        
ignore_errors  = 1
output_format  = text
$ runspec -c prun1.cfg 
...
$ cd $SPEC/benchspec/CPU2006/462.libquantum/run/run_base_test_prun.0000/
$ cat dobmk 
../run_base_test_prun.0000/libquantum_base.prun 33 5
$ 

Now let's use command_add_redirect, and see how dobmk changes:

$ diff prun1.cfg prun2.cfg 
1a2
> command_add_redirect=1
$
$ runspec -c prun1.cfg 
...
$ cd $SPEC/benchspec/CPU2006/462.libquantum/run/run_base_test_prun.0000/
$ cat dobmk 
../run_base_test_prun.0000/libquantum_base.prun 33 5 > test.out 2>> test.err
$ 

Notice that with command_add_redirect=1, the substitution for $command includes both the name of the executable and the file assignments for standard in, standard out, and standard error. This is needed because otherwise the files would not be connected to libquantum on the remote node. That is, the former generates [*]:

echo "libquantum_base.prun 33 5" > dobmk; 
prun -n 1 sh dobmk > test.out 2>> test.err

And the latter generates [*]:

echo "libquantum_base.prun 33 5 > test.out 2>> test.err" > dobmk; 
prun -n 1 sh dobmk

[*] The picky reader may wish to know that the examples were editted for readability: a line wrap was added, and the directory string .../run_base_test_prun.0000/ was omitted. The advanced reader may wonder how the above lines were discovered: for the former, we found out what runspec would generate by going to the run directory and typing specinvoke -n, where -n means dry run; in the latter, we typed specinvoke -nr, where -r means that $command already has device redirection. For more information on specinvoke, see utility.html.

I.D.1.e Example: bind to processors, SPEC TurboBlaster9000

The following lines bind copies to individual processors on a SPEC TurboBlaster 9000 running *nix:

   bind= 0, 4, 8, 12, 16, 20
   submit= procbind -p $BIND $command

In this example, the list of processors to bind is set using the bind facility, which is then used as an argument to the procbind command. With these settings, the first copy will be bound to processor 0, the second to processor 4, the third to processor 8, and so on. If more than six copies are run, the list is re-used starting from the beginning; that is, copy seven would also be bound to processor 0 and so on.

An equivalent way to say the same as the above would be

   bind0= procbind -p 0
   bind1= procbind -p 4
   bind2= procbind -p 8
   bind3= procbind -p 12
   bind4= procbind -p 16
   bind5= procbind -p 20
   submit= $BIND $command

The content of each of the bind settings need not be the same, or even similar.

Two important notes about the above submit commands:

  1. $BIND must be spelled exactly as it is in the examples above. It is a limitation of the tools that saying things like ${BIND} just won't work.
  2. For bind settings that contain whitespace or commas, the second form (multiple assignments) must be used.

I.D.2. By the shell \$VARIABLE

Substitution by the shell - or by the windows command interpreter - uses backslash dollar sign. The next two sections explain why both punctuation marks are required, and then provide an example.

I.D.2.a Protecting shell variables

Because Perl variables look a lot like shell variables, you need to specially protect shell variables if you want to prevent Perl from trying to interpret them. Notice what happens with the protected and unprotected versions:

$ cat tmp.cfg
runlist              = mcf
size                 = test
tune                 = base,peak
iterations           = 1

output_format        = asc
teeout               = 1
expand_notes         = 1
use_submit_for_speed = 1

default=peak=default=default:
submit = echo "home=$HOME; spec=$SPEC;" > /tmp/chan; $command

default=base=default=default:
submit = echo "home=\$HOME; spec=\$SPEC;" > /tmp/nui; $command
$ runspec --config=tmp > /dev/null
$ cat /tmp/chan
home=; spec=;
$ cat /tmp/nui
home=/home/chris; spec=/spec/cpu2006;
$ 

In the first submit command, $HOME and $SPEC were gobbled up by runspec. But since those are not the names of variables that can be interpolated, empty strings were the result. In the second command, the backslashes prevented runspec from interpreting the variables, so they were seen by the shell instead.

By default, submit is only applied to rate runs. In this example, we used it for a speed run as well, by setting

use_submit_for_speed = 1 

in the configuration file.

I.D.2.b Example: submitting to multiple nodes, SGI Origin 2000

Here is a more complex example which uses substitution by both runspec and by the shell (the lines will be concatenated before execution):

   submit0= let "NODE=$SPECCOPYNUM/2"; 
   submit1= export NODE=/hw/nodenum/\$NODE; 
   submit2= let "CPU=2*(($SPECCOPYNUM+1)/2)-$SPECCOPYNUM "; 
   submit3= export CPU; 
   submit4= /usr/sbin/dplace -place \$SPEC/submit.pf -mustrun $command

(Note that the above example originated on an SGI Origin system where the shell uses let and dplace and other commands that might not apply to your shell.) Let's walk through how it works.

First, runspec substitutes the current copy number for $SPECCOPYNUM, and then passes the above command to the shell which does the substitutions for CPU and NODE. This example originated on an SGI Origin 2000 system, where there are two CPUs per node. Suppose that runspec is about to submit the copy for copy number 17. In that case, the above lines effectively cause::

   submit0= let "NODE=$SPECCOPYNUM/2";      # i.e. 17, so NODE=8
   submit1= export NODE=/hw/nodenum/\$NODE;      # Now NODE=/hw/nodenum/8
   submit2= let "CPU=2*(($SPECCOPYNUM+1)/2)-$SPECCOPYNUM ";  # and CPU=1
   submit3= export CPU; 
   submit4= /usr/sbin/dplace                     # So we execute dplace
            -place \$SPEC/submit.pf              # using $SPEC/submit.pf
            -mustrun $command                    # and the expected command

The desired $command is run under the control of submit.pf, with $NODE=/hw/nodenum/8 and $CPU=1. Here are the contents of the placement file, submit.pf:

   memories 1 in topology physical near $NODE
   threads 1
   run thread 0 on memory 0 using cpu $CPU

An important note about the above submit command:

I.D.3. By specmake: $(VARIABLE)

Variables with a dollar sign and parentheses, aka "round brackets", are substituted by specmake. For example:

    COMPILER_DIR=/usr/local/bin/
    CC=$(COMPILER_DIR)cc

For a more extensive example of variable substitution handled by specmake, see the SPEC CPU2000 example at www.spec.org/cpu2000/docs/example-advanced.cfg. Search that file for LIBS, and note the long comment which provides a walk-through of a complex substitution handled by specmake. Note: a CPU2006 version of that example will be provided at a later date; but the concepts, from the CPU2000 example, are expected to work in a similar fashion for CPU2006.

Deprecated feature alert: Although it is also possible to pass information to specmake using curly brackets: ${SPECMAKE}, this is not recommended. Instead, you should consistently use curly brackets to address runspec and round brackets to address specmake. It is possible that a future version of runspec may insist on interpolating curly brackets itself, rather than allowing specmake to do so.

I.D.4. Limitations on variable substitution

Once runspec hands control over to specmake or to the shell, the results of further substitution are invisible to runspec. For this reason, you can't say:

Wrong:

MYDIR         = /usr/gretchen/compilers
FC             = $(MYDIR)/f90
notes_comp_001 = compiler: $(FC)

However, there are a couple of ways to get around this restriction. The best way for global settings is to use the preprocessor:

%define MYDIR /usr/gretchen/compilers
FC             = %{MYDIR}/f90
notes_comp_001 = compiler: %{MYDIR}/f90

That leaves a little to be desired, though, doesn't it? If your Fortran compiler is changed to 'f2001', you still need to remember to change it in two places. You could of course define a whole macro for this:

%define MYFC /usr/gretchen/compilers/f90
FC             = %{MYFC}
notes_comp_001 = compiler: %{MYFC}

But what if you have a config file where FC might be set in multiple places, and you really want to know how it was set right here? In that case, use a combination of the preprocessor and variable substitution:

$ cat right_here.cfg 
%define MYDIR /usr/gretchen/compilers

default=base:
FC              = %{MYDIR}/f2001
notes_comp_001  = For base, we used this Fortran: $[FC] 

410.bwaves=peak:
FC             = %{MYDIR}/f77
notes_comp_002 = For 410.bwaves peak, we used this Fortran: $[FC]

$ runspec -c right_here.cfg --fakereportable fp | grep txt       
        format: ASCII -> /usr/gretchen/spec/result/CFP2006.179.txt
$ tail -15 ../result/*179.txt

                          Compiler Invocation Notes
                          -------------------------
     For base, we used this Fortran: /usr/gretchen/compilers/f2001 
     For 410.bwaves peak, we used this Fortran: /usr/gretchen/compilers/f77

    SPEC and SPECfp 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 webmaster@spec.org.
Copyright 2006 Standard Performance Evaluation Corporation
Generated on Wed Aug  2 09:39:53 2006 by SPEC CPU2006 ASCII formatter v4626
$ 

I.D.5. Unsetting a variable with "%undef%"

It is sometimes useful to be able to undo the setting of a variable that is defined in a lower-precedence section. This is easily accomplished using the special value '%undef%':

  $ cat gnana.cfg
   teeout = yes
   action = build
   runlist = bzip2

   default=default:
   OPTIMIZE = -O
   COPTIMIZE = -fast

   401.bzip2=peak:
   COPTIMIZE = %undef%

   $ runspec --config=gnana --tune=base | grep bzip2.c
   cc -c -o bzip2.o -DSPEC_CPU -DNDEBUG   -O -fast                bzip2.c
   $ runspec --config=gnana --tune=peak | grep bzip2.c
   cc -c -o bzip2.o -DSPEC_CPU -DNDEBUG   -O                 bzip2.c
   $ go bzip
   /spec/gnana/kit91/benchspec/CPU2006/401.bzip2
   $ cd run/build_peak_none.0000/
   $ grep OPT Make*
   Makefile.spec:COPTIMIZE        = 
   Makefile.spec:OPTIMIZE         = -O

As you can see in the peak compilation, the '-fast' flag was not present because the setting for COPTIMIZE had been deleted.

II. Config file options for runspec

This section documents options that control the operation of runspec itself.

II.A. Precedence: config file vs. runspec command line

In the list that follows, some items are linked to runspec.html, because they can be specified either in a config file, or on the runspec command line.

If options can be specified on both the runspec command line and in a config file, the command line will win vs. items specified in the header section, but will not win over items specified in named sections. Effectively, the order of precedence is:

   named sections (highest)
   command line
   header section (lowest)

For an example of these precedence rules in action, see section VI.E. on --feedback

II.B. Options

In the table that follows, the "Use In" column indicates where the option can be used:

H use only in header section
N use in a named section.
H,N can be used in both the header section and in named sections. The item can therefore be applied on a global basis, and/or can be applied to individual benchmarks.
Option Use In Default Meaning
action H validate What to do.
allow_extension_override H 0

The runspec command can use --extension to select among different options in a config file, as mentioned above. But what if the extension mentioned on the runspec command does not occur in any section marker? What should be done then?

  • If allow_extension_override is 0 (or no or false), the tools will print an error message and exit.
  • If allow_extension_override is 1 (or yes or true), then the tools will attempt to build (or run) the same binary they would have built by default, but will name the binary with specified extension. See the example above.

The allow_extension_override feature is new with CPU2006.

backup_config H 1 When updating the MD5 hashes in the config file, make a backup copy first. Highly recommended to defend against full-file-system errors, system crashes, or other unfortunate events.
basepeak H,N 0 Use base binary and/or base result for peak. If applied to the whole suite (in the header section), then only base is run, and its results are reported for both the base and peak metrics. If applied to a single benchmark, the same binary will be used for both base and peak runs, and the median of the base run will be reported for both.
Option Use In Default Meaning
bind H,N ''

List of values with which $BIND should be replaced in a submit command. This can be a simple comma (or white-space) separated list, such as:

bind = 0,1,2,3,4,5,6,7, 16,17,18,19,20,21,22,23     

If your line is too long, don't try to continue it by adding a numeral to 'bind'; that has a different meaning, as described a little below. Instead, you can continue it either by putting a backslash at the end of lines, or by using a here document. The above single line could equally well be expressed as:

bind = <<EOT
0,   1,   2,   3,   4,   5,   6,   7,
16, 17,  18,  19,  20,  21,  22,  23        
EOT

Note above that the trailing comma after the "7" is both optional and harmless. It can be present or not, as you wish; in either case, the sequence of values for this example will be 6, 7, 16, 17.

The bind values do not have to be a simple number. You can also use it to substitute longer strings that themselves contain whitespace or commas. To do so, use the format

bindN = string 

The example that follows effectively assigns 1 copy to processor 1, and 3 copies to processor 0.

bind0 = taskset -c 1 
bind1 = taskset -c 0 
bind2 = taskset -c 0 
bind3 = taskset -c 0 

submit    = $BIND $command

Like notes, the indices are not important and are used for ordering only.

If there are more copies than bind values, they will be re-used in a circular fashion. If there are more bind values specified than copies, then only as many as needed will be used. The bind feature is new with CPU2006. In addition, the ability to change bind on a per-benchmark basis is new with CPU2006 V1.1.

Option Use In Default Meaning
build_in_build_dir H 1

When set, put build directories in a subdirectory named

benchspec/CPU2006/nnn.benchmark/build/build... (Unix) or
benchspec\CPU2006\nnn.benchmark\build\build... (Windows)

Specifying '0' will cause the build directories to be the same as in CPU2006 V1.0:

benchspec/CPU2006/nnn.benchmark/run/build... (Unix)
benchspec\CPU2006\nnn.benchmark\run\build... (Windows)

Why are build directories separated? Benchmarks are now built in directories named nnn.benchmark/build rather than under the benchmark's run subdirectory in order to make it easier to copy, backup, or delete build and run directories separately from each other. It may also make problem diagnosis easier in some situations, since your habit of removing all the run directories will no longer destroy essential evidence 10 minutes before the compiler developer says "Wait - what exactly happened at build time?".

If you prefer the V1.0 behavior, you can revert to it by setting build_in_build_dir to 0.

The build_in_build_dir feature is new with CPU2006 V1.1.

check_md5 H 1

Runspec uses MD5 hashes to verify that executables match the config file that invokes them, and if they do not, runspec forces a recompile. You can turn that feature off by setting check_md5=0.

Warning: It is strongly recommended that you keep this option at its default, '1' (that is, enabled). If you disable this feature, you effectively say that you are willing to run a benchmark even if you don't know what you did or how you did it -- that is, you lack information as to how it was built!

The feature can be turned off because it may be useful to do so sometimes when debugging (for an example, see env_vars, below), but it should not be routinely disabled.

Since SPEC requires that you disclose how you build benchmarks, reportable runs (using the command-line switch --reportable or config file setting reportable=1) will cause check_md5 to be automatically enabled.

check_version H 0 (1 for
reportable
runs)

When set, before doing a reportable run, runspec will download a small file (~15 bytes) from www.spec.org containing the current version of the suite and the date it was released, and check your copy vs. that file. In this way, you can be notified if the version of the suite that you're using is out-of-date.

Setting this variable to 0 will disable this check.

If you'd like to check a local file instead, you can modify version_url to point to your internal copy.

If you would like to check your version for a NON-reportable run, you will need to add --check_version to your command line. Setting check_version=1 in the config file only causes the check for reportable runs. The check_version feature is new with CPU2006.

command_add_redirect H 0 If set, the generated $command will include redirection operators (stdout, stderr), which are passed along to the shell that executes the command. If this variable is not set, specinvoke does the redirection itself. This option is commonly used when using the submit command; please see the example in section I.D.1.d.
Option Use In Default Meaning
copies H,N 1

Number of copies. For base, the number of copies must be the same for all benchmarks, but for peak it is allowed to vary: for example, you could decide to run 64 copies of all benchmarks except 458.sjeng, which would run only 63.

SPEC CPU2006 V1.1 note: if you select basepeak=1 for a benchmark, the number of copies in peak will be forced to be the same as in base. In SPEC CPU2006 V1.0, selection of the number of copies could differ, but this was deemed to be an error. If you want to run the same tuning in both base and peak, while changing the number of copies, you will need to build two binaries with the same compiler switches.

delay H,N 0 Insert a delay of the specified number of seconds before and after benchmark execution. This delay does not contribute to the measured runtime of the benchmark. This delay is also not available in a reportable run. (The delay feature is new with CPU2006.)
deletework H,N 0 If set to 1, always delete existing benchmark working directories. An extra-careful person might want to set this to ensure no unwanted leftovers from previous benchmark runs, but the tools are already trying to enforce that property.
difflines H,N 10 Number of lines of differences to print when comparing results.
Option Use In Default Meaning
env_vars H,N 0

If this variable is set to 1, then environment settings can be changed for benchmarks using ENV_* options in the config file. For example, consider the following executable, which fails because the library directory has been removed:

$ ls -l bwaves_base.tmp3
-rwxrwxr-x  1 david ptg 304964 May 16 9:16 bwaves_base.tmp
$ ldd bwaves_base.tmp | head -3
       libmvec.so.1 =>  /lib/libmvec.so.1
       libfui.so.2 =>   (file not found)
       libfai.so.3 =>   (file not found)
$ 

But if we add the following to the config file:

check_md5=0
env_vars=1
410.bwaves:
ENV_LD_LIBRARY_PATH=/spec/david/lovecraft/lib

then bwaves gets an LD_LIBRARY_PATH which points to the new library directory, and the benchmark runs successfully. (The addition of check_md5=0 allows us to change the settings for 410.bwaves without triggering a rebuild.)

Note that env_vars is not legal for a reportable run. The run rules require that the environment be set prior to the start of runspec. Nevertheless, the feature is available, since it might be useful during debugging, or for instrumentation purposes when doing performance analysis.

If you are trying to do a reportable run, perhaps the preenv feature is what you're looking for.

Which environment? If you are attempting to communicate settings from your shell environment into runspec, this is not the feature that you are looking for. Try the config file preprocessor instead. The env_vars option and ENV* are about communication from the config file to the environment of the invoked benchmark.

When developing a config file that uses env_vars, you may find it useful to set the verbosity level to 35 (or higher), which will cause the tools to log environment settings. CPU2006 newly provides logging of env_vars settings.

expand_notes H 0 If set, will expand variables in notes. This capability is limited because notes are NOT processed by specmake, so you cannot do repeated substitutions. You'll find some suggestions above.
expid H If set to a non-empty value, will cause executables, run directories, results, and log files to be put in a subdirectory (with the same name as the value set) in their normal directories. For example, setting expid = CDS will cause benchmark binaries to end up in exe/CDS, run directories to end up in run/CDS, and results and logs in $SPEC/result/CDS. The expid feature is new with CPU2006.
ext H none Extension for executables created. This may not be set to any value that contains characters other than alphanumerics, underscores, hyphens, or periods.
Option Use In Default Meaning
fail H,N 0 If set, will cause a build or run to fail. The ability to force a run to fail is new with CPU2006
fail_build H,N 0

If set, will cause a build to fail. For example, you could say something like this:

400.perlbench=default:
#> I am posting this config file for use by others in the
#> company, but am forcing it to fail here because
#> I want to force users to review this section.
#>
#> Once you find your way here, you should test whether
#> bug report 234567 has been fixed, by using the first
#> line below.  If it has not been fixed, then use the
#> second.  In either case, you'll need to remove the
#> fail_build.
#>
#>   - Pney Guvaxre
#>     Boomtime, the 66th day of Confusion in the YOLD 3172

# OPTIMIZE = -Osuperduper
# OPTIMIZE = -Omiddling
fail_build = 1

In the example above, the build is forced to fail until the user examines and modifies that section of the config file. Notice that Pney has used protected comments to cause the comments about the internal bug report to disappear if the config file were to be published as part of a reportable run.

The ability to force a build to fail is new with CPU2006
fail_run H,N 0 If set, will cause a run to fail. The ability to force a run to fail is new with CPU2006
feedback H,N 1

The feedback option applies an on/off switch for the use of feedback directed optimization (FDO), without specifying how the feedback will be done.

  • If set to 0, then feedback will not be used, even if other options would normally cause it to occur.
  • If set to 1, then feedback is allowed to be used, provided that additional options are also set to describe how the FDO build should be carried out.

The interaction between feedback and these other options is described in section VI, below.

Option Use In Default Meaning
flagsurl H none If set, retrieve the named URL or filename and use that as the "user" flags file. If the special value "noflags" is used, runspec will not use any file and (if formatting previously run results) will remove any stored file. Automated prcoessing of flags is new with CPU2006, and is explained in flag-description.html.
http_proxy H

In some cases, such as when doing version checks and loading flag description files, runspec will use HTTP or FTP to fetch a file. If you need to specify the URL of a proxy server, this is the variable to use. By default, no proxy is used. Note that this setting will override the value of the http_proxy environment variable. For example, one might set:

http_proxy = http://webcache.tom.spokewrenchdad.com:8080 

Note: if an FTP proxy is needed, it must be set in the ftp_proxy environment variable; there is no corresponding config file setting.

Config files as posted at www.spec.org/cpu2006 will not include whatever you put on this line. Support for http proxies is new with CPU2006.

http_timeout H 30 This is the amount of time (in seconds) to wait while attempting to fetch a file via HTTP or FTP. If the connection cannot be established in this amount of time, the attempt will be aborted. Support for http timeout is new with CPU2006.
ignore_errors H 0 Ignore certain errors which would otherwise cause the run to stop. Very useful when debugging a new compiler and new set of options: with this option set, you'll find out about all the benchmarks that have problems, instead of only finding out about the first one.
ignore_sigint H 0 Ignore SIGINT. If this is set, runspec will attempt to continue running when you interrupt one of its child processes by pressing ^C (assuming that you have ^C mapped in the common way). Note that this does NOT cause runspec itself to ignore SIGINT.
Option Use In Default Meaning
info_wrap_columns H 50 When set to a value greater than 0, attempts to split non-notes informational lines such that they are no longer than info_wrap_columns columns wide. Lines are split on whitespace, and newly created lines are guaranteed to have at least the same indentation as the original line. If a line contains an item that is longer than info_wrap_columns, a warning is logged and the original line is left unchanged. Automatic line wrapping is a new feature of CPU2006.
inherit_from N ''

If set within a benchmark section, allows explicit inheritance of settings from another benchmark's section. The section to be inherited from is referenced using colons between the four section specifiers. Other inheritance mechanisms continue to work. Effectively, the referenced benchmark is the second highest priority -- second only to items specifically mentioned in the referring section. An example may help to clarify these points:

$ cat -n tmp.cfg
     1  iterations = 1
     2  size       = test
     3  teeout     = yes
     4
     5  default=default:
     6  OPTIMIZE = -xO1 
     7
     8  int=default:
     9  OPTIMIZE = -xO2
    10  LIBS     = -lbsdmalloc
    11
    12  401.bzip2=default:
    13  OPTIMIZE = -xO3 
    14  CC = /update1/cc
    15
    16  458.sjeng=peak:
    17  inherit_from = 401.bzip2:default:default:default
    18  CC = /update2/cc
$ runspec --config tmp --tune base sjeng | grep sjeng.o
cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG   -xO2        sjeng.c
cc  -xO2       attacks.o book.o ...  -lbsdmalloc  -o sjeng
$ runspec --config tmp --tune peak sjeng | grep sjeng.o
/update2/cc -c -o sjeng.o -DSPEC_CPU -DNDEBUG -xO3 sjeng.c
/update2/cc -xO3 attacks.o book.o ... -lbsdmalloc -o sjeng

In the above example,

  • The first runspec command uses the tuning for integer benchmarks, from the config file lines 8-10.
  • The second runspec command:
    • Still applies the integer tuning at line 10 (-lbsdmalloc).
    • Does not apply the optimization level on line 9, because it is overridden by other options. Line 17 says that we are to inherit from the bzip2 section, so the optimization level at line 13 (-xO3) is used instead.
    • But the compiler path at line 14 (/update1) is not used: line 18 (/update2) is highest priority.

Line 17 above could have been simplified. Just as trailing default section specifiers can be omitted at the original definition points, as explained above, they can also be omitted on an inherit_from option. The inherit_from feature is new with SPEC CPU2006.

Option Use In Default Meaning
iterations H 3 Number of iterations to run.
keeptmp H 0

Whether or not to keep various temporary files. If you leave keeptmp at its default setting, temporary files will be automatically deleted after a successful run. If not, temporary files may accumulate at a prodigious rate, and you should be prepared to clean them by hand. Temporary files include:

  • CPU2006.nnn.log.debug in your result directory ($SPEC/result, %SPEC%\result, or the corresponding location under your output_root).

  • A directory named tmp under your top level SPEC directory, or under your output_root.

  • If tmp is not usable, you might find temporaries under tmp.cpu2006 or, possibly, tmp.cpu2006.n, where n may range from 1 to 15.

The keeptmp feature is new with SPEC CPU2006 V1.1.

line_width H 0 Line wrap width for screen. If left at the default, 0, then lines will not be wrapped and may be arbitrarily long.
locking H 1 Try to use file locking to avoid race conditions, e.g. if more than one copy of runspec is in use. Although performance tests are typically done with only one copy of runspec active, it can be handy to run multiple copies if you are just testing for correctness, or if you are compiling the benchmarks.
log_line_width H 0 Line wrap width for logfiles. If your editor complains about lines being too long when you look at logfiles, try setting this to some reasonable value, such as 80 or 132. If left at the default, 0, then lines will not be wrapped and may be arbitrarily long.
log_timestamp H 0 Whether or not to prepend time stamps to log file lines. The log_timestamp feature is new in CPU2006 V1.1
Option Use In Default Meaning
mach H default   Default machine ID. This may not be set to any value that contains characters other than alphanumerics, underscores, hyphens, or periods.
mailcompress H 0 When using the 'mail' output format, turning this on will cause the various report attachments to be compressed with gzip. Report mailing is a new feature of CPU2006.
mailmethod H smtp When using the 'mail' output format, this specifies the method that should be used to send the mail. On UNIX and UNIX-like systems, there are three choices: 'smtp' (communicate directly with an SMTP server over the network), 'mail' (try using mail(1) if available), and 'sendmail' (try invoking sendmail directly). On Windows systems, only 'smtp' is available. SMTP is the recommended setting. Report mailing is a new feature of CPU2006.
mailport H 25 When using the 'mail' output format, and when the mailmethod is 'smtp', this specifies the port to use on the mail server. The default is the standard SMTP port and should not be changed. Report mailing is a new feature of CPU2006.
mailserver H 127.0.0.1 When using the 'mail' output format, and when the mailmethod is 'smtp', this specifies the IP address or hostname of the mailserver through which to send the results. Report mailing is a new feature of CPU2006.
Option Use In Default Meaning
mailto H ''

The address or addresses to which results should be sent when using the 'mail' output format. If multiple addresses are specified, they should be separated by commas or whitespace. Each address should consist only of the name@domain part (i.e. no "full name" type info). The addresses are not checked for correct formatting; if a mistake is made, the results may be sent to an unknown location. Think: comp.arch. OK, probably not there, but seriously be careful about security on this one.

Config files as posted at www.spec.org/cpu2006 will not include whatever you put on this line (thus, spambots will not see the contents of this field).

Note that to get your reports mailed to you, you need to specify both mail as an output_format and an address to which they should be mailed. For example:

   mailto=fast.guy@welovebenchmarks.org
   output_format=text,mail

If no addresses are specified, no mail will be sent. Report mailing is a new feature of CPU2006.

mail_reports H all The list of report types to mail. The format and possible values are the same as for output_format, with the addition of log, which will cause the current log file to be sent. The default is for all files associated with the run to be mailed (so, this will include what you listed as your desired output_format plus log (the log file) and rsf (the rawfile). You can cut your email down to the bare essentials with something like this:
   mailto=fast.guy@welovebenchmarks.org
   output_format=text,mail
   mail_reports=text
If none of the requested report types were generated, no mail will be sent. Report mailing is a new feature of CPU2006.
make H,N specmake Name of make executable. Note that the tools will enforce use of specmake for reportable results.
Option Use In Default Meaning
make_no_clobber H,N 0 Don't delete directories when building executables. This option should only be used for troubleshooting a problematic compile. The tools will not allow you to use this option when building binaries for a reportable result. Note that you could issue multiple successive runspec commands with this option set (either in the config file, or with the --make_no_clobber switch), and the build directories will be preserved. But once you remove make_no_clobber (allowing it to default back to 0), then the tools will attempt a normal build with a fresh build directory.
makeflags H,N ''

Extra flags for make (such as -j). Set this to -j n where n is the number of concurrent processes to run during a build. Omitting n or setting it to zero unlimits the number of jobs that will be run in parallel. (Use of -j in conjunction with ONESTEP will still result in successful builds, but they will be necessarily serialized unless your compiler implements the parallelism itself.) Use with care! Other flags should be used here only if you are familiar with GNU make.

Note that requesting a parallel build with makeflags = -j N causes multiple processors to be used at build time. It has no effect on whether multiple processors are used at run time, and so does not affect how you report on parallelism.

New with CPU2006 V1.1: you can now use makeflags on Microsoft Windows

max_active_compares   H,N # copies Max number of compares to run simultaneously while checking that the benchmarks computed acceptable answers. Useful when doing large SPECrate runs on a system with lots of CPUs.
mean_anyway H 0 Calculate mean even if invalid. DANGER: this will write a mean to all reports even if no valid mean can be computed (e.g. half the benchmarks failed). A mean from an invalid run is not "reportable" (that is, it cannot be represented in public as the SPEC metric).
minimize_rundirs H 0 Try to keep working disk size down. Cannot be used in a reportable run.
minimize_builddirs H 0 Try to keep working disk size down during builds.
Option Use In Default Meaning
nobuild H 0 Do not attempt to build benchmarks. Useful to prevent attempts to rebuild benchmarks that cannot be built. Also comes in handy when testing whether proposed config file options would potentially force an automatic rebuild. The --nobuild feature is new with CPU2006.
no_monitor H,N '' Exclude the listed workloads from monitoring via the various monitor_* hooks. The no_monitor feature is new with CPU2006.
no_input_handler H,N close

Method to use to simulate an empty input. Choices are:

  • close - Just close stdin before executing the benchmark (this is the default).
  • zero - Create a zero-length file and attach it to stdin.
  • file - Synonym for zero.
  • null - Open the null device (/dev/null or NUL:) and attach it to stdin.

Normally, this option should be left at the default; it was actually added to the tools for the benefit of a different SPEC suite that needed the feature. If a reportable run for CPU2006 uses this feature, an explanation should be provided as to why it was used. The no_input_handler feature is new in CPU2006.

notes_wrap_columns H 0 When set to a value greater than 0, attempts to split notes lines such that they are no longer than notes_wrap_columns columns wide. Lines are split on whitespace, and newly created lines are guaranteed to have at least the same indentation as the original line. If a line contains an item that is longer than notes_wrap_columns, a warning is logged and the original line is left unchanged. Automatic line wrapping is a new feature of CPU2006.
notes_wrap_indent H ' ' When line wrapping is enabled (see notes_wrap_columns), this is the string that will be prepended to newly created lines after the indentation from the original line is applied. The default is four spaces, but it can be set to any arbitrary string. Automatic wrapping is a new feature of CPU2006.
Option Use In Default Meaning
output_format H all Format for reports. Valid options are listed at runspec.html under --output_format; major options include txt (ASCII text), html, pdf, and ps. You might prefer to set this to txt if you're going to be doing lots of runs, and only create the pretty reports at the end of the series. See also the information in runspec.html about --rawformat.
output_root H

When set to a non-empty value, causes