2016-08-27 2 views
-1

Я хочу распараллелить цикл for-loop с помощью OpenMP (я уже сам использовал std :: threads раньше, но это решение было довольно уродливым), однако это условие может измениться на каждой итерации. Вот пример того, что я имею в виду:OpenMP: возможно различное условие в петле

#pragma omp parallel for 
for(int i = 0; i < someVector.size(); i++) 
{ 
. . . 
if(something) 
    someVector.push_back(v); 
} 

Однако, это не работает. Кажется, что петля доходит до исходного значения someVector.size(). Есть ли способ распараллеливать такую ​​конструкцию в OpenMP?

+0

Является ли 'что-то' зависимым от' i'? – Barmar

+0

Нет, это не имеет никакого отношения к этому. –

+0

Тогда кажется маловероятным, что вы сможете распараллелить его, если он использует глобальные данные. – Barmar

ответ

0

OpenMP #pragma omp for понимает условие в цикле for. Он знает, что он выполняет итерации по номерам от 0 до некоторого максимума, поэтому он оценивает максимум в начале и затем делит произведение на несколько потоков. Если максимальное изменение во время выполнения цикла не имеет эффекта.

Кроме того, модификация std::vector, в то время как некоторые другие темы используют его, безусловно, небезопасны. Вы получите неопределенное поведение, возможно, сбой из-за доступа к свободной памяти после того, как вектор перемещал сохраненные данные при росте.

Вы можете заменить std::vector на некоторую потокобезопасную очередь. Затем вы можете свободно выскакивать и нажимать значения при одновременном использовании нескольких рабочих.

2

Этот код является несоответствующим: оператор for не имеет канонической формы, требуемой спецификацией, которая представляет собой цикл, который может быть аннотирован с помощью #pragma omp parallel for (раздел 2.6 OpenMP 4.5 spec).

Проблема заключается в условном выражении: spec заявляет, что если ваше условное выражение имеет форму i relational-op expr, expr должно быть выражением цикла, и это ограничение не выполняется вашим кодом.

Смежные вопросы