2016-09-12 3 views
0

Не могли бы вы рассказать мне, как использовать инструкции clflush()? Я написал следующий простой код, чтобы измерить разницу между временем выполнения чтения переменной из кеша и выселением из кеша. Однако я не нашел убедительных результатов. Каков правильный способ извлечения кеша с помощью clflush()?Проблемы с CLFLUSH()?

  #include <stdio.h> 
      #include <stdint.h> 
      #include"cpucycles.c" 

      #define REPEAT 1900000 
      inline void clflush(volatile void *p) 
      { 
       asm volatile ("clflush (%0)" :: "r"(p)); 
      } 

      inline uint64_t rdtsc() 
      { 
       unsigned long a, d; 
       asm volatile ("cpuid; rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx"); 
       return a | ((uint64_t)d << 32); 
      } 

      volatile int i; 

      inline void test() 
      { 
       uint64_t start, end,clock; 
       volatile int j; 
       long int rep; 
       int k; 

       clock=0; 
       for(rep=0;rep<REPEAT;rep++){ 
        start = rdtsc(); 
        j = i+1; 
        end = rdtsc(); 
        clock=clock+(end-start); 
        k=j; 
       } 
       printf("took %lu ticks\n", clock); 
      } 

      inline void testflush() 
      { 
       uint64_t start, end,clock; 
       volatile int j; 
       int k; 
       long int rep; 

       clock=0; 
       for(rep=0;rep<REPEAT;rep++){ 
        start = rdtsc(); 
        j = i+1; 
        end = rdtsc(); 
        clflush(&i); 
        clock=clock+(end-start); 
        k=j; 
       } 
       printf("took %lu ticks\n", clock); 
      } 


      int main(int ac, char **av) 
      { 
       i=5; 
       printf("------------------------------------------\n"); 
       test(); 
       printf("------------------------------------------\n"); 
       testflush(); 
       printf("------------------------------------------\n"); 
       test(); 

       return 0; 
      } 
+1

Возможный дубликат [Как использовать clflush?] (Http://stackoverflow.com/questions/39448276/how-to-use-clflush) – Olaf

ответ

0

Похоже, что ваше время «флеша» перегружено остальной частью кода. Кроме того, как написано, ваш не-флеш выполняет меньше строк кода (без флеша), делая сравнения «несправедливыми».

Как о чем-то более, как:

#include <stdio.h> 
#include <stdint.h> 
#include <malloc.h> 
#include <emmintrin.h> 

#define REPEAT 1900000 

volatile int i; 

inline void test(void *v) 
{ 
    uint64_t start, end; 
    volatile int j; 
    long int rep; 
    int k; 

    start = __builtin_ia32_rdtsc(); 
    for(rep=0;rep<REPEAT;rep++){ 
     j = i+1; 
     _mm_clflush(v); 
     k=j; 
    } 
    end = __builtin_ia32_rdtsc(); 
    printf("%p took %lu ticks\n", v, end-start); 
} 

int main(int ac, char **av) 
{ 
    void *v = malloc(1000); 
    i=5; 
    printf("------------------------------------------\n"); 
    test(v); 
    printf("------------------------------------------\n"); 
    test((void *)&i); 
    printf("------------------------------------------\n"); 
    test(v); 
    free(v); 

    return 0; 
} 

Таким образом, мы всегда смыва что-то, но один тест влияет на ваш глобальный, а другой нет. Он также не использует встроенный asm.

Построенный с -O3, это дает мне время, как 149 для non-flush и 312 для флеша.