View difference between Paste ID: vdHHii1A and aPgPQu2F
SHOW: | | - or go back to the newest paste.
1
#pragma GCC target("mmx,sse,sse2,ssse3,sse4.1,sse4.2,avx,avx2,fma,avx512f,avx512bw,avx512cd,avx512dq,avx512vl")
2
#include <immintrin.h>
3
4
5
double xs[128] __attribute__((aligned (64))), ys[128] __attribute__((aligned (64)));
6
7
double test_one(int i) {
8
	double s = 1e9;
9
	static point vec[N];
10
	int vsize = 0;
11
	for (int j = 0; j < N; ++j) {
12
		if (i == j) {
13
			continue;
14
		}
15
		vec[vsize] = p[i].to(p[j]);
16
		xs[vsize] = vec[vsize].x, ys[vsize] = vec[vsize].y;
17
		++vsize;
18
	}
19
	for (int h = vsize; h < 128; ++h)
20
		xs[h] = 1e18, ys[h] = 1e17 + 50;
21
	for (int j = 0; j < vsize; ++j) {
22
		__m512d xj = _mm512_set1_pd(xs[j]), yj = _mm512_set1_pd(ys[j]);
23
		__m512d mins = _mm512_set1_pd(1e50);
24
		for (int h = j + 1; h < vsize; h += 8) {
25
			__m512d xc = _mm512_load_pd(xs + h), yc = _mm512_load_pd(ys + h);
26
			__m512d ans = _mm512_abs_pd(_mm512_fmsub_pd(xc, yj, _mm512_mul_pd(yc, xj)));
27
			mins = _mm512_min_pd(mins, ans);
28
		}
29
		s = min(s, _mm512_reduce_min_pd(mins));
30
	}
31
	return s / 2;
32
}