Вот этот код:
#include <immintrin.h>

int gorilla(const int *a, int n, const int *b, int m) {
    int count = 0;
    int i = 0, j = 0;

    while (i + 8 <= n && j + 8 <= m) {
        __m256i vec_a = _mm256_loadu_si256((const __m256i*)&a[i]);
        __m256i vec_b = _mm256_loadu_si256((const __m256i*)&b[j]);

        int min_a = a[i];
        int max_a = a[i + 7];
        int min_b = b[j];
        int max_b = b[j + 7];

        if (max_a < min_b) {
            i += 8;
            continue;
        }
        if (max_b < min_a) {
            j += 8;
            continue;
        }
        
        __m256i vec_b0 = vec_b;
        __m256i vec_b1 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(0,7,6,5,4,3,2,1));
        __m256i vec_b2 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(1,0,7,6,5,4,3,2));
        __m256i vec_b3 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(2,1,0,7,6,5,4,3));
        __m256i vec_b4 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(3,2,1,0,7,6,5,4));
        __m256i vec_b5 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(4,3,2,1,0,7,6,5));
        __m256i vec_b6 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(5,4,3,2,1,0,7,6));
        __m256i vec_b7 = _mm256_permutevar8x32_epi32(vec_b, _mm256_set_epi32(6,5,4,3,2,1,0,7));
        
        __m256i cmp0 = _mm256_cmpeq_epi32(vec_a, vec_b0);
        __m256i cmp1 = _mm256_cmpeq_epi32(vec_a, vec_b1);
        __m256i cmp2 = _mm256_cmpeq_epi32(vec_a, vec_b2);
        __m256i cmp3 = _mm256_cmpeq_epi32(vec_a, vec_b3);
        __m256i cmp4 = _mm256_cmpeq_epi32(vec_a, vec_b4);
        __m256i cmp5 = _mm256_cmpeq_epi32(vec_a, vec_b5);
        __m256i cmp6 = _mm256_cmpeq_epi32(vec_a, vec_b6);
        __m256i cmp7 = _mm256_cmpeq_epi32(vec_a, vec_b7);
        
        __m256i cmp_all = _mm256_or_si256(
                _mm256_or_si256(_mm256_or_si256(cmp0, cmp1), _mm256_or_si256(cmp2, cmp3)),
                _mm256_or_si256(_mm256_or_si256(cmp4, cmp5), _mm256_or_si256(cmp6, cmp7))
        );
        
        int mask = _mm256_movemask_ps(_mm256_castsi256_ps(cmp_all));
        count += __builtin_popcount(mask);
        
        if (max_a <= max_b) {
            i += 8;
        } else {
            j += 8;
        }
    }
    
    while (i < n && j < m) {
        if (a[i] == b[j]) {
            count++;
            i++;
            j++;
        } else if (a[i] < b[j]) {
            i++;
        } else {
            j++;
        }
    }

    return count;
}
Должен решать задачу:
Submit a solution for bn02-5-c/floats/intrinsics-gorilla

Full score:	100
Run penalty:	1
Time limit:	1500 ms
Real time limit:	5 s
Memory limit:	64M
Open date:	2024-11-09 00:00:01
Deadline:	2024-12-17 23:59:59
Problem bn02-5: c/floats/intrinsics-gorilla

Напишите функцию int gorilla(const int *a, int n, const int *b, int m).

Горилла принимает строго возрастающую последовательность целых чисел a длины n и строго возрастающую последовательность целых чисел b длины m.

Горилла должна возвращать количество чисел, которые входят как a, так и в b.

Подсказка: используйте AVX инструкции.

 

Submit a solution

Language:	gcc - GNU C 11.3.0

но выводит:

N	Result	Time (sec)	Score
1	OK	0.006	0 (0)
2	OK	0.003	0 (0)
3	OK	0.004	0 (0)
4	OK	0.006	0 (0)
5	OK	0.041	0 (0)
6	OK	0.142	0 (0)
7	OK	0.337	0 (0)
8	OK	0.334	0 (0)
9	OK	0.338	0 (0)
10	OK	0.578	0 (0)
11	OK	0.591	0 (0)
12	OK	0.624	0 (0)
13	OK	0.558	0 (0)
14	OK	1.331	0 (0)
15	Time-limit exceeded	>1.500	0 (0)
16	Skipped	0.000	0 (0)
17	Skipped	0.000	0 (0)