Witam, zacząłem przygodę z programowaniem wielowątkowym i chciałem wypróbować ich efektywność w jednym z moich projektów - sieci neuronowych. Niżej zamieszczam prostą klasę Layer, której celem jest m.in. obliczanie wyjść wszystkich neuronów w danej warstwie (proste operacje matematyczne). Mój problem jest taki, że korzystanie z 2 wątków jest w większości przypadków znacznie mniej wydajne niż z 1...
No i moja prośba jest taka, żeby po pierwsze ktoś ocenił poniższy kod pod względem poprawności a po drugie jeśli możecie mi coś doradzić jak można to lepiej zorganizować - by efekty były bardziej widoczne :).
#pragma once
#include "Neuron.h"
#include <thread>
using namespace std;
class Layer
{
public:
Layer();
~Layer();
void get_outputs_standard() //standardowa funkcja
{
for(unsigned int i = 0; i < neurons.size(); i++)
outputs[i] = neurons[i].get_output(inputs);
}
void get_outputs_1_thread()
{
for(unsigned int i = 0; i < neurons.size() / 2; i++)
outputs[i] = neurons[i].get_output(inputs);
}
void get_outputs_2_thread()
{
for(unsigned int i = (neurons.size() / 2); i < neurons.size(); i++)
outputs[i] = neurons[i].get_output(inputs);
}
void set_neurons(int neurons_number, int input_number, double* inputs)
{
neurons.resize(neurons_number);
outputs.resize(neurons_number); //edit: tu był mały błąd ;)
this->inputs = inputs;
for(int i = 0; i < neurons_number; i++)
neurons[i].create_weights_array(input_number);
}
void go_threads();
void(Layer::*wsk)();
vector<double> outputs;
private:
vector<Neuron> neurons; //to można dać jako wskaźnik...
double* inputs;
};
inline void Layer::go_threads()
{
thread t1(&Layer::get_outputs_1_thread, this);
thread t2(&Layer::get_outputs_2_thread, this);
t1.join();
t2.join();
}
Mam nadzieję, że w/w kod nie wymaga komentarza - raczej nie ma tu nic skomplikowanego ;). Funkcja
get_output(double* inputs)
w klasie Neuron liczy sumę iloczynów wag i wejść do neuronu (inputów) i zwraca wynik wybranej funkcji z argumentem tego wyniku.