Атомарный доступ к неатомарному расположению памяти в C ++ 11 и OpenMP?

OpenMP, в отличие от C ++ 11, работает с атомарностью с точки зрения операций с памятью, а не переменных. Это позволяет, например, использовать атомарные операции чтения / записи для целых чисел, хранящихся в векторе с неизвестным размером во время компиляции:

std::vector<int> v;

// non-atomic access (e.g., in a sequential region):
v.resize(n);
...
v.push_back(i);
...

// atomic access in a multi-threaded region:
#pragma omp atomic write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];

В C ++ 11 этого достичь невозможно. Мы можем получить доступ к атомарным переменным как к неатомарным, ослабив модель памяти, но мы не можем изменить размер вектора атомных элементов.

Я понимаю, что есть причины, по которым C ++ не позволяет получить доступ к неатомарным переменным с помощью атомарных операций с памятью. Но мне интересно, почему эти причины не применимы и к OpenMP.

Например, в N4013, он сказал, что «Нет разумного способа полностью переносимого применения атомарных операций к данным, не объявленным как атомарные». Как это возможно, что OpenMP может гарантировать такую ​​переносимость, а C ++ нет?

6

Решение

Насколько я понимаю соответствующие стандарты, OpenMP имеет больше ограничений по использованию, чем C ++ 11, что позволяет переносить его без использования специальных типов. Например, OpenMP 4.5 говорит:

Если место хранения, обозначенное x, не выровнено по размеру (то есть, если выравнивание байтов x не кратно размеру x), то поведение атомарной области определяется реализацией.

С другой стороны, если C ++ 11 использует std::atomic<int>тогда компилятор обеспечит соответствующее выравнивание. В обоих случаях требуется выравнивание, но OpenMP и C ++ 11 отличаются тем, кто отвечает за обеспечение этого.

Как правило, между OpenMP и C ++ существуют философские различия, но перечислить их все сложно. Люди C ++ думают о переносимости всего, в то время как OpenMP нацелен на HPC.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]