use mmap instead of file

improvement-double_with_dirty_mmap
Olivia Fernandez 3 years ago
parent ca9c01c962
commit 42bb086634

@ -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;

@ -1,6 +1,7 @@
#include "chunk_array.h"
#include "stdbool.h"
#include "stdlib.h"
#include <sys/mman.h>
#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;

@ -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

@ -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 ..

@ -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

Loading…
Cancel
Save