Page MenuHomec4science

numa_test.c
No OneTemporary

File Metadata

Created
Thu, Feb 27, 02:26

numa_test.c

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include "utility.h"
#include <stdint.h>
#define GB (uint64_t)(1 << 30)
#define SIZE (uint64_t)(8*GB)
volatile uint8_t *arr;
#define CACHE_LINE 64
// louis version accessor
/*inline uint64_t next_addr(uint64_t i){
// Change this part
if(i%3==0)
{
return 10 + 10*(arr[i]%10);
}
else
{
return 10 + 11*(arr[i]%11);
}
}*/
// louis version initializer
/*inline void init_array(rand_gen gen){
for(uint64_t i=0; i<SIZE; ++i){
arr[i] = (uint64_t)(next_rand(gen) * 10);
}
}*/
// ancarola version
/*inline uint64_t next_addr(uint64_t i){
return arr[i];
}*/
inline uint64_t next_addr(uint64_t i){
return 1;
}
inline void init_array(rand_gen gen){
for(uint64_t i=0; i<SIZE; i++){
arr[i] = 1;
}
}
// 0, 1 alternated version
/*inline void init_array(rand_gen gen){
// elude linear pattern recognizer
for(uint64_t i=0; i<SIZE; i += 2 * CACHE_LINE){
uint64_t place = i / (2 * CACHE_LINE);
if (place % 2 == 0) {
// first place
arr[i] = 2 * CACHE_LINE + 1;
//printf("Allocando il dio boia: (%d, %d)\n", (int)i, (int)arr[i]);
} else {
// second place
arr[i+1] = 2 * CACHE_LINE - 1;
//printf("Allocando il dio boia: (%d, %d)\n", (int)(i+1), (int)arr[i+1]);
}
}
}*/
// linearly shifted version
/*inline void init_array(rand_gen gen){
// elude linear pattern recognizer
uint64_t counter = 0;
// shift 1 every two cache lines
for(uint64_t i=0; i<SIZE; i += 2 * CACHE_LINE){
uint64_t place = i / (2 * CACHE_LINE);
if (place % 2 == 0) {
arr[i + counter] = 2 * CACHE_LINE;
} else {
if ((counter + 1) % CACHE_LINE == 0) {
arr[i + counter] = CACHE_LINE + 1;
counter = 0;
} else {
arr[i + counter] = 2 * CACHE_LINE + 1;
++counter;
}
}
}
}*/
// random version
/*inline void init_array(rand_gen gen){
uint64_t r[2];
r[0] = 0;
r[1] = (uint64_t)(next_rand(gen) * (CACHE_LINE - 1));
for(uint64_t i=0; i<SIZE; i += 4 * CACHE_LINE){
arr[i + r[0]] = 4 * CACHE_LINE + (r[1] - r[0]);
r[0] = r[1];
r[1] = (uint64_t)(next_rand(gen) * (CACHE_LINE - 1));
}
}*/
int main(){
uint64_t i, counter;
double time;
volatile uint8_t temp;
arr = (uint8_t*) malloc(SIZE);
rand_gen gen = init_rand();
init_array(gen);
//Start timer
set_clock();
for(i=0, counter=0; i<SIZE; counter++){
temp = arr[i];
i += next_addr(i);
}
//Stop timer
time = elapsed_time();
temp = next_rand(gen)*10;
i = temp; // Just to suppress the compiler warning for not using temp and gen
if(counter < 10000000)
printf("ERROR: Too few accesses. You have to access more elements to measure reasonable time difference.\n");
if((time/counter) < 1.0e-8)
printf("ERROR: Time per access is too small. You have to further deoptimize the program to measure reasonable time difference.\n");
printf("Traversing %lx GB array took total time = %.4g seconds, number of accesses = %lu, %.4g seconds per access\n", SIZE/GB, time, counter, time/counter);
return 0;
}

Event Timeline