Помогите понять почему разный результат при последовательном и параллельном запуске, если каждая нить записывает в разные ячейки. Да, количество нитей больше чем ячеек.
class neuron
{
public:
neuron() //просто обычный конструктор со стартовым заполнением вектора для примера
{
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) // да, нитей больше чем итераций в цикле, но это не должно влиять
for (size_t i = 0; i < w.size(); ++i) //w.size() ==3
{
#pragma omp atomic
w[i] -= speed * derivative[i]; //вот тут какая то магия
// w[i] = w[i] - speed * derivative[i]; // вот так всё работает
}
}
vector <double> derivative;
vector <double> w;
};
int main(void)
{
neuron nn;
for (int i = 0; i < 100; i++) //просто сто раз меняем значение вектора в nn
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");
}
Смысл кода, 100 раз подряд меняется массив в классе. Для ускорения изменения вектора хочу использовать OMP. Но если в массиве элементов меньше чем нитей, то расходится результат при параллельном и последовательном запуске