moving bassis function out of network

This commit is contained in:
2015-08-29 17:09:44 +02:00
parent 520654ce02
commit b664988da6
2 changed files with 7 additions and 35 deletions

View File

@@ -56,11 +56,9 @@ FeedForward::FeedForward(std::initializer_list<size_t> s, double lam, FeedForwar
outputs[i]= new float[layeSize];
inputs[i]= new float[layeSize];
potentials[i][0]=1.0;
outputs[i][0]=1.0;
for (int j=1;j<layeSize;j++)
{
potentials[i][j]=1.0;
weights[i][j]= new float[prev_size];
for(int k=0;k<prev_size;k++)
{
@@ -111,35 +109,10 @@ void FeedForward::solvePart(float *newSolution, register size_t begin, size_t en
if(prevSize >=4 && function !=nullptr)
{
__m128 partialSolution;
__m128 w;
__m128 sols;
register size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
size_t alignedPrev=prevSize>16?(prevSize-(prevSize%16)):0;
for( size_t j=begin;j<end;j++)
{
partialSolution= _mm_setzero_ps();
w=_mm_setzero_ps();
for(register size_t k=alignedPrev;k<prevSize;k++)
{
w = _mm_load_ss(this->weights[layer][j]+k);
sols = _mm_load_ss(sol+k);
w=_mm_mul_ps(w,sols);
partialSolution=_mm_add_ps(partialSolution,w);
}
register float* memory=this->weights[layer][j];
for(register size_t k=0;k<alignedPrev;k+=sizeof(float))
{
w = _mm_load_ps(memory+k);
sols = _mm_load_ps(sol+k);
w=_mm_mul_ps(w,sols);
partialSolution=_mm_add_ps(partialSolution,w);
}
#ifdef USE_SSE2 //pre-SSE3 solution
partialSolution= _mm_add_ps(_mm_movehl_ps(partialSolution, partialSolution), partialSolution);
partialSolution=_mm_add_ss(partialSolution, _mm_shuffle_ps(partialSolution,partialSolution, 1));
#else
partialSolution = _mm_hadd_ps(partialSolution, partialSolution);
partialSolution = _mm_hadd_ps(partialSolution, partialSolution);
#endif
partialSolution=basisFunction(prevSize,weights[layer][j],sol,alignedPrev);
_mm_store_ss(inputs[layer]+j,partialSolution);
partialSolution=function->operator()(partialSolution);
_mm_store_ss(newSolution+j,partialSolution);
@@ -148,11 +121,7 @@ void FeedForward::solvePart(float *newSolution, register size_t begin, size_t en
{
for( size_t j=begin;j<end;j++)
{
float tmp=0;
for(register size_t k=0;k<prevSize;k++)
{
tmp+=sol[k]*weights[layer][j][k];
}
const float tmp=basisFunction(prevSize,weights[layer][j],sol);
inputs[layer][j]=tmp;
newSolution[j]=transfer[layer]->operator()(tmp);
}
@@ -176,7 +145,7 @@ Shin::Solution FeedForward::solve(const Shin::Problem& p)
for(register size_t i=1;i<layers;i++)
{
float* newSolution= outputs[i];
if(threads > 1 && (layerSizes[i] > 700 ||prevSize > 700)) // 700 is an guess about actual size, when creating thread has some speedup
if(threads > 1 && (layerSizes[i] > 700 || prevSize > 700)) // 700 is an guess about actual size, when creating thread has some speedup
{
std::vector<std::thread> th;
size_t s=1;

View File

@@ -7,6 +7,8 @@
#include "ActivationFunction/Sigmoid.h"
#include "ActivationFunction/ActivationFunction.h"
#include "BasisFunction/BasisFunction.h"
#include "BasisFunction/FeedForward.h"
#include <vector>
#include <initializer_list>
@@ -132,6 +134,7 @@ namespace NeuralNetwork
float **outputs=nullptr;
float **inputs=nullptr;
ActivationFunction::ActivationFunction **transfer=nullptr;
BasisFunction::FeedForward basisFunction =BasisFunction::FeedForward();
size_t *layerSizes=nullptr;
size_t layers;/**< Number of layers */
};