Advertisement
Guest User

kuzaiherba

a guest
Apr 25th, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. int hit_count, miss_count, eviction_count;
  2. long long usage;
  3.  
  4. void csim(unsigned long long address, long long** cache, int s, int E, int b, int v)
  5. {
  6. int i;
  7. unsigned long long eff_address, cache_address, mask;
  8. long long lru;
  9. int ev_index; // eviction index
  10.  
  11. lru = 0xFFFFFFFF;
  12. mask = (1 << s) - 1;
  13. eff_address = (address >> b) & mask; // внутри блока
  14. cache_address = address >> (b + s);
  15.  
  16. for (i = 0; i < E; i++)
  17. {
  18. // проверка актуальности + адреса
  19. if (cache[eff_address][3 * i + 1] == cache_address && cache[eff_address][3 * i] != 0)
  20. {
  21. hit_count++;
  22.  
  23. if (v == 1)
  24. printf("hit ");
  25.  
  26. cache[eff_address][3 * i + 2] = usage;
  27. usage++;
  28.  
  29. return;
  30. }
  31. }
  32.  
  33. miss_count++;
  34.  
  35. if (v == 1)
  36. printf("miss ");
  37.  
  38. for (i = 0; i < E; i++)
  39. {
  40. if (cache[eff_address][3 * i + 2] < lru)
  41. {
  42. ev_index = i;
  43. lru = cache[eff_address][3 * i + 2];
  44. }
  45. }
  46.  
  47. if (cache[eff_address][3 * ev_index] != 0)
  48. {
  49. eviction_count++;
  50.  
  51. if (v == 1)
  52. printf("eviction ");
  53. }
  54.  
  55. cache[eff_address][3 * ev_index] = 1; // актуальность
  56. cache[eff_address][3 * ev_index + 1] = cache_address; // метка
  57. cache[eff_address][3 * ev_index + 2] = usage; // значение
  58. usage++;
  59.  
  60. return;
  61. }
  62.  
  63.  
  64.  
  65. int main(int argc, char** argv)
  66. {
  67. int s, b, E, v;
  68. int i;
  69. char c;
  70. char buffer[BUFSIZE];
  71. char* trace_file;
  72. long long** cache;
  73. unsigned long long address;
  74. unsigned length;
  75.  
  76. v = 0; // подробный вывод
  77. hit_count = eviction_count = miss_count = 0;
  78. s = b = E = 0;
  79. usage = 0;
  80. trace_file = NULL;
  81.  
  82. while((c = getopt(argc, argv, "s:E:b:t:vh")) != -1)
  83. {
  84. if (c == 's')
  85. s = atoi(optarg);
  86.  
  87. else if (c == 'E')
  88. E = atoi(optarg);
  89.  
  90. else if (c == 'b')
  91. b = atoi(optarg);
  92.  
  93. else if (c == 't')
  94. trace_file = optarg;
  95.  
  96. else if (c == 'v')
  97. v = 1;
  98.  
  99. else
  100. fprintf(stderr, "No such option.\n");
  101. }
  102.  
  103. if (s == 0 || b == 0 || E == 0 || trace_file == NULL)
  104. {
  105. fprintf(stderr, "Not enough arguments.\n");
  106. return 0;
  107. }
  108.  
  109. // создание пустого кэша
  110. int s2 = 1 << s;
  111.  
  112. cache = malloc(s2 * sizeof(*cache));
  113.  
  114. for (i = 0; i < s2; i++)
  115. cache[i] = calloc(3 * E, sizeof(*cache[i]));
  116.  
  117. FILE* fp = fopen(trace_file, "r");
  118.  
  119. if (fp == NULL)
  120. {
  121. fprintf(stderr, "No such file.\n");
  122. return 0;
  123. }
  124. // первый символ - Г - игнорируется
  125. while (fgets(buffer, BUFSIZE, fp))
  126. {
  127. if (buffer[1] == 'S' || buffer[1] == 'M' || buffer[1] == 'L')
  128. {
  129. sscanf(buffer+2, "%llx,%u", &address, &length);
  130.  
  131. if (v == 1)
  132. printf("%c %llx,%u ", buffer[1], address, length);
  133.  
  134. csim(address, cache, s, E, b, v);
  135. }
  136.  
  137. if (buffer[1] == 'M')
  138. csim(address, cache, s, E, b, v);
  139. }
  140.  
  141. fclose(fp);
  142.  
  143. for (i = 0; i < s2; i++)
  144. free(cache[i]);
  145. free(cache);
  146.  
  147. printSummary(hit_count, miss_count, eviction_count);
  148.  
  149. return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement