Guest User

Untitled

a guest
Apr 11th, 2014
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.63 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <sys/mman.h>
  5. #include <omp.h>
  6.  
  7. #define KB (1024)
  8. #define MB (1024*KB)
  9. #define GB (1024ul*MB)
  10.  
  11. typedef struct {
  12.   void * data;
  13.   uint64_t len;
  14. } vec_t;
  15.  
  16. static inline vec_t vec_alloc(uint64_t size, uint64_t prot, uint64_t flags) {
  17.   return (vec_t){mmap(NULL, size, prot, MAP_PRIVATE | MAP_ANONYMOUS | flags, 0, 0), size};
  18. }
  19. static inline vec_t vec_allocrwp(uint64_t size) {
  20.   return vec_alloc(size, PROT_WRITE | PROT_READ, MAP_POPULATE);
  21. }
  22. static inline void vec_dealloc(vec_t v) {
  23.   munmap(v.data, v.len);
  24. }
  25.  
  26. typedef uint32_t v4_t __attribute__ ((__vector_size__ (16)));
  27.  
  28. static inline uint32_t vhsumm(v4_t v) {
  29.   return v[0] + v[1] + v[2] + v[3];
  30. }
  31.  
  32. static inline void * vend(vec_t v) {
  33.   return v.data + v.len;
  34. }
  35.  
  36. static inline void * vbegin(vec_t v) {
  37.   return v.data;
  38. }
  39.  
  40. static inline uint32_t vmhsumm(vec_t vec) {
  41.   v4_t * it = vbegin(vec), * end = vend(vec);
  42.   v4_t summ = {0};
  43.   do {
  44.     summ += *it++;
  45.   } while(it != end);
  46.   return vhsumm(summ);
  47. }
  48. #define vmhsumm(m) vmhsumm((vec_t){m, sizeof(m)})
  49.  
  50. static inline uint32_t vsumm(vec_t vec) {
  51.   v4_t * it = vbegin(vec), * end = vend(vec);
  52.   v4_t summ[4] = {{0}};
  53.   do {
  54.     summ[0] += *it++;
  55.     summ[1] += *it++;
  56.     summ[2] += *it++;
  57.     summ[3] += *it++;
  58.   } while(it != end);
  59.   return vmhsumm(summ);
  60. }
  61.  
  62. uint32_t summ(vec_t vec) {
  63.   uint32_t * it = vbegin(vec), * end = vend(vec);
  64.   uint32_t sum = 0;
  65.   do {
  66.     sum+= *it;
  67.   } while(++it != end);
  68.   return sum;
  69. }
  70.  
  71. static inline vec_t mvec_init(vec_t vec) {
  72.   uint32_t * it = vbegin(vec), t = 0, len = vec.len/4;
  73.   do {
  74.     *it++ = t++;
  75.   } while(t != len);
  76.   return vec;
  77. }
  78.  
  79. static  vec_t bench_f(vec_t vec, typeof(vsumm) f, uint64_t pass) {
  80.   uint32_t res = 0; uint64_t i = 0;
  81.   double start = omp_get_wtime();
  82.   do {
  83.     res = f(vec);
  84.   } while(++i != pass);
  85.   double time = omp_get_wtime() - start;
  86.   fprintf(stderr, "summ: %u, perf: %lfGB/s, pass_time: %lfs\n", res, ((vec.len * pass)/time)/GB, time/pass);
  87.   return vec;
  88. }
  89.  
  90. static inline void bench_vsumm(uint64_t pass_size, uint64_t total_size) {
  91.   vec_dealloc(bench_f(mvec_init(vec_allocrwp(pass_size)), vsumm, total_size/pass_size));  
  92. }
  93. // static inline void bench_summ(uint64_t pass_size, uint64_t total_size) {
  94. //   vec_dealloc(bench_f(mvec_init(vec_allocrwp(pass_size)), summ, total_size/pass_size));  
  95. // }
  96.  
  97. int main(void) {
  98. //   bench_summ((2 * KB), (32 * GB));
  99.   bench_vsumm((2 * KB), (32 * GB));
  100. //   bench_summ((2 * MB), (16 * GB));
  101.   bench_vsumm((2 * MB), (16 * GB));
  102. //   bench_summ(GB, (8 * GB));
  103.   bench_vsumm(GB, (8 * GB));
  104.   return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment