Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <emmintrin.h>
- char sum_array(const uint8_t a[], uint64_t n)
- {
- __m128i vsum = _mm_set1_epi32(0);
- uint64_t sum;
- uint64_t i;
- for (i = 0; i < n; i += 16)
- {
- __m128i v = _mm_load_si128((__m128i *)&a[i]);
- vsum = _mm_add_epi8(v, vsum);
- }
- sum = _mm_cvtsi128_si64(_mm_add_epi8(vsum, _mm_srli_si128(vsum, 8)));
- return
- (0xff & (sum >> 0*8)) +
- (0xff & (sum >> 1*8)) +
- (0xff & (sum >> 2*8)) +
- (0xff & (sum >> 3*8)) +
- (0xff & (sum >> 4*8)) +
- (0xff & (sum >> 5*8)) +
- (0xff & (sum >> 6*8)) +
- (0xff & (sum >> 7*8));
- }
- int main(int argc, char** argv) {
- if (argc < 1) {
- printf("Too few arguments!");
- return 0;
- }
- const char *memblock;
- int fd;
- struct stat sb;
- fd = open(argv[1], O_RDONLY);
- fstat(fd, &sb);
- uint64_t filesize = sb.st_size;
- printf("Size: %lu\n", filesize);
- memblock = mmap(NULL, filesize, PROT_READ, MAP_SHARED | MAP_POPULATE, fd, 0);
- if (memblock == MAP_FAILED) {
- printf("oh no it failed\n");
- return 0;
- }
- printf("The answer is: %d\n", sum_array(memblock, filesize));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement