Advertisement
Guest User

Untitled

a guest
May 13th, 2014
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <sys/mman.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <emmintrin.h>
  9. char sum_array(const uint8_t a[], uint64_t n)
  10. {
  11. __m128i vsum = _mm_set1_epi32(0);
  12. uint64_t sum;
  13. uint64_t i;
  14.  
  15. for (i = 0; i < n; i += 16)
  16. {
  17. __m128i v = _mm_load_si128((__m128i *)&a[i]);
  18. vsum = _mm_add_epi8(v, vsum);
  19. }
  20. sum = _mm_cvtsi128_si64(_mm_add_epi8(vsum, _mm_srli_si128(vsum, 8)));
  21. return
  22. (0xff & (sum >> 0*8)) +
  23. (0xff & (sum >> 1*8)) +
  24. (0xff & (sum >> 2*8)) +
  25. (0xff & (sum >> 3*8)) +
  26. (0xff & (sum >> 4*8)) +
  27. (0xff & (sum >> 5*8)) +
  28. (0xff & (sum >> 6*8)) +
  29. (0xff & (sum >> 7*8));
  30. }
  31.  
  32. int main(int argc, char** argv) {
  33. if (argc < 1) {
  34. printf("Too few arguments!");
  35. return 0;
  36. }
  37. const char *memblock;
  38. int fd;
  39. struct stat sb;
  40.  
  41. fd = open(argv[1], O_RDONLY);
  42. fstat(fd, &sb);
  43. uint64_t filesize = sb.st_size;
  44. printf("Size: %lu\n", filesize);
  45.  
  46. memblock = mmap(NULL, filesize, PROT_READ, MAP_SHARED | MAP_POPULATE, fd, 0);
  47. if (memblock == MAP_FAILED) {
  48. printf("oh no it failed\n");
  49. return 0;
  50. }
  51. printf("The answer is: %d\n", sum_array(memblock, filesize));
  52. return 0;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement