Skip to content

Commit

Permalink
STREAM + numactl
Browse files Browse the repository at this point in the history
  • Loading branch information
thomas committed Sep 19, 2024
1 parent 0725407 commit 0f967f1
Show file tree
Hide file tree
Showing 10 changed files with 1,430 additions and 0 deletions.
3 changes: 3 additions & 0 deletions STREAM/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
*.o
stream_c
stream_f
152 changes: 152 additions & 0 deletions STREAM/HISTORY.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
-------------------------------------------------------------------------

Revisions as of Thu, Jan 17, 2013 3:50:01 PM

Version 5.10 of stream.c has been released.
This version includes improved validation code and will automatically
use 64-bit array indices on 64-bit systems to allow very large arrays.

-------------------------------------------------------------------------

Revisions as of Thu Feb 19 08:16:57 CST 2009

Note that the codes in the "Versions" subdirectory should be
considered obsolete -- the versions of stream.c and stream.f
in this main directory include the OpenMP directives and structure
for creating "TUNED" versions.

Only the MPI version in the "Versions" subdirectory should be
of any interest, and I have not recently checked that version for
errors or compliance with the current versions of stream.c and
stream.f.

I added a simple Makefile to this directory. It works under Cygwin
on my Windows XP box (using gcc and g77).

A user suggested a sneaky trick for "mysecond.c" -- instead of using
the #ifdef UNDERSCORE to generate the function name that the Fortran
compiler expects, the new version simply defines both "mysecond()"
and "mysecond_()", so it should automagically link with most Fortran
compilers.

-------------------------------------------------------------------------

Revisions as of Wed Nov 17 09:15:37 CST 2004

The most recent "official" versions have been renamed "stream.f" and
"stream.c" -- all other versions have been moved to the "Versions"
subdirectory.

The "official" timer (was "second_wall.c") has been renamed "mysecond.c".
This is embedded in the C version ("stream.c"), but still needs to be
externally linked to the FORTRAN version ("stream.f").

-------------------------------------------------------------------------

Revisions as of Tue May 27 11:51:23 CDT 2003

Copyright and License info added to stream_d.f, stream_mpi.f, and
stream_tuned.f


-------------------------------------------------------------------------

Revisions as of Tue Apr 8 10:26:48 CDT 2003

I changed the name of the timer interface from "second" to "mysecond"
and removed the dummy argument in all versions of the source code (but
not the "Contrib" versions).


-------------------------------------------------------------------------

Revisions as of Mon Feb 25 06:48:14 CST 2002

Added an OpenMP version of stream_d.c, called stream_d_omp.c. This is
still not up to date with the Fortran version, which includes error
checking and advanced data flow to prevent overoptimization, but it is
a good start....


-------------------------------------------------------------------------

Revisions as of Tue Jun 4 16:31:31 EDT 1996

I have fixed an "off-by-one" error in the RMS time calculation in
stream_d.f. This was already corrected in stream_d.c. No results are
invalidated, since I use minimum time instead of RMS time anyway....

-------------------------------------------------------------------------

Revisions as of Fri Dec 8 14:49:56 EST 1995

I have renamed the timer routines to:
second_cpu.c
second_wall.c
second_cpu.f

All have a function interface named 'second' which returns a double
precision floating point number. It should be possible to link
second_wall.c with stream_d.f without too much trouble, though the
details will depend on your environment.

If anyone builds versions of these timers for machines running the
Macintosh O/S or DOS/Windows, I would appreciate getting a copy.

To clarify:
* For single-user machines, the wallclock timer is preferred.
* For parallel machines, the wallclock timer is required.
* For time-shared systems, the cpu timer is more reliable,
though less accurate.


-------------------------------------------------------------------------

Revisions as of Wed Oct 25 09:40:32 EDT 1995

(1) NOTICE to C users:

stream_d.c has been updated to version 4.0 (beta), and
should be functionally identical to stream_d.f

Two timers are provided --- second_cpu.c and second_wall.c
second_cpu.c measures cpu time, while second_wall.c measures
elapsed (real) time.

For single-user machines, the wallclock timer is preferred.
For parallel machines, the wallclock timer is required.
For time-shared systems, the cpu timer is more reliable,
though less accurate.

(2) cstream.c has been removed -- use stream_d.c

(3) stream_wall.f has been removed --- to do parallel aggregate
bandwidth runs, comment out the definition of FUNCTION SECOND
in stream_d.f and compile/link with second_wall.c

(4) stream_offset has been deprecated. It is still here
and usable, but stream_d.f is the "standard" version.
There are easy hooks in stream_d.f to change the
array offsets if you want to.

(5) The rules of the game are clarified as follows:

The reference case uses array sizes of 2,000,000 elements
and no additional offsets. I would like to see results
for this case.

But, you are free to use any array size and any offset
you want, provided that the arrays are each bigger than
the last-level of cache. The output will show me what
parameters you chose.

I expect that I will report just the best number, but
if there is a serious discrepancy between the reference
case and the "best" case, I reserve the right to report
both.

Of course, I also reserve the right to reject any results
that I do not trust....
--
John D. McCalpin, Ph.D.
[email protected]
34 changes: 34 additions & 0 deletions STREAM/LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
*=======================================================================
*-----------------------------------------------------------------------
* Copyright 1991-2003: John D. McCalpin
*-----------------------------------------------------------------------
* License:
* 1. You are free to use this program and/or to redistribute
* this program.
* 2. You are free to modify this program for your own use,
* including commercial use, subject to the publication
* restrictions in item 3.
* 3. You are free to publish results obtained from running this
* program, or from works that you derive from this program,
* with the following limitations:
* 3a. In order to be referred to as "STREAM benchmark results",
* published results must be in conformance to the STREAM
* Run Rules, (briefly reviewed below) published at
* http://www.cs.virginia.edu/stream/ref.html
* and incorporated herein by reference.
* As the copyright holder, John McCalpin retains the
* right to determine conformity with the Run Rules.
* 3b. Results based on modified source code or on runs not in
* accordance with the STREAM Run Rules must be clearly
* labelled whenever they are published. Examples of
* proper labelling include:
* "tuned STREAM benchmark results"
* "based on a variant of the STREAM benchmark code"
* Other comparable, clear and reasonable labelling is
* acceptable.
* 3c. Submission of results to the STREAM benchmark web site
* is encouraged, but not required.
* 4. Use of this program or creation of derived works based on this
* program constitutes acceptance of these licensing restrictions.
* 5. Absolutely no warranty is expressed or implied.
*-----------------------------------------------------------------------
22 changes: 22 additions & 0 deletions STREAM/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
CC = gcc
CFLAGS = -Ofast -march=native -mtune=native -fopenmp -D STREAM_ARRAY_SIZE=400000000

FC = gfortran
FFLAGS = -Ofast -march=native -mtune=native -fopenmp -D STREAM_ARRAY_SIZE=400000000

all: stream_f stream_c

stream_f: stream.f mysecond.o
$(CC) $(CFLAGS) -c mysecond.c
$(FC) $(FFLAGS) -c stream.f
$(FC) $(FFLAGS) stream.o mysecond.o -o stream_f

stream_c: stream.c
$(CC) $(CFLAGS) stream.c -o stream_c

clean:
rm -f stream_f stream_c *.o

# an example of a more complex build line for the Intel icc compiler
stream.icc: stream.c
icc -O3 -xCORE-AVX2 -ffreestanding -qopenmp -DSTREAM_ARRAY_SIZE=80000000 -DNTIMES=20 stream.c -o stream.omp.AVX2.80M.20x.icc
110 changes: 110 additions & 0 deletions STREAM/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
===============================================

STREAM is the de facto industry standard benchmark
for measuring sustained memory bandwidth.

Documentation for STREAM is on the web at:
http://www.cs.virginia.edu/stream/ref.html

===============================================
NEWS
===============================================
UPDATE: October 28 2014:

"stream_mpi.c" released in the Versions directory.

Based on Version 5.10 of stream.c, stream_mpi.c
brings the following new features:
* MPI implementation that *distributes* the arrays
across all MPI ranks. (The older Fortran version
of STREAM in MPI *replicates* the arrays across
all MPI ranks.)
* Data is allocated using "posix_memalign"
rather than using static arrays. Different
compiler flags may be needed for both portability
and optimization.
See the READ.ME file in the Versions directory
for more details.
* Error checking and timing done by all ranks and
gathered by rank 0 for processing and output.
* Timing code uses barriers to ensure correct
operation even when multiple MPI ranks run on
shared memory systems.

NOTE: MPI is not a preferred implementation for
STREAM, which is intended to measure memory
bandwidth in shared-memory systems. In stream_mpi,
the MPI calls are only used to properly synchronize
the timers (using MPI_Barrier) and to gather
timing and error data, so the performance should
scale linearly with the size of the cluster.
But it may be useful, and was an interesting
exercise to develop and debug.

===============================================
UPDATE: January 17 2013:

Version 5.10 of stream.c is finally available!

There are no changes to what is being measured, but
a number of long-awaited improvements have been made:

* Updated validation code does not suffer from
accumulated roundoff error for large arrays.
* Defining the preprocessor variable "VERBOSE"
when compiling will (1) cause the code to print the
measured average relative absolute error (rather than
simply printing "Solution Validates", and (2) print
the first 10 array entries with relative error exceeding
the error tolerance.
* Array index variables have been upgraded from
"int" to "ssize_t" to allow arrays with more
than 2 billion elements on 64-bit systems.
* Substantial improvements to the comments in
the source on how to configure/compile/run the
benchmark.
* The proprocessor variable controlling the array
size has been changed from "N" to "STREAM_ARRAY_SIZE".
* A new preprocessor variable "STREAM_TYPE" can be
used to override the data type from the default
"double" to "float".
This mechanism could also be used to change to
non-floating-point types, but several "printf"
statements would need to have their formats changed
to accomodate the modified data type.
* Some small changes in output, including printing
array sizes is GiB as well as MiB.
* Change to the default output format to print fewer
decimals for the bandwidth and more decimals for
the min/max/avg execution times.


===============================================
UPDATE: February 19 2009:

The most recent "official" versions have been renamed
"stream.f" and "stream.c" -- all other versions have
been moved to the "Versions" subdirectory and should be
considered obsolete.

The "official" timer (was "second_wall.c") has been
renamed "mysecond.c". This is embedded in the C version
("stream.c"), but still needs to be externally linked to
the FORTRAN version ("stream.f"). The new version defines
entry points both with and without trailing underscores,
so it *should* link automagically with any Fortran compiler.

===============================================

STREAM is a project of "Dr. Bandwidth":
John D. McCalpin, Ph.D.
[email protected]

===============================================

The STREAM web and ftp sites are currently hosted at
the Department of Computer Science at the University of
Virginia under the generous sponsorship of Professor Bill
Wulf and Professor Alan Batson.

===============================================
27 changes: 27 additions & 0 deletions STREAM/mysecond.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* A gettimeofday routine to give access to the wall
clock timer on most UNIX-like systems.
This version defines two entry points -- with
and without appended underscores, so it *should*
automagically link with FORTRAN */

#include <sys/time.h>

double mysecond()
{
/* struct timeval { long tv_sec;
long tv_usec; };
struct timezone { int tz_minuteswest;
int tz_dsttime; }; */

struct timeval tp;
struct timezone tzp;
int i;

i = gettimeofday(&tp,&tzp);
return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 );
}

double mysecond_() {return mysecond();}

Loading

0 comments on commit 0f967f1

Please sign in to comment.