commit f5fa6c7f9d817bc8a7d79d8583d1d3ce864b592e
parent 7b914f114d89377afdbb4127c6afc14218cdb729
Author: David Freifeld <freifeld.david@gmail.com>
Date: Sun, 29 Nov 2020 11:09:08 -0800
Removed traces of AVX calls from master
Diffstat:
6 files changed, 2 insertions(+), 108 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -20,11 +20,6 @@ elseif (TRADEOFFS)
elseif (RECKLESS)
set(COMPILE_FLAGS "${COMPILE_FLAGS} -mavx -O3 -mavx -msse2 -msse3 -march=native -mfpmath=sse -DMKL_ILP64 -fno-pic -ffast-math -D NDEBUG -ffast-math -D RECKLESS")
endif()
-
-if (AVX)
- set(CMAKE_CXX_COMPILER "icpc")
- set(COMPILE_FLAGS "${COMPILE_FLAGS} -mavx -D AVX")
-endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -w -llz4")
diff --git a/readme.md b/readme.md
@@ -92,7 +92,6 @@ The five main configurations correspond to differing levels of optimization.
One you've selected a main optimization level, extra configurations can be passed in.
- `-DDEBUG=ON` enables debugging features in the compiler (and shows warnings).
-- `-DAVX=ON` enables explicit AVX function calls within the code. **Warning: this will not work without the Intel C++ Compiler!**
A sample build process would look like this:
diff --git a/src/bpnn.cpp b/src/bpnn.cpp
@@ -150,10 +150,6 @@ void Network::softmax()
Eigen::MatrixXf::Index maxRow, maxCol;
float max = m.maxCoeff(&maxRow, &maxCol);
m = (m.array() - max).matrix();
-#if (AVX)
- float sum = avx_exp(m).sum();
- m = avx_cdiv(avx_exp(m), sum);
-#else
float sum = 0;
for (int j = 0; j < layers[length-1].contents->cols(); j++) {
checknan(m(0,j), "input of Softmax operation");
@@ -163,7 +159,6 @@ void Network::softmax()
m(0,j) = exp(m(0,j))/sum;
checknan(m(0,j), "output of Softmax operation");
}
-#endif
layers[length-1].contents->block(i,0,1,layers[length-1].contents->cols()) = m;
}
}
@@ -220,7 +215,7 @@ float Network::cost()
checknan(tempsum, "total summation inside cost calculation");
}
for (int i = 0; i < layers.size()-1; i++) {
- if (reg_type == L2) reg += cwise_product(*layers[i].weights,*layers[i].weights).sum();
+ if (reg_type == L2) reg += layers[i].weights->cwiseProduct(*layers[i].weights).sum();
else if (reg_type == L1) reg += (layers[i].weights->array().abs().matrix()).sum();
}
return ((1.0/batch_size) * sum) + (1/2*lambda*reg);
@@ -276,7 +271,7 @@ Eigen::MatrixXf Network::backpropagate()
// TODO: Add nesterov momentum | -p B -t conundrum -t coding -m Without causing segmentation faults.
// (*layers[i].weights-((learning_rate * *layers[i].weights) + (0.9 * *layers[i].v))).transpose()
//grad_calc(gradients, counter, i)
- gradients.push_back(cwise_product(gradients[counter-1] * layers[i].weights->transpose(), *layers[i].dZ));
+ gradients.push_back((gradients[counter-1] * layers[i].weights->transpose()).cwiseProduct(*layers[i].dZ));
deltas.push_back(layers[i-1].contents->transpose() * gradients[counter]);
counter++;
}
diff --git a/src/bpnn.hpp b/src/bpnn.hpp
@@ -138,10 +138,4 @@ Eigen::MatrixXf l1_deriv(Eigen::MatrixXf m);
#define VAL_LZ4_PATH "./test.lz4"
#define TRAIN_LZ4_PATH "./train.lz4"
-#if (AVX)
-#define cwise_product(a,b) avx_product(a, b)
-#else
-#define cwise_product(a,b) (a).cwiseProduct(b)
-#endif
-
#endif /* MODULE_H */
diff --git a/src/utils.cpp b/src/utils.cpp
@@ -87,84 +87,3 @@ std::function<float(float)> rectifier(float (*activation)(float))
};
return rectified;
}
-
-#if (AVX)
-// Intel intrinsics for the win!
-Eigen::MatrixXf avx_product(Eigen::MatrixXf a, Eigen::MatrixXf b)
-{
-#ifndef RECKLESS
- assert(a.rows() == b.rows() && a.cols() == b.cols());
-#endif
- int size = ((a.rows() * a.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- _mm256_store_ps(a.data()+i*8, _mm256_mul_ps(_mm256_load_ps(a.data()+i*8), _mm256_load_ps(b.data()+i*8)));
- }
- for (int i = size-8; i < a.cols()*a.rows(); i++) *(a.data()+i) = *(a.data()+i) * *(b.data()+i);
- b = a.cwiseProduct(b);
- return a;
-}
-
-Eigen::MatrixXf avx_exp(Eigen::MatrixXf m)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- _mm256_store_ps(m.data()+i*8, _mm256_exp_ps(_mm256_load_ps(m.data()+i*8)));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = exp(*(m.data()+i));
- return m;
-}
-
-Eigen::MatrixXf avx_cdiv(Eigen::MatrixXf m, float denom)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- __m256 denom_vec = _mm256_broadcast_ss(&denom);
- _mm256_store_ps(m.data()+i*8, _mm256_div_ps(_mm256_load_ps(m.data()+i*8), denom_vec));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = *(m.data()+i) / denom;
- return m;
-}
-
-Eigen::MatrixXf avx_log(Eigen::MatrixXf m)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- _mm256_store_ps(m.data()+i*8, _mm256_log_ps(_mm256_load_ps(m.data()+i*8)));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = log(*(m.data()+i));
- return m;
-}
-
-
-Eigen::MatrixXf avx_pow(Eigen::MatrixXf m, float exponent)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- __m256 exponent_vec = _mm256_broadcast_ss(&exponent);
- _mm256_store_ps(m.data()+i*8, _mm256_pow_ps(_mm256_load_ps(m.data()+i*8), exponent_vec));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = pow(*(m.data()+i), exponent);
- return m;
-}
-
-
-Eigen::MatrixXf avx_tanh(Eigen::MatrixXf m)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- _mm256_store_ps(m.data()+i*8, _mm256_tanh_ps(_mm256_load_ps(m.data()+i*8)));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = tanh(*(m.data()+i));
- return m;
-}
-
-Eigen::MatrixXf avx_cosh(Eigen::MatrixXf m)
-{
- int size = ((m.rows() * m.cols()) + 7) & (-8);
- for (int i = 0; i < (size-8)/8; i++) {
- _mm256_store_ps(m.data()+i*8, _mm256_cosh_ps(_mm256_load_ps(m.data()+i*8)));
- }
- for (int i = size-8; i < m.cols()*m.rows(); i++) *(m.data()+i) = cosh(*(m.data()+i));
- return m;
-}
-#endif
diff --git a/src/utils.hpp b/src/utils.hpp
@@ -38,14 +38,6 @@ float leaky_relu(float x);
float leaky_relu_deriv(float x);
std::function<float(float)> rectifier(float (*activation)(float));
-Eigen::MatrixXf avx_product(Eigen::MatrixXf a, Eigen::MatrixXf b);
-Eigen::MatrixXf avx_exp(Eigen::MatrixXf m);
-Eigen::MatrixXf avx_cdiv(Eigen::MatrixXf m, float denom);
-Eigen::MatrixXf avx_log(Eigen::MatrixXf m);
-Eigen::MatrixXf avx_cpow(Eigen::MatrixXf m, float exponent);
-Eigen::MatrixXf avx_tanh(Eigen::MatrixXf m);
-Eigen::MatrixXf avx_cosh(Eigen::MatrixXf m);
-
Eigen::MatrixXf strassen_mul(Eigen::MatrixXf a, Eigen::MatrixXf b);
#endif /* MODULE_H */