diff --git a/apps/laplace.c b/apps/laplace.c index 91f9e407..802a4dab 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -54,12 +54,8 @@ //#define FIX 1024 #define FIX 1 -#define USE_STRONG 1 -#define USE_LAZYRELEASE 0 - -#if USE_STRONG && USE_LAZYRELEASE -#error Please, use only one memory model -#endif +#define SVM_TYPE SVM_STRONG +//define SVM_TYPE SVM_LAZYRELEASE static inline double pow(double a, int b) { @@ -76,7 +72,6 @@ int laplace(void *arg) { //char* argv[] = {"/bin/laplace", "192.168.4.254", "12301", NULL}; //int argc = 3; - uint32_t flags; #ifdef _USE_GFX uint32_t ret; #endif @@ -98,10 +93,8 @@ int laplace(void *arg) uint64_t start, end; - flags = irq_nested_disable(); - my_rank = RCCE_ue(); - num_ranks = RCCE_num_ues(); - irq_nested_enable(flags); + my_rank = RCCE_IAM; + num_ranks = RCCE_NP; #ifdef _USE_GFX kprintf("Laplace calls gfx_init\n"); @@ -140,19 +133,15 @@ int laplace(void *arg) #endif NewValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); -#if USE_STRONG - NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); -#elif USE_LAZYRELEASE - NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); +#ifdef SVM_TYPE + NewValues[0] = (DATA *) svm_malloc((N + 2) * (M + 2) * sizeof(DATA), SVM_TYPE); #else NewValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); #endif OldValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); -#if USE_STRONG - OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); -#elif USE_LAZYRELEASE - OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); +#ifdef SVM_TYPE + OldValues[0] = (DATA *) svm_malloc((N + 2) * (M + 2) * sizeof(DATA), SVM_TYPE); #else OldValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); #endif @@ -169,7 +158,9 @@ int laplace(void *arg) BufValues[i] = BufValues[i - 1] + (M); } - RCCE_barrier(&RCCE_COMM_WORLD); +#ifdef SVM_TYPE + svm_barrier(SVM_TYPE); +#endif kprintf("(%d) Memory allocated!\n", my_rank); @@ -203,16 +194,13 @@ int laplace(void *arg) } } -#if USE_LAZYRELEASE - svm_flush(); - svm_invalidate(); +#ifdef SVM_TYPE + svm_barrier(SVM_TYPE); #endif - RCCE_barrier(&RCCE_COMM_WORLD); kprintf("(%d) Arrays initialized!\n", my_rank); start = rdtsc(); - start = rdtsc(); // START ITERATIONS LOOP for (t = 0; t < TMAX; t++) { @@ -230,16 +218,14 @@ int laplace(void *arg) OldValues[I + i][J + j + 1]) / 4; } } -#if USE_LAZYRELEASE - svm_flush(); - svm_invalidate(); -#endif tmp = NewValues; NewValues = OldValues; OldValues = tmp; - RCCE_barrier(&RCCE_COMM_WORLD); +#ifdef SVM_TYPE + svm_barrier(SVM_TYPE); +#endif #ifdef _USE_GFX if ((my_rank == 0) && (t % 50 == 0)) { @@ -263,18 +249,22 @@ int laplace(void *arg) GFX_update(); } - RCCE_barrier(&RCCE_COMM_WORLD); +#ifdef SVM_TYPE + svm_barrier(SVM_TYPE); +#endif #endif // END ITERATIONS LOOP } - RCCE_barrier(&RCCE_COMM_WORLD); +#ifdef SVM_TYPE + svm_barrier(SVM_TYPE); +#endif end = rdtsc(); kprintf("Calculation time: %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); -#if USE_STRONG || USE_LAZYRELEASE +#ifdef SVM_TYPE svm_statistics(); #endif } diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 301fda74..9c915e1a 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -49,13 +49,15 @@ int svm_init(void); * * @return Pointer to the new memory range */ -void* svmmalloc(size_t sizei, uint32_t flags); +void* svm_malloc(size_t sizei, uint32_t flags); /** @brief Frees memory, which is managed by the SVM subsystem * * Like RCCE function, belongs svmfree to the synchronous function. */ -void svmfree(void* addr, size_t size); +void svm_free(void* addr, size_t size); + +int svm_barrier(uint32_t flags); /** @brief Request for exlusive access * diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index a1085287..3b1afe81 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -148,7 +148,7 @@ int svm_access_request(size_t addr) static atomic_int32_t size_counter = ATOMIC_INIT(0); -void* svmmalloc(size_t size, uint32_t consistency) +void* svm_malloc(size_t size, uint32_t consistency) { size_t phyaddr, viraddr, i; uint32_t flags; @@ -238,7 +238,7 @@ void* svmmalloc(size_t size, uint32_t consistency) #endif } -void svmfree(void* addr, size_t size) +void svm_free(void* addr, size_t size) { size_t phyaddr, i; uint32_t flags; @@ -341,6 +341,18 @@ void svm_flush(void) } #endif +int svm_barrier(uint32_t type) +{ + if (type == SVM_LAZYRELEASE) { + svm_flush(); + svm_invalidate(); + } + + RCCE_barrier(&RCCE_COMM_WORLD); + + return 0; +} + int svm_statistics(void) { uint32_t i;