Guest User

memory_access_balljugglery

a guest
Oct 16th, 2016
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <sys/mman.h>
  6.  
  7. #define HALF_OF_BUFFER_SIZE 1024*1024*100
  8. #define BUFFER_SIZE 1024*1024*201
  9.  
  10. int main(){
  11.  
  12. struct timespec time1;
  13. struct timespec time2;
  14. int seconds, nanoseconds;
  15.  
  16. uint8_t *buffer = mmap(0, 1024*1024*202, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  17.  
  18. /* to make sure that the buffer is actually allocated */
  19. memset(buffer, 3, 1024*1024*200);
  20.  
  21. /* warmup */
  22. copy_aligned(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  23. copy_aligned(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  24. copy_aligned(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  25.  
  26. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  27. copy_aligned(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  28. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  29.  
  30. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  31. seconds = time2.tv_sec-time1.tv_sec-1;
  32. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  33. } else {
  34. seconds = time2.tv_sec-time1.tv_sec;
  35. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  36. }
  37. printf("aligned: %u sec, %u nsec\n", seconds, nanoseconds);
  38.  
  39. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  40. copy_unaligned(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  41. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  42.  
  43. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  44. seconds = time2.tv_sec-time1.tv_sec-1;
  45. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  46. } else {
  47. seconds = time2.tv_sec-time1.tv_sec;
  48. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  49. }
  50. printf("unaligned on aligned data: %u sec, %u nsec\n", seconds, nanoseconds);
  51.  
  52. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  53. copy_unaligned(buffer+HALF_OF_BUFFER_SIZE+1, buffer, HALF_OF_BUFFER_SIZE+1);
  54. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  55.  
  56. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  57. seconds = time2.tv_sec-time1.tv_sec-1;
  58. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  59. } else {
  60. seconds = time2.tv_sec-time1.tv_sec;
  61. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  62. }
  63. printf("unaligned on one byte unaligned data: %u sec, %u nsec\n", seconds, nanoseconds);
  64.  
  65. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  66. copy_unaligned(buffer+HALF_OF_BUFFER_SIZE+3, buffer, HALF_OF_BUFFER_SIZE+3);
  67. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  68.  
  69. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  70. seconds = time2.tv_sec-time1.tv_sec-1;
  71. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  72. } else {
  73. seconds = time2.tv_sec-time1.tv_sec;
  74. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  75. }
  76. printf("unaligned on three bytes unaligned data: %u sec, %u nsec\n", seconds, nanoseconds);
  77.  
  78. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  79. copy_aligned_nontemporal(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  80. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  81.  
  82. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  83. seconds = time2.tv_sec-time1.tv_sec-1;
  84. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  85. } else {
  86. seconds = time2.tv_sec-time1.tv_sec;
  87. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  88. }
  89. printf("aligned nontemporal: %u sec, %u nsec\n", seconds, nanoseconds);
  90.  
  91. clock_gettime(CLOCK_MONOTONIC_RAW, &time1);
  92. copy_naive(buffer+HALF_OF_BUFFER_SIZE, buffer, HALF_OF_BUFFER_SIZE);
  93. clock_gettime(CLOCK_MONOTONIC_RAW, &time2);
  94.  
  95. if ((time2.tv_nsec-time1.tv_nsec)<0) {
  96. seconds = time2.tv_sec-time1.tv_sec-1;
  97. nanoseconds = 1000000000+time2.tv_nsec-time1.tv_nsec;
  98. } else {
  99. seconds = time2.tv_sec-time1.tv_sec;
  100. nanoseconds = time2.tv_nsec-time1.tv_nsec;
  101. }
  102. printf("naive: %u sec, %u nsec\n", seconds, nanoseconds);
  103.  
  104. return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment