source: branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h @ 16351

Last change on this file since 16351 was 16351, checked in by gkronber, 8 months ago

#2915: fixed compile error after merge and made another change to native interpreter trying to resolve the differences when using abs and sqrt(). No success

File size: 4.1 KB
Line 
1#ifndef VECTOR_OPERATIONS_H
2#define VECTOR_OPERATIONS_H
3
4#define _USE_MATH_DEFINES
5#include <cmath>
6#include <cstring>
7
8#ifdef USE_VDT
9#include "vdt/vdtMath.h"
10#include "vdt/stdwrap.h"
11#define hl_exp vdt::fast_exp
12#define hl_log vdt::fast_log
13#define hl_sin vdt::fast_sin
14#define hl_cos vdt::fast_cos
15#define hl_tan vdt::fast_tan
16#define hl_sqrt vdt::fast_sqrt
17#define hl_pow vdt::fast_pow
18#define hl_round vdt::fast_round
19#else
20#define hl_exp std::exp
21#define hl_log std::log
22#define hl_sin std::sin
23#define hl_cos std::cos
24#define hl_tan std::tan
25#define hl_sqrt std::sqrt
26#define hl_pow std::pow
27#define hl_round std::round
28#endif
29
30constexpr int BATCHSIZE = 64;
31
32#define FOR(i) for(int i = 0; i < BATCHSIZE; ++i)
33
34// When auto-vectorizing without __restrict,
35// gcc and clang check for overlap (with a bunch of integer code)
36// before running the vectorized loop
37
38// vector - vector operations
39inline void load(double* __restrict a, double const * __restrict b) noexcept { std::memcpy(a, b, BATCHSIZE * sizeof(double)); }
40inline void add(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] += b[i]; }
41inline void sub(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] -= b[i]; }
42inline void mul(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] *= b[i]; }
43inline void div(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] /= b[i]; }
44inline void exp(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_exp(b[i]); }
45inline void log(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_log(b[i]); }
46inline void sin(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sin(b[i]); }
47inline void cos(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_cos(b[i]); }
48inline void tan(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_tan(b[i]); }
49inline void sqrt(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_sqrt(b[i]); }
50inline void pow(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], hl_round(b[i])); };
51inline void root(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(a[i], 1. / hl_round(b[i])); };
52inline void square(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = hl_pow(b[i], 2.); };
53inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = 1. / b[i]; }
54inline void neg(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = -b[i]; }
55inline void abs(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = std::fabs(b[i]); }
56inline void analytical_quotient(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] /= hl_sqrt(b[i]*b[i] + 1.); }
57
58// vector - scalar operations
59inline void load(double* __restrict a, double s) noexcept { FOR(i) a[i] = s; }
60inline void add(double* __restrict a, double s) noexcept { FOR(i) a[i] += s; }
61inline void sub(double* __restrict a, double s) noexcept { FOR(i) a[i] -= s; }
62inline void mul(double* __restrict a, double s) noexcept { FOR(i) a[i] *= s; }
63inline void div(double* __restrict a, double s) noexcept { FOR(i) a[i] /= s; }
64inline void pow(double* __restrict dst, double const * __restrict src, double s) noexcept { FOR(i) dst[i] = hl_pow(src[i], s); }
65
66// vector operations
67inline void neg(double* __restrict a) noexcept { FOR(i) a[i] = -a[i]; }
68inline void inv(double* __restrict a) noexcept { FOR(i) a[i] = 1. / a[i]; }
69inline void exp(double* __restrict a) noexcept { FOR(i) a[i] = hl_exp(a[i]); }
70inline void log(double* __restrict a) noexcept { FOR(i) a[i] = hl_log(a[i]); }
71inline void sin(double* __restrict a) noexcept { FOR(i) a[i] = hl_sin(a[i]); }
72inline void cos(double* __restrict a) noexcept { FOR(i) a[i] = hl_cos(a[i]); }
73inline void round(double* __restrict a) noexcept { FOR(i) a[i] = hl_round(a[i]); }
74inline void square(double* __restrict a) noexcept { FOR(i) a[i] = hl_pow(a[i], 2.); }
75
76#undef FOR
77#endif
Note: See TracBrowser for help on using the repository browser.