Deepity
Ultra-fast, SIMD-accelerated Predictive Coding
Loading...
Searching...
No Matches
VectorMath.h
Go to the documentation of this file.
1#pragma once
2#include <cstddef>
3#include <immintrin.h>
4#include <omp.h>
5#include <sleef.h>
6
13
14namespace Deep
15{
17 static inline void expf_v(float *x, size_t n)
18 {
19 size_t simd_end = 0;
20
21#if defined(__AVX512F__)
22 simd_end = n - (n % 16);
23#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
24 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 16)
25 {
26 __m512 x_512 = _mm512_loadu_ps(x + i);
27 __m512 res = Sleef_expf16_u10avx512f(x_512);
28 _mm512_storeu_ps(x + i, res);
29 }
30
31#elif defined(__AVX2__)
32 simd_end = n - (n % 8);
33#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
34 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 8)
35 {
36 __m256 x_256 = _mm256_loadu_ps(x + i);
37 __m256 res = Sleef_expf8_u10avx2(x_256);
38 _mm256_storeu_ps(x + i, res);
39 }
40
41#elif defined(__SSE2__)
42 simd_end = n - (n % 4);
43#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
44 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 4)
45 {
46 __m128 x_128 = _mm_loadu_ps(x + i);
47 __m128 res = Sleef_expf4_u10sse2(x_128);
48 _mm_storeu_ps(x + i, res);
49 }
50#endif
51
52 for (size_t i = simd_end; i < n; ++i)
53 {
54 x[i] = Sleef_expf_u10(x[i]);
55 }
56 }
57
59 inline void logf_v(float *x, size_t n)
60 {
61 size_t simd_end = 0;
62
63#if defined(__AVX512F__)
64 simd_end = n - (n % 16);
65#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
66 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 16)
67 {
68 __m512 x_512 = _mm512_loadu_ps(x + i);
69 __m512 res = Sleef_logf16_u10avx512f(x_512);
70 _mm512_storeu_ps(x + i, res);
71 }
72
73#elif defined(__AVX2__)
74 simd_end = n - (n % 8);
75#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
76 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 8)
77 {
78 __m256 x_256 = _mm256_loadu_ps(x + i);
79 __m256 res = Sleef_logf8_u10avx2(x_256);
80 _mm256_storeu_ps(x + i, res);
81 }
82
83#elif defined(__SSE__) || defined(_M_AMD64) || defined(_M_X64)
84 simd_end = n - (n % 4);
85#pragma omp parallel for schedule(static) if (n > 65536 && !omp_in_parallel())
86 for (ptrdiff_t i = 0; i < (ptrdiff_t)(simd_end); i += 4)
87 {
88 __m128 x_128 = _mm_loadu_ps(x + i);
89 __m128 res = Sleef_logf4_u10sse2(x_128);
90 _mm_storeu_ps(x + i, res);
91 }
92#endif
93 for (size_t i = simd_end; i < n; ++i)
94 {
95 x[i] = Sleef_logf_u10(x[i]);
96 }
97 }
98} // namespace Deep
This file exists to provide both Tensor.h and IComputeBackend.h with device types without introducing...
Definition Backend.cpp:10
static void expf_v(float *x, size_t n)
In-place vectorized exp: x[i] = exp(x[i]) for all i.
Definition VectorMath.h:17
void logf_v(float *x, size_t n)
In-place vectorized log: x[i] = log(x[i]) for all i.
Definition VectorMath.h:59