Смешивание атома С++ 11 и OpenMP

OpenMP имеет собственную поддержку для атомарного доступа, однако есть предпосылки для предпочтения атомарности С++ 11: они значительно более гибкие, и они являются частью стандарта. С другой стороны, OpenMP более мощный, чем библиотека потоков С++ 11.

Стандарт определяет библиотеку атомных операций и библиотеку поддержки потоков в двух отдельных главах. Это заставляет меня поверить, что компоненты для доступа атома являются ортогональными к используемой библиотеке потоков. Могу ли я комбинировать атомы С++ 11 и OpenMP?


Существует очень аналогичный вопрос о переполнении стека; однако он был в основном без ответа в течение трех лет, поскольку его ответ не отвечает на фактический вопрос.

Ответ 1

Интересно, что стандарт OpenMP 4.5 (2.13.6) имеет довольно туманную ссылку на атомарность С++ 11 или более конкретный std::memory_order:

Цель состоит в том, что, когда аналогичная операция существует в С++ 11 или C11, последовательная последовательная атомная конструкция имеет одинаковую семантику как атомная операция memory_order_seq_cst в С++ 11/C11. Аналогичным образом, не последовательная последовательная атомная конструкция имеет ту же семантику, что и атомная операция memory_order_relaxed в С++ 11/C11.

К сожалению, это только примечание, нет ничего, что бы определяло, что они играют хорошо вместе. В частности, даже последний предварительный просмотр OpenMP 5.0 по-прежнему относится к С++ 98 как единственная нормативная ссылка для С++. Таким образом, технически, OpenMP даже не поддерживает С++ 11.

Что в стороне, это, вероятно, будет работать большую часть времени на практике. Я согласен с тем, что использование std::atomic имеет меньший потенциал для проблем, если использовать вместе с OpenMP, чем потоки С++ 11. Но если есть какие-то проблемы, это может быть не так очевидно. Худший случай будет атомом, который не работает атомарно, хотя у меня есть серьезные проблемы с реалистичным сценарием, где это может произойти. В конце концов, это может не стоить того, и самое безопасное - придерживаться чистой версии OpenMP или чистого С++ 11 потока/атома.

Возможно, у Христа есть что сказать об этом, в то же время просмотрите этот ответ для более общей дискуссии. Хотя я немного устарел, я боюсь, что он все еще держится.