-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
thomas
committed
Sep 19, 2024
1 parent
0725407
commit 0f967f1
Showing
10 changed files
with
1,430 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
*.o | ||
stream_c | ||
stream_f |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
*----------------------------------------------------------------------- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
|
||
=============================================== |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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();} | ||
|
Oops, something went wrong.