Когда я запускаю код, я получаю разные результаты.Я хочу одновременно менять разные ячейки вектора в разных потоках.Ошибка возникает, когда потоков больше, чем ячеек (да, я знаю, что распараллеливать в таких случаях не оптимально, но я хочу понять, почему результат отличается).
это не работает
w[i] -= speed * derivative[i];
работает
w[i] = w[i] - speed * derivative[i];
весь код
#include <iostream>
#include <vector>
#include <numeric>
#include <string>
#include <iomanip>
#include <omp.h>
#include "windows.h"
using namespace std;
class neuron
{
public:
neuron() //constructor with starting filling for example
{
w.resize(3);
w[0] = 0.7700484068199707;
w[1] = 0.3427844318371112;
w[2] = 0.6822299620512033;
derivative.resize(3);
derivative[0] = 0.232342234223;
derivative[1] = 0.23232232234223;
derivative[2] = 0.23234334231113;
}
void correction_of_scales(const double& speed)
{
#pragma omp parallel for num_threads(8) //threads more than cells
for (size_t i = 0; i < w.size(); ++i)
{
#pragma omp atomic
w[i] -= speed * derivative[i]; //here is here is happening what the magic
//w[i] = w[i] - speed * derivative[i]; - and here it works without errors
}
}
vector <double> derivative;
vector <double> w;
};
int main(void)
{
neuron nn;
for (int i = 0; i < 100; i++) //a hundred times in a row change the vector
nn.correction_of_scales(0.01);
for (int i = 0; i < nn.w.size(); i++)
cout << scientific << setprecision(15) << nn.w[i] << endl;
system("pause");
}
Это то, что появляется, когда вы запускаете его последовательно
5.377061725969665e-01
1.104621094948808e-01
4.498866197400767e-01
Но чтопроисходит при параллельной работе
-6.24004998518318e-01
1.104621094948808e-01
4.498866197400767e-01