jacobian

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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:
MCMakeLists.txt | 5-----
Mreadme.md | 1-
Msrc/bpnn.cpp | 9++-------
Msrc/bpnn.hpp | 6------
Msrc/utils.cpp | 81-------------------------------------------------------------------------------
Msrc/utils.hpp | 8--------
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 */