Advertisement
bitwise_gamgee

Untitled

Jun 8th, 2023
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <immintrin.h>
  3.  
  4. size_t countEquality(size_t n, const int arr[], const int arr2[]) {
  5.     size_t res = 0;
  6.     const int chunkSize = 4;  // Number of elements processed in each iteration
  7.  
  8.     // Perform SIMD comparison and count true comparisons
  9.     for (size_t i = 0; i < n; i += chunkSize) {
  10.         __m128i xmm = _mm_loadu_si128((__m128i*)(arr + i));
  11.         __m128i xmm2 = _mm_loadu_si128((__m128i*)(arr2 + i));
  12.         __m128i cmpResult = _mm_cmpeq_epi32(xmm, xmm2);
  13.         int mask = _mm_movemask_ps(_mm_castsi128_ps(cmpResult));
  14.         res += __builtin_popcount(mask);
  15.     }
  16.  
  17.     return res;
  18. }
  19.  
  20. int main() {
  21.     const size_t n = 16;
  22.     int arr1[n];
  23.     int arr2[n];
  24.  
  25.     for (size_t i = 0; i < n; i++) {
  26.         arr1[i] = i + 1;
  27.         arr2[i] = (i % 4 == 2) ? 0 : i + 1;
  28.     }
  29.  
  30.     size_t count = countEquality(n, arr1, arr2);
  31.  
  32.     printf("Number of true comparisons: %zu\n", count);
  33.  
  34.     return 0;
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement