У меня есть parallel for
в программе на С ++, которая должна зацикливаться до некоторого количества итераций. Каждая итерация вычисляет возможное решение для алгоритма, и я хочу выйти из цикла, как только я нахожу допустимый (это нормально, если сделано несколько дополнительных итераций). Я знаю, что число итераций должно быть исправлено с начала в parallel for
, но поскольку я не увеличиваю число итераций в следующем коде, есть ли какая-либо гарантия того, что эти потоки проверяют условие, прежде чем продолжить свою текущую итерацию?Уменьшение количества итераций в OpenMP parallel для
void fun()
{
int max_its = 100;
#pragma omp parallel for schedule(dynamic, 1)
for(int t = 0; t < max_its; ++t)
{
...
if(some condition)
max_its = t; // valid to make threads exit the for?
}
}
В этом случае все потоки выполняют все свои итерации, но они просто проверяют в начале, если они должны что-то сделать в этот момент, нет? – ChronoTrigger
Нет. Только один поток будет выполнять все итерации, создавая задачи для использования других потоков. Планировщик (зависящий от реализации) решает, как сопоставлять задачи с потоками, чтобы он занимал больше времени. –
Я думаю, что 'found = true' является атомарным (потому что это простое назначение), без необходимости директивы omp. – ChronoTrigger