diff --git a/fftma_module/gen/include/chunk_array.h b/fftma_module/gen/include/chunk_array.h index 5dd2082..8e366e2 100644 --- a/fftma_module/gen/include/chunk_array.h +++ b/fftma_module/gen/include/chunk_array.h @@ -23,6 +23,7 @@ typedef struct chunk_array { buffer_t* buffer2; buffer_t** buffers; size_t n_buffers; + size_t last_updated; }chunk_array_t; chunk_array_t* chunk_array_create(char* filename, size_t total_size); diff --git a/fftma_module/gen/lib_src/chunk_array.c b/fftma_module/gen/lib_src/chunk_array.c index e28bfd6..db3140c 100644 --- a/fftma_module/gen/lib_src/chunk_array.c +++ b/fftma_module/gen/lib_src/chunk_array.c @@ -2,9 +2,10 @@ #include "stdbool.h" #include "stdlib.h" #include +#include -#define MAX_CHUNK_SIZE 33554432*2 -#define N_BUFFERS 8 +#define MAX_CHUNK_SIZE 11248640 +#define N_BUFFERS 100 int min(int value1, int value2) { if (value1 < value2) return value1; @@ -22,9 +23,12 @@ int get_mod(chunk_array_t* chunk_array,int init_pos) { } bool inside_buffer(chunk_array_t* chunk_array,int init_pos, size_t pos) { + //printf("range: [%d; %d] pos: %d", init_pos, init_pos + chunk_array->chunk_size-1, pos); if (posinit_pos + chunk_array->chunk_size-1) { + //printf(" FALSE\n"); return false; } + //printf(" TRUE\n"); return true; } @@ -48,6 +52,8 @@ void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) { void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) { + //printf("[UPDATE BUFFER][%s] old init_pos %d pos %d\n",chunk_array->filename, buffer->init_pos, pos); + //printf("miss pos: %d\n", pos); buffer_flush(chunk_array, buffer); if (chunk_array->mmap_array) { @@ -58,7 +64,7 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) { } } -buffer_t* buffer_create(int size) { +buffer_t* buffer_create(int size, int init) { buffer_t * buffer = (buffer_t*)malloc(sizeof(buffer_t)); if (buffer == NULL) return NULL; @@ -70,7 +76,7 @@ buffer_t* buffer_create(int size) { return NULL; } - buffer->init_pos = 0; + buffer->init_pos = init; buffer->dirty = false; return buffer; @@ -88,21 +94,21 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) { return NULL; } + printf("totalsize %d\n", total_size); + chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size); chunk_array->buffers = malloc(sizeof(buffer_t) * N_BUFFERS); - chunk_array->buffers[0] = buffer_create(chunk_array->chunk_size); - - chunk_array->buffers[0]->init_pos = 0; + chunk_array->buffers[0] = buffer_create(chunk_array->chunk_size, 0); chunk_array->n_buffers = 1; + chunk_array->last_updated = -1; for (int i = 1; i i*chunk_array->chunk_size) { chunk_array->n_buffers++; - chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size); - chunk_array->buffers[i]->init_pos = i*chunk_array->chunk_size; + chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size, i*chunk_array->chunk_size); } else { break; } @@ -124,16 +130,28 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) { } buffer_t* chunk_array_update(chunk_array_t* chunk_array, size_t pos) { - buffer_t* buffer = chunk_array->buffers[0]; - int distance = abs(buffer->init_pos - pos); + ////printf("[%s] miss: %d\n",chunk_array->filename, pos); + //buffer_t* buffer = chunk_array->buffers[0]; + //int distance = abs(buffer->init_pos - pos); + + srand(time(NULL)); // Initialization, should only be called once. + int random = rand()%chunk_array->n_buffers; + + while (random == chunk_array->last_updated) { + //printf("ACA!\n"); + random = rand()%chunk_array->n_buffers; + } - for(int i=1; in_buffers; i++) { + chunk_array->last_updated = random; + + /*for(int i=1; in_buffers; i++) { int new_distance = abs(chunk_array->buffers[i]->init_pos - pos); if (new_distance < distance) { distance = new_distance; buffer = chunk_array->buffers[i]; } - } + }*/ + buffer_t* buffer = chunk_array->buffers[random]; buffer_update(chunk_array, buffer, pos); return buffer; } @@ -150,6 +168,7 @@ bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) { for (int i = 0; in_buffers; i++) { if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) { buffer = chunk_array->buffers[i]; + break; } } @@ -177,6 +196,7 @@ bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) { for (int i = 0; in_buffers; i++) { if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) { buffer = chunk_array->buffers[i]; + break; } }