Я использую OpenMP, и мне нужно использовать операцию выборки и добавления. Однако OpenMP не предоставляет соответствующей директивы / вызова. Я хотел бы сохранить максимальную переносимость, поэтому я не хочу полагаться на встроенные функции компилятора.
Скорее, я ищу способ использовать атомарные операции OpenMP для реализации этого, но я зашел в тупик. Можно ли это вообще сделать? N.B., следующий код почти делает то, что я хочу:
#pragma omp atomic
x += a
Почти - но не совсем, так как мне действительно нужно старое значение x
. fetch_and_add
должен быть определен для получения того же результата, что и следующий (только без блокировки):
template <typename T>
T fetch_and_add(volatile T& value, T increment) {
T old;
#pragma omp critical
{
old = value;
value += increment;
}
return old;
}
(Эквивалентный вопрос может быть задан для сравнения и замены, но один может быть реализован в терминах другое, если я не ошибаюсь.)