Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC target("mmx,sse,sse2,ssse3,sse4.1,sse4.2,avx,avx2,fma,avx512f,avx512bw,avx512cd,avx512dq,avx512vl")
- #include <immintrin.h>
- double xs[128] __attribute__((aligned (64))), ys[128] __attribute__((aligned (64)));
- double test_one(int i) {
- double s = 1e9;
- static point vec[N];
- int vsize = 0;
- for (int j = 0; j < N; ++j) {
- if (i == j) {
- continue;
- }
- vec[vsize] = p[i].to(p[j]);
- xs[vsize] = vec[vsize].x, ys[vsize] = vec[vsize].y;
- ++vsize;
- }
- for (int h = vsize; h < 128; ++h)
- xs[h] = 1e18, ys[h] = 1e17 + 50;
- for (int j = 0; j < vsize; ++j) {
- __m512d xj = _mm512_set1_pd(xs[j]), yj = _mm512_set1_pd(ys[j]);
- __m512d mins = _mm512_set1_pd(1e50);
- for (int h = j + 1; h < vsize; h += 8) {
- __m512d xc = _mm512_load_pd(xs + h), yc = _mm512_load_pd(ys + h);
- __m512d ans = _mm512_abs_pd(_mm512_fmsub_pd(xc, yj, _mm512_mul_pd(yc, xj)));
- mins = _mm512_min_pd(mins, ans);
- }
- s = min(s, _mm512_reduce_min_pd(mins));
- }
- return s / 2;
- }
Add Comment
Please, Sign In to add comment