From 9bad3340b63ed97f188d6313e073d569c58718c1 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Sat, 29 Jun 2019 10:25:36 +0200 Subject: [PATCH] Add MemoryHierarchy benchmark --- MemoryHierarchy/Makefile | 45 ++++++ MemoryHierarchy/bench.pl | 33 ++++ MemoryHierarchy/src/affinity.c | 89 +++++++++++ MemoryHierarchy/src/affinity.h | 36 +++++ MemoryHierarchy/src/allocate.c | 58 +++++++ MemoryHierarchy/src/allocate.h | 33 ++++ MemoryHierarchy/src/likwid_markers.h | 44 ++++++ MemoryHierarchy/src/main.c | 216 +++++++++++++++++++++++++++ MemoryHierarchy/src/striad_seq.c | 57 +++++++ MemoryHierarchy/src/striad_tp.c | 62 ++++++++ MemoryHierarchy/src/striad_ws.c | 57 +++++++ MemoryHierarchy/src/timing.c | 49 ++++++ MemoryHierarchy/src/timing.h | 35 +++++ 13 files changed, 814 insertions(+) create mode 100644 MemoryHierarchy/Makefile create mode 100755 MemoryHierarchy/bench.pl create mode 100644 MemoryHierarchy/src/affinity.c create mode 100644 MemoryHierarchy/src/affinity.h create mode 100644 MemoryHierarchy/src/allocate.c create mode 100644 MemoryHierarchy/src/allocate.h create mode 100644 MemoryHierarchy/src/likwid_markers.h create mode 100644 MemoryHierarchy/src/main.c create mode 100644 MemoryHierarchy/src/striad_seq.c create mode 100644 MemoryHierarchy/src/striad_tp.c create mode 100644 MemoryHierarchy/src/striad_ws.c create mode 100644 MemoryHierarchy/src/timing.c create mode 100644 MemoryHierarchy/src/timing.h diff --git a/MemoryHierarchy/Makefile b/MemoryHierarchy/Makefile new file mode 100644 index 0000000..3753fcc --- /dev/null +++ b/MemoryHierarchy/Makefile @@ -0,0 +1,45 @@ +#CONFIGURE TOOL CHAIN +CC = gcc +OPENMP =# -fopenmp +#CFLAGS = -O3 -xHost -qopt-zmm-usage=high -std=c99 $(OPENMP) +CFLAGS = -O3 -std=c99 $(OPENMP) +LFLAGS = $(OPENMP) +DEFINES = -D_GNU_SOURCE +#DEFINES += -DVERBOSE +#DEFINES += -DLIKWID_PERFMON +DEFINES += -DNTIMES=5 +DEFINES += -DARRAY_ALIGNMENT=64 + +#CONFIGURE BUILD SYSTEM +TARGET = striad +BUILD_DIR = ./build +SRC_DIR = ./src +INCLUDES += -I./src/ + +#DO NOT EDIT BELOW +VPATH = $(SRC_DIR) +ASM = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.s,$(wildcard $(SRC_DIR)/*.c)) +OBJ = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o,$(wildcard $(SRC_DIR)/*.c)) +CPPFLAGS := $(CPPFLAGS) $(DEFINES) $(INCLUDES) + +${TARGET}: $(BUILD_DIR) $(OBJ) + ${CC} ${LFLAGS} -o $(TARGET) $(OBJ) $(LIBS) + +asm: $(BUILD_DIR) $(ASM) + +$(BUILD_DIR)/%.o: %.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.s: %.c + $(CC) -S $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(BUILD_DIR): + @mkdir $(BUILD_DIR) + +.PHONY: clean + +clean: + @echo "===> CLEAN" + @rm -rf $(BUILD_DIR) + @rm -f $(TARGET) + diff --git a/MemoryHierarchy/bench.pl b/MemoryHierarchy/bench.pl new file mode 100755 index 0000000..7deccc7 --- /dev/null +++ b/MemoryHierarchy/bench.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use utf8; + +my $numCores = $ARGV[0]; +my $type = 0; +my $SMT = $ARGV[2] ? $ARGV[2] : 2; +my $N = 100; + +if ( $ARGV[1] eq 'seq' ){ + $type = 0; +} elsif ( $ARGV[1] eq 'tp' ){ + $type = 1; +} elsif ( $ARGV[1] eq 'ws' ){ + $type = 2; +} + + +while ( $N < 8000000 ) { + my $result; + my $performance = '0.00'; + + while ( $performance eq '0.00' ){ + $result = `likwid-pin -c E:S0:$numCores:1:$SMT -q ./striad $type $N`; + $result =~ /([0-9.]+) ([0-9.]+)/; + my $size = $1; + $performance = $2; + } + + print $result; + $N = int($N * 1.2); +} diff --git a/MemoryHierarchy/src/affinity.c b/MemoryHierarchy/src/affinity.c new file mode 100644 index 0000000..cc361c2 --- /dev/null +++ b/MemoryHierarchy/src/affinity.c @@ -0,0 +1,89 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#ifdef __linux__ +#ifdef _OPENMP +#include +#include +#include +#include +#include +#include +#include + +#define MAX_NUM_THREADS 128 +#define gettid() syscall(SYS_gettid) + +static int +getProcessorID(cpu_set_t* cpu_set) +{ + int processorId; + + for ( processorId = 0; processorId < MAX_NUM_THREADS; processorId++ ) + { + if ( CPU_ISSET(processorId,cpu_set) ) + { + break; + } + } + return processorId; +} + + +int +affinity_getProcessorId() +{ + cpu_set_t cpu_set; + CPU_ZERO(&cpu_set); + sched_getaffinity(gettid(),sizeof(cpu_set_t), &cpu_set); + + return getProcessorID(&cpu_set); +} + +void +affinity_pinThread(int processorId) +{ + cpu_set_t cpuset; + pthread_t thread; + + thread = pthread_self(); + CPU_ZERO(&cpuset); + CPU_SET(processorId, &cpuset); + pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset); +} + +void +affinity_pinProcess(int processorId) +{ + cpu_set_t cpuset; + + CPU_ZERO(&cpuset); + CPU_SET(processorId, &cpuset); + sched_setaffinity(0, sizeof(cpu_set_t), &cpuset); +} +#endif /*__linux__*/ +#endif /*_OPENMP*/ diff --git a/MemoryHierarchy/src/affinity.h b/MemoryHierarchy/src/affinity.h new file mode 100644 index 0000000..9c7eecf --- /dev/null +++ b/MemoryHierarchy/src/affinity.h @@ -0,0 +1,36 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#ifndef AFFINITY_H +#define AFFINITY_H + +extern int affinity_getProcessorId(); +extern void affinity_pinProcess(int); +extern void affinity_pinThread(int); + +#endif /*AFFINITY_H*/ + diff --git a/MemoryHierarchy/src/allocate.c b/MemoryHierarchy/src/allocate.c new file mode 100644 index 0000000..eaaa5e3 --- /dev/null +++ b/MemoryHierarchy/src/allocate.c @@ -0,0 +1,58 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#include +#include +#include + +void* allocate (int alignment, size_t bytesize) +{ + int errorCode; + void* ptr; + + errorCode = posix_memalign(&ptr, alignment, bytesize); + + if (errorCode) { + if (errorCode == EINVAL) { + fprintf(stderr, + "Error: Alignment parameter is not a power of two\n"); + exit(EXIT_FAILURE); + } + if (errorCode == ENOMEM) { + fprintf(stderr, + "Error: Insufficient memory to fulfill the request\n"); + exit(EXIT_FAILURE); + } + } + + if (ptr == NULL) { + fprintf(stderr, "Error: posix_memalign failed!\n"); + exit(EXIT_FAILURE); + } + + return ptr; +} diff --git a/MemoryHierarchy/src/allocate.h b/MemoryHierarchy/src/allocate.h new file mode 100644 index 0000000..a6ee561 --- /dev/null +++ b/MemoryHierarchy/src/allocate.h @@ -0,0 +1,33 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#ifndef __ALLOCATE_H_ +#define __ALLOCATE_H_ + +extern void* allocate (int alignment, size_t bytesize); + +#endif diff --git a/MemoryHierarchy/src/likwid_markers.h b/MemoryHierarchy/src/likwid_markers.h new file mode 100644 index 0000000..76351d2 --- /dev/null +++ b/MemoryHierarchy/src/likwid_markers.h @@ -0,0 +1,44 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#ifndef LIKWID_MARKERS_H +#define LIKWID_MARKERS_H + +#ifdef LIKWID_PERFMON +#include +#else +#define LIKWID_MARKER_INIT +#define LIKWID_MARKER_THREADINIT +#define LIKWID_MARKER_SWITCH +#define LIKWID_MARKER_REGISTER(regionTag) +#define LIKWID_MARKER_START(regionTag) +#define LIKWID_MARKER_STOP(regionTag) +#define LIKWID_MARKER_CLOSE +#define LIKWID_MARKER_GET(regionTag, nevents, events, time, count) +#endif + +#endif /*LIKWID_MARKERS_H*/ diff --git a/MemoryHierarchy/src/main.c b/MemoryHierarchy/src/main.c new file mode 100644 index 0000000..b634e68 --- /dev/null +++ b/MemoryHierarchy/src/main.c @@ -0,0 +1,216 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +#include +#include +#include +#include + +#define HLINE "----------------------------------------------------------------------------\n" + + +#ifndef MIN +#define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#ifndef MAX +#define MAX(x,y) ((x)>(y)?(x):(y)) +#endif +#ifndef ABS +#define ABS(a) ((a) >= 0 ? (a) : -(a)) +#endif + +extern double striad_seq(double*, double*, double*, double*, int, int); +extern double striad_tp(double*, double*, double*, double*, int, int); +extern double striad_ws(double*, double*, double*, double*, int, int); + +typedef double (*testFunc)(double*, double*, double*, double*, int, int); + +int main (int argc, char** argv) +{ + size_t bytesPerWord = sizeof(double); + size_t N; + int type; + size_t iter = 1; + size_t scale = 1; + double *a, *b, *c, *d; + double E, S; + double avgtime, maxtime, mintime; + double times[NTIMES]; + double dataSize; + testFunc func; + char* testname; + + + if ( argc > 2 ) { + type = atoi(argv[1]); + N = atoi(argv[2]); + } else { + printf("Usage: %s \n",argv[0]); + printf("Test types: 0 - sequential, 1 - OpenMP throughput, 2 - OpenMP worksharing\n"); + exit(EXIT_SUCCESS); + } + + LIKWID_MARKER_INIT; + + switch ( type ) { + case 0: + func = striad_seq; + testname = "striad_seq"; + break; + case 1: + func = striad_tp; + testname = "striad_tp"; +#ifdef _OPENMP +#pragma omp parallel + { +#pragma omp single + scale = omp_get_num_threads(); + + + LIKWID_MARKER_REGISTER("BENCH"); + } +#endif + break; + case 2: + func = striad_ws; + testname = "striad_ws"; + break; + default: + printf("Unknown test type: %d\n", type); + exit(EXIT_FAILURE); + } + + a = (double*) allocate( ARRAY_ALIGNMENT, N * bytesPerWord ); + b = (double*) allocate( ARRAY_ALIGNMENT, N * bytesPerWord ); + c = (double*) allocate( ARRAY_ALIGNMENT, N * bytesPerWord ); + d = (double*) allocate( ARRAY_ALIGNMENT, N * bytesPerWord ); + +#ifdef VERBOSE + printf(HLINE); + dataSize = 4.0 * bytesPerWord * N; + + if ( dataSize < 1.0E06 ) { + printf ("Total allocated datasize: %8.2f KB\n", dataSize * 1.0E-03); + } else { + printf ("Total allocated datasize: %8.2f MB\n", dataSize * 1.0E-06); + } +#endif + avgtime = 0; + maxtime = 0; + mintime = FLT_MAX; + +#ifdef VERBOSE +#ifdef _OPENMP + printf(HLINE); +#pragma omp parallel + { + int k = omp_get_num_threads(); + int i = omp_get_thread_num(); + +#pragma omp single + printf ("OpenMP enabled, running with %d threads\n", k); + + printf ("\tThread %d running on processor %d\n", i, affinity_getProcessorId()); + } +#endif +#endif + + S = getTimeStamp(); +#pragma omp parallel for + for (int i=0; i 0.1 ) break; + double factor = 0.2 / (times[0] - times[1]); + iter *= (int) factor; + times[1] = times[0]; + } + +#ifdef VERBOSE + printf ("Using %d iterations \n", iter); +#endif + + for ( int k=0; k < NTIMES; k++) { + times[k] = func(a, b, c, d, N, iter); + } + + for (int k=1; k + +#include +#include + +double striad_seq( + double * restrict a, + const double * restrict b, + const double * restrict c, + const double * restrict d, + int N, + int iter + ) +{ + double S, E; + + S = getTimeStamp(); + LIKWID_MARKER_START("BENCH"); + for(int j = 0; j < iter; j++) { + for (int i=0; i 2000) printf("Ai = %f\n",a[N-1]); + } + LIKWID_MARKER_STOP("BENCH"); + E = getTimeStamp(); + + return E-S; +} diff --git a/MemoryHierarchy/src/striad_tp.c b/MemoryHierarchy/src/striad_tp.c new file mode 100644 index 0000000..cfe4748 --- /dev/null +++ b/MemoryHierarchy/src/striad_tp.c @@ -0,0 +1,62 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#include + +#include +#include + +double striad_tp( + double * restrict a, + const double * restrict b, + const double * restrict c, + const double * restrict d, + int N, + int iter + ) +{ + double S, E; + +#pragma omp parallel + { + double* al = (double*) allocate( ARRAY_ALIGNMENT, N * sizeof(double) ); + +#pragma omp single + S = getTimeStamp(); + for(int j = 0; j < iter; j++) { + for (int i=0; i 2000) printf("Ai = %f\n",al[N-1]); + } +#pragma omp single + E = getTimeStamp(); + } + + return E-S; +} diff --git a/MemoryHierarchy/src/striad_ws.c b/MemoryHierarchy/src/striad_ws.c new file mode 100644 index 0000000..9ba1374 --- /dev/null +++ b/MemoryHierarchy/src/striad_ws.c @@ -0,0 +1,57 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#include + +#include + +double striad_ws( + double * restrict a, + const double * restrict b, + const double * restrict c, + const double * restrict d, + int N, + int iter + ) +{ + double S, E; + + S = getTimeStamp(); +#pragma omp parallel + { + for(int j = 0; j < iter; j++) { +#pragma omp for + for (int i=0; i 2000) printf("Ai = %f\n",a[N-1]); + } + } + E = getTimeStamp(); + + return E-S; +} diff --git a/MemoryHierarchy/src/timing.c b/MemoryHierarchy/src/timing.c new file mode 100644 index 0000000..0ed2617 --- /dev/null +++ b/MemoryHierarchy/src/timing.c @@ -0,0 +1,49 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#include +#include + +double getTimeStamp() +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9; +} + +double getTimeResolution() +{ + struct timespec ts; + clock_getres(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1.e-9; +} + +double getTimeStamp_() +{ + return getTimeStamp(); +} + diff --git a/MemoryHierarchy/src/timing.h b/MemoryHierarchy/src/timing.h new file mode 100644 index 0000000..79bdf95 --- /dev/null +++ b/MemoryHierarchy/src/timing.h @@ -0,0 +1,35 @@ +/* + * ======================================================================================= + * + * Author: Jan Eitzinger (je), jan.treibig@gmail.com + * Copyright (c) 2019 RRZE, University Erlangen-Nuremberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ======================================================================================= + */ + +#ifndef __TIMING_H_ +#define __TIMING_H_ + +extern double getTimeStamp(); +extern double getTimeResolution(); +extern double getTimeStamp_(); + +#endif