Атомарные - это те, которые завершаются или не выполняются вообще. По идее это сложение, совмещённое с присваиванием, т.е. две операции.
Я понимаю, что такое атомарность, я не понимаю, почему вы считаете, что атомарность += специфицирована
Да, заметьте, что атомарность не означает "отсутствие блокировок" или "отсутствие цикла" (в частности, атомарное чтение shared_ptr вполне может содержать мьютекс)
Тут операция += атомарна? float dot_prod(float* a, float* b, int n) { float sum = 0.0f; #pragma omp parallel for shared(sum) for(int i=0; i<n; i++) { #pragma omp atomic sum += a[i] * b[i]; } return sum; }
а что написано в документации к #pragma omp atomic
вообще, пример чудесен тем, как не надо писать многопоточные программы
OMP не специфицируется стандартом языка, не входит в рамки языка вообще. Это - расширение конкретного компилятора. Поэтому, атомарно оно или нет, читай в документации на конкретный используемый компилятор. К С++ это не относится. Кроме того, очень хочу наконец узнать, кто же так вас пичкает этим несчастным OMP? В промышленной эксплуатации это не используется вообще никогда. Ну или почти. Зачем это изучать, я не очень понимаю.
Чтоб написать очередную бездарную поделку
Вот Костя очень правильно заметил, именно поэтому это OMP и не используют, потому что надо уметь распараллеливать программы, а не вот так вот, и на самом деле, чем больше независимость параллельных кусков кода, тем более эффективно это все работает. Общих переменных в параллельном коде быть не должно вообще, в идеале, либо по минимуму.
А чем лучше параллелить в 2021?
Руками, std thread, ну и корутины уже есть
Обсуждают сегодня