commit 41eda53cdca66a7b7bc4fe607ceaf583a7813bd9
parent dd3ccf38152399b70af47457e51730f14dfe1d73
Author: David Freifeld <freifeld.david@gmail.com>
Date: Thu, 6 Aug 2020 19:53:34 -0700
Broken AVX functions are broken
Diffstat:
2 files changed, 20 insertions(+), 38 deletions(-)
diff --git a/src/bpnn.cpp b/src/bpnn.cpp
@@ -544,7 +544,7 @@ void Network::train()
epoch_acc = 1.0/((float) instances/batch_size) * acc_sum;
epoch_cost = 1.0/((float) instances/batch_size) * cost_sum;
validate(VAL_PATH);
- // printf("Epoch %i complete - cost %f - acc %f - val_cost %f - val_acc %f\n", epochs, epoch_cost, epoch_acc, val_cost, val_acc);
+ printf("Epoch %i complete - cost %f - acc %f - val_cost %f - val_acc %f\n", epochs, epoch_cost, epoch_acc, val_cost, val_acc);
batches=1;
rewind(data);
decay();
diff --git a/src/utils.cpp b/src/utils.cpp
@@ -104,75 +104,57 @@ Eigen::MatrixXf avx_product(Eigen::MatrixXf a, Eigen::MatrixXf b)
Eigen::MatrixXf avx_exp(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_exp_ps(_mm256_load_ps(arr1+i*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)));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}
Eigen::MatrixXf avx_cdiv(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++) {
+ for (int i = 0; i < (size-8)/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));
+ _mm256_store_ps(m.data()+i*8, _mm256_div_ps(_mm256_load_ps(m.data()+i*8), denom_vec));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}
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)));
+ 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)));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}
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++) {
+ 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(arr1+i*8, _mm256_pow_ps(_mm256_load_ps(arr1+i*8), exponent_vec));
+ _mm256_store_ps(m.data()+i*8, _mm256_pow_ps(_mm256_load_ps(m.data()+i*8), exponent_vec));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}
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)));
+ 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)));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}
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)));
+ 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)));
}
- Eigen::Map<Eigen::MatrixXf> dst (arr1, m.rows(), m.cols());
- return dst;
+ return m;
}