Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <immintrin.h>
- size_t countEquality(size_t n, const int arr[], const int arr2[]) {
- size_t res = 0;
- const int chunkSize = 4; // Number of elements processed in each iteration
- // Perform SIMD comparison and count true comparisons
- for (size_t i = 0; i < n; i += chunkSize) {
- __m128i xmm = _mm_loadu_si128((__m128i*)(arr + i));
- __m128i xmm2 = _mm_loadu_si128((__m128i*)(arr2 + i));
- __m128i cmpResult = _mm_cmpeq_epi32(xmm, xmm2);
- int mask = _mm_movemask_ps(_mm_castsi128_ps(cmpResult));
- res += __builtin_popcount(mask);
- }
- return res;
- }
- int main() {
- const size_t n = 16;
- int arr1[n];
- int arr2[n];
- for (size_t i = 0; i < n; i++) {
- arr1[i] = i + 1;
- arr2[i] = (i % 4 == 2) ? 0 : i + 1;
- }
- size_t count = countEquality(n, arr1, arr2);
- printf("Number of true comparisons: %zu\n", count);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement