Выборка и добавление с использованием атомарных операций OpenMP

Я использую 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;
}

(Эквивалентный вопрос может быть задан для сравнения и замены, но один может быть реализован в терминах другое, если я не ошибаюсь.)

8
задан Konrad Rudolph 27 October 2010 в 15:27
поделиться