commit 58fc2a8f6a8dd4bf58089f58918a07c2659e3a11
parent 0941c3bff9e747ff12392e1040712bb7ef31cba3
Author: David Freifeld <freifeld.david@gmail.com>
Date: Thu, 6 Aug 2020 00:26:08 -0700
More repetitive AVX functions
Diffstat:
| M | src/utils.cpp | | | 63 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 63 insertions(+), 0 deletions(-)
diff --git a/src/utils.cpp b/src/utils.cpp
@@ -117,3 +117,66 @@ Eigen::MatrixXf avx_exp(Eigen::MatrixXf m)
Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
return dst;
}
+
+Eigen::MatrixXf avx_div(Eigen::MatrixXf m, float denom)
+{
+ int size = ((m.rows() * m.cols()) + 7) & (-8);
+ float arr1[size];
+ memcpy(arr1, m.data(), sizeof(float)*m.cols()*m.rows());
+ for (int i = 0; i < size/8; i++) {
+ __m256 denom_vec = _mm256_broadcast_ss(denom);
+ _mm256_store_ps(arr1+i*8, _mm256_div_ps(_mm256_load_ps(arr1+i*8), denom_vec));
+ }
+ Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
+ return dst;
+}
+
+Eigen::MatrixXf avx_log(Eigen::MatrixXf m)
+{
+ int size = ((m.rows() * m.cols()) + 7) & (-8);
+ float arr1[size];
+ memcpy(arr1, m.data(), sizeof(float)*m.cols()*m.rows());
+ for (int i = 0; i < size/8; i++) {
+ _mm256_store_ps(arr1+i*8, _mm256_log_ps(_mm256_load_ps(arr1+i*8)));
+ }
+ Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
+ return dst;
+}
+
+Eigen::MatrixXf avx_pow(Eigen::MatrixXf m, float exponent)
+{
+ int size = ((m.rows() * m.cols()) + 7) & (-8);
+ float arr1[size];
+ memcpy(arr1, m.data(), sizeof(float)*m.cols()*m.rows());
+ for (int i = 0; i < size/8; i++) {
+ __m256 exponent_vec = _mm256_broadcast_ss(exponent);
+ _mm256_store_ps(arr1+i*8, _mm256_pow_ps(_mm256_load_ps(arr1+i*8), exponent_vec));
+ }
+ Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
+ return dst;
+}
+
+
+Eigen::MatrixXf avx_tanh(Eigen::MatrixXf m)
+{
+ int size = ((m.rows() * m.cols()) + 7) & (-8);
+ float arr1[size];
+ memcpy(arr1, m.data(), sizeof(float)*m.cols()*m.rows());
+ for (int i = 0; i < size/8; i++) {
+ _mm256_store_ps(arr1+i*8, _mm256_tanh_ps(_mm256_load_ps(arr1+i*8)));
+ }
+ Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
+ return dst;
+}
+
+Eigen::MatrixXf avx_cosh(Eigen::MatrixXf m)
+{
+ int size = ((m.rows() * m.cols()) + 7) & (-8);
+ float arr1[size];
+ memcpy(arr1, m.data(), sizeof(float)*m.cols()*m.rows());
+ for (int i = 0; i < size/8; i++) {
+ _mm256_store_ps(arr1+i*8, _mm256_cosh_ps(_mm256_load_ps(arr1+i*8)));
+ }
+ Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
+ return dst;
+}