diff --git a/Makefile b/Makefile index b4742c9..9418a7e 100644 --- a/Makefile +++ b/Makefile @@ -22,4 +22,4 @@ test-gen: fftma cd tests/stages/generation && python3 -m unittest test.py time-gen: fftma - cd tests/performance/generation && python3 time.py $(N) \ No newline at end of file + cd tests/performance/generation && python3 time.py $(N) diff --git a/fftma_module/gen/example.py b/fftma_module/gen/example.py index d5a9214..e2d7652 100644 --- a/fftma_module/gen/example.py +++ b/fftma_module/gen/example.py @@ -31,4 +31,4 @@ def generate(n): if __name__ == '__main__': N=int(sys.argv[1]) - generate(N) + generate(N) \ No newline at end of file diff --git a/fftma_module/gen/include/chunk_array.h b/fftma_module/gen/include/chunk_array.h index 4436d3d..8781492 100644 --- a/fftma_module/gen/include/chunk_array.h +++ b/fftma_module/gen/include/chunk_array.h @@ -18,6 +18,7 @@ typedef struct chunk_array { size_t chunk_size; size_t total_size; FILE* fp; + double* mmap_array; buffer_t* buffer1; buffer_t* buffer2; }chunk_array_t; diff --git a/fftma_module/gen/lib_src/chunk_array.c b/fftma_module/gen/lib_src/chunk_array.c index 9e9d750..75eb201 100644 --- a/fftma_module/gen/lib_src/chunk_array.c +++ b/fftma_module/gen/lib_src/chunk_array.c @@ -1,6 +1,7 @@ #include "chunk_array.h" #include "stdbool.h" #include "stdlib.h" +#include #define MAX_CHUNK_SIZE 2048*2048 @@ -27,7 +28,8 @@ bool inside_buffer(chunk_array_t* chunk_array,int init_pos, size_t pos) { } void chunk_array_free(chunk_array_t* chunk_array) { - fclose(chunk_array->fp); + //fclose(chunk_array->fp); + munmap(chunk_array->mmap_array, chunk_array->total_size * sizeof(double)); buffer_free(chunk_array->buffer1); buffer_free(chunk_array->buffer2); free(chunk_array); @@ -41,8 +43,10 @@ void chunk_array_flush(chunk_array_t* chunk_array) { void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) { if (buffer->dirty) { int mod = get_mod(chunk_array, buffer->init_pos); - fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET); - fwrite(buffer->data, sizeof(double), mod, chunk_array->fp); + //fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET); + //fwrite(buffer->data, sizeof(double), mod, chunk_array->fp); + memcpy(&chunk_array->mmap_array[buffer->init_pos], buffer->data, mod * sizeof(double)); + buffer->dirty = false; } } @@ -53,9 +57,11 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) { int new_init = pos/chunk_array->chunk_size; buffer->init_pos = new_init * chunk_array->chunk_size; + int mod = get_mod(chunk_array, buffer->init_pos); - fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET); - fread(buffer->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); + //fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET); + //fread(buffer->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); + memcpy(buffer->data, &chunk_array->mmap_array[buffer->init_pos], mod * sizeof(double)); } buffer_t* buffer_create(int size) { @@ -83,14 +89,15 @@ void buffer_free(buffer_t* buffer) { chunk_array_t* chunk_array_create(char* filename, size_t total_size) { chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t)); - chunk_array->fp = fopen(filename, "r+"); - if (chunk_array == NULL || chunk_array->fp == NULL) { - chunk_array->fp = fopen(filename, "w+"); + if (chunk_array == NULL) { + return NULL; + } + + chunk_array->mmap_array = mmap ( NULL, total_size*sizeof(double), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 ); - if (chunk_array->fp == NULL) { - return NULL; - } + if (chunk_array->mmap_array == NULL) { + return NULL; } chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size); @@ -106,17 +113,19 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) { chunk_array->buffer2 = buffer_create(chunk_array->chunk_size); if (chunk_array->buffer2 == NULL) { - fclose(chunk_array->fp); + //fclose(chunk_array->fp); buffer_free(chunk_array->buffer1); free(chunk_array); return NULL; } - fread(chunk_array->buffer1->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); + memcpy(chunk_array->buffer1->data, chunk_array->mmap_array, chunk_array->chunk_size * sizeof(double)); chunk_array->buffer1->init_pos = 0; - fread(chunk_array->buffer2->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); - chunk_array->buffer2->init_pos = chunk_array->chunk_size; - + if (total_size > chunk_array->chunk_size) { + int mod = get_mod(chunk_array, chunk_array->buffer1->init_pos + chunk_array->chunk_size); + memcpy(chunk_array->buffer2->data, &chunk_array->mmap_array[chunk_array->chunk_size], mod * sizeof(double)); + chunk_array->buffer2->init_pos = chunk_array->chunk_size; + } chunk_array->filename = filename; chunk_array->total_size = total_size; return chunk_array; diff --git a/fftma_module/gen/mem_profile.py b/fftma_module/gen/mem_profile.py index 55d5cba..71e6826 100644 --- a/fftma_module/gen/mem_profile.py +++ b/fftma_module/gen/mem_profile.py @@ -1,8 +1,5 @@ -from sympy import N from example import generate -from memory_profiler import memory_usage - from memory_profiler import memory_usage import sys diff --git a/script_fortran.sh b/script_fortran.sh deleted file mode 100755 index ec6fe8b..0000000 --- a/script_fortran.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -rm ./tools/connec/conec2d -rm ./tools/connec/conec3d - -cd ./tools/connec/connec-src && make clean && make all -mv ./conec2d .. -mv ./conec3d .. \ No newline at end of file diff --git a/tests/integration/test.py b/tests/integration/test.py index c03c211..a422fcd 100644 --- a/tests/integration/test.py +++ b/tests/integration/test.py @@ -9,6 +9,7 @@ def find_relative_errors(path_original, path): binary_original = np.load(path_original) binary = np.load(path) +<<<<<<< Updated upstream diffs = binary_original - binary binary_original = binary_original.tolist() @@ -39,6 +40,13 @@ def find_relative_errors(path_original, path): BINARIES = ["Cmap", "D", "P", "V", "k"] +======= + diffs = np.divide(binary_original - binary, binary_original) + comparisons = np.array([(abs(x) < 0.01).all() for x in diffs]) + return comparisons.all() + +BINARIES = ['Cmap', 'D', 'P', 'V', 'k'] +>>>>>>> Stashed changes class TestIntegration(unittest.TestCase): @classmethod