 |
Octopus
|
Go to the documentation of this file.
29#if defined(__AVX512F__) || defined(__AVX512PF__) || \
30 defined(__AVX512BW__) || defined(__AVX512ER__) || \
31 defined(__AVX512CD__) || defined(__AVX512DQ__) || \
37#define VEC_TYPE __m512d
38#define VEC_LD(addr) _mm512_load_pd(addr)
39#define VEC_LDU(addr) _mm512_loadu_pd(addr)
40#define VEC_ST(addr, vec) _mm512_stream_pd(addr, vec)
41#define VEC_STA(addr, vec) _mm512_store_pd(addr, vec)
42#define VEC_STU(addr, vec) _mm512_storeu_pd(addr, vec)
43#define VEC_FMA(aa, bb, cc) _mm512_fmadd_pd(aa, bb, cc)
44#define VEC_SCAL(aa) _mm512_set1_pd(aa)
45#define VEC_ADD(aa, bb) _mm512_add_pd(aa, bb)
46#define VEC_SUB(aa, bb) _mm512_sub_pd(aa, bb)
47#define VEC_ZERO _mm512_setzero_pd()
49#define FENCE _mm_mfence()
56#define VECTORIZATION_LEVEL "AVX512"
58#elif defined(__AVX2__)
62#if defined(__FMA4__) || defined(__FMA__)
66#define VEC_TYPE __m256d
67#define VEC_LD(addr) _mm256_load_pd(addr)
68#define VEC_LDU(addr) _mm256_loadu_pd(addr)
69#define VEC_ST(addr, vec) _mm256_stream_pd(addr, vec)
70#define VEC_STA(addr, vec) _mm256_store_pd(addr, vec)
71#define VEC_STU(addr, vec) _mm256_storeu_pd(addr, vec)
73#define VEC_FMA(aa, bb, cc) _mm256_macc_pd(aa, bb, cc)
75#define VEC_FMA(aa, bb, cc) _mm256_fmadd_pd(aa, bb, cc)
77#define VEC_FMA(aa, bb, cc) _mm256_add_pd(cc, _mm256_mul_pd(aa, bb))
79#define VEC_SCAL(aa) _mm256_set1_pd(aa)
80#define VEC_ADD(aa, bb) _mm256_add_pd(aa, bb)
81#define VEC_SUB(aa, bb) _mm256_sub_pd(aa, bb)
82#define VEC_ZERO _mm256_setzero_pd()
84#define FENCE _mm_mfence()
87#define VECTORIZATION_LEVEL "AVX2"
93#if defined(__FMA4__) || defined(__FMA__)
97#define VEC_TYPE __m128d
98#define VEC_LD(addr) _mm_load_pd(addr)
99#define VEC_LDU(addr) _mm_loadu_pd(addr)
100#define VEC_ST(addr, vec) _mm_stream_pd(addr, vec)
101#define VEC_STA(addr, vec) _mm_store_pd(addr, vec)
102#define VEC_STU(addr, vec) _mm_storeu_pd(addr, vec)
104#define VEC_FMA(aa, bb, cc) _mm_macc_pd(aa, bb, cc)
105#elif defined(__FMA__)
106#define VEC_FMA(aa, bb, cc) _mm_fmadd_pd(aa, bb, cc)
108#define VEC_FMA(aa, bb, cc) _mm_add_pd(cc, _mm_mul_pd(aa, bb))
110#define VEC_SCAL(aa) _mm_set1_pd(aa)
111#define VEC_ADD(aa, bb) _mm_add_pd(aa, bb)
112#define VEC_SUB(aa, bb) _mm_sub_pd(aa, bb)
113#define VEC_ZERO _mm_setzero_pd()
114#define FENCE _mm_mfence()
117#define VECTORIZATION_LEVEL "AVX"
121#elif defined(__ARM_NEON) && defined(__aarch64__)
126#define VEC_TYPE float64x2_t
127#define VEC_LD(addr) vld1q_f64(addr)
128#define VEC_LDU(addr) VEC_LD(addr)
129#define VEC_ST(addr, vec) vst1q_f64(addr, vec)
130#define VEC_STA(addr, vec) vst1q_f64(addr, vec)
131#define VEC_STU(addr, vec) VEC_ST(addr, vec)
132#define VEC_FMA(aa, bb, cc) vfmaq_f64(cc, aa, bb)
133#define VEC_SCAL(aa) vdupq_n_f64(aa)
134#define VEC_ADD(aa, bb) vaddq_f64(aa, bb)
135#define VEC_SUB(aa, bb) vsubq_f64(aa, bb)
136#define VEC_ZERO vdupq_n_f64(0.0)
139#define VECTORIZATION_LEVEL "NEON"
145#define VEC_TYPE double
146#define VEC_LD(addr) (addr)[0]
147#define VEC_LDU(addr) VEC_LD(addr)
148#define VEC_ST(addr, vec) (addr)[0] = vec
149#define VEC_STA(addr, vec) (addr)[0] = vec
150#define VEC_STU(addr, vec) VEC_ST(addr, vec)
151#define VEC_FMA(aa, bb, cc) ((aa) * (bb) + (cc))
152#define VEC_SCAL(aa) aa
153#define VEC_ADD(aa, bb) ((aa)+(bb))
154#define VEC_SUB(aa, bb) ((aa)-(bb))
158#define VECTORIZATION_LEVEL "default"
161#define max1(x) (((x) > 0) ? (x) : 1)