diff --git a/branch_predict_test/branch_predict.c b/branch_predict_test/branch_predict.c index 47ceebf..0721e4b 100644 --- a/branch_predict_test/branch_predict.c +++ b/branch_predict_test/branch_predict.c @@ -4,8 +4,8 @@ #include ////////// -#include -#include +//#include +//#include ///////// /* @@ -19,11 +19,30 @@ #define CHAR_START '1' #define CHAR_END '9' -//#define MEASURE_FUNC string_bit_count +#define MEASURE_FUNC string_bit_count //#define MEASURE_FUNC string_bit_count2 //#define MEASURE_FUNC string_bit_count3 -#define MEASURE_FUNC sha1_int_from_string +//#define MEASURE_FUNC sha1_int_from_string +void mem_flush(const void *p, unsigned int allocation_size) { + const size_t cache_line = 64; + const char *cp = (const char *)p; + size_t i = 0; + if (p == NULL || allocation_size <= 0) + return; + + for (i = 0; i < allocation_size; i += cache_line) { + asm volatile("clflush (%0)\n\t" + : + : "r"(&cp[i]) + : "memory"); + } + + asm volatile("sfence\n\t" + : + : + : "memory"); +} /* * returns dynamically allocated random string * with a strlen between minLen and maxLen @@ -112,6 +131,8 @@ int main(int argc, char* argv[]) unsigned long long counter = 0; clock_t t1, t0 = clock(); for(; *p; ++p) { + size_t len = strlen(*p); + mem_flush(*p, len+1); counter += MEASURE_FUNC(*p); } t1 = clock(); @@ -261,7 +282,7 @@ char** read_strings(const char* fileName, size_t* nRead) { return out_array; } - +/* int sha1_int_from_string(const char* s) { SHA_CTX c; SHA1_Init(&c); @@ -274,3 +295,4 @@ int sha1_int_from_string(const char* s) { } return count; } +*/