Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. #if defined(__i386__)
  6.  
  7. static __inline__ unsigned long long rdtsc(void)
  8. {
  9.     unsigned long long int x;
  10.     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
  11.     return x;
  12. }
  13.  
  14. #elif defined(__x86_64__)
  15.  
  16. static __inline__ unsigned long long rdtsc(void)
  17. {
  18.     unsigned hi, lo;
  19.     __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
  20.     return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
  21. }
  22.  
  23. #endif
  24.  
  25.  
  26. #define Kb  1024
  27. #define BLOCK_SIZE 16 * Kb
  28. #define OFFSET 1024 * 1024
  29. #define DATATYPE unsigned long
  30. #define ITERATIONS 10000
  31.  
  32. //#define Kb  1024
  33. //#define BLOCK_SIZE 32
  34. //#define OFFSET 64
  35. //#define DATATYPE unsigned  long
  36. //#define ITERATIONS 2
  37. //#define DEBUG_PRINT 2
  38.  
  39. typedef struct {
  40.     unsigned  long dummy[7];
  41.     unsigned  long next;
  42. } S ;
  43.  
  44. unsigned long long  test(int);
  45.  
  46. int main() {
  47.  
  48.  
  49.  
  50.     printf("Hello, World: %lu\n", sizeof(S));
  51.  
  52.     unsigned long long result;
  53.     result = test(4);
  54.     printf("\n===========================================\n");
  55.  
  56.     for (int i = 1; i < 30; i ++) {
  57.         result = test(i);
  58.         printf("ticks spent(%d): %llu\n", i, result);
  59.     }
  60.  
  61.  
  62.     return 0;
  63. }
  64.  
  65. unsigned long long int  test(int N) {
  66.     //init
  67.     DATATYPE* test_array = (DATATYPE *)calloc(OFFSET * N, sizeof(DATATYPE));
  68.     for (unsigned long i = 0; i < OFFSET * N; i++) {
  69.         test_array[i] = 0;
  70.     }
  71.  
  72.     for (long i = 0; i < BLOCK_SIZE / N; i++) {
  73.         for (long current_block = 0; current_block < N; current_block++) {
  74.             test_array[current_block * OFFSET + i] = (current_block + 1) * OFFSET + i;
  75.         }
  76.         test_array[(N - 1) * OFFSET + i] = 0 + i + 1;
  77.     }
  78.  
  79.     test_array[(N - 1) * OFFSET + BLOCK_SIZE / N - 1] = 0;
  80.  
  81. //    for (int i = 0; i < OFFSET * N; i++) {
  82. //        printf("%lu ", test_array[i]);
  83. //        if ((i + 1) % (OFFSET) == 0 && i != 0) {
  84. //            printf("\n");
  85. //        }
  86. //    }
  87.  
  88.     unsigned long long start = rdtsc();
  89.     DATATYPE t = 0;
  90.     for (long i = 0; i < ITERATIONS; i++){
  91.         t = test_array[t];
  92.     }
  93.     unsigned long long end = rdtsc();
  94.  
  95.     if (t == 1) {
  96.         printf("test\n");
  97.     }
  98.  
  99.     return (end - start);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement