@RadioRedFox
Java, Android, Python, SQL

С++, OpenMP, Разный результат при последовательном и параллельном запуске?

Помогите понять почему разный результат при последовательном и параллельном запуске, если каждая нить записывает в разные ячейки. Да, количество нитей больше чем ячеек.

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. Но если в массиве элементов меньше чем нитей, то расходится результат при параллельном и последовательном запуске
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@RadioRedFox Автор вопроса
Java, Android, Python, SQL
Это бага VisualStudio, Надо использовать int, size_t не поддерживается пока что
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы