TBB: локальные и глобальные результаты в parallel_for - PullRequest
1 голос
/ 09 ноября 2011

У меня вопрос относительно локальных значений в параллельном цикле и обновления глобальной переменной.

Пример в псевдокоде: я ищу максимальное значение в очень длинном векторе.Я могу сделать это в цикле, например:

int max;
for(i ...) {
    if (max < vector[i]) max = vector[i];
}

Я могу легко распараллелить это с OpenMP:

int max;
#pragma omp parallel
{
    int local_max;
#pragma omp parallel for
    for(i ...) {
        if (local_max < vector[i]) local_max = vector[i];
    }

#pragma omp critical
    {   
        // choose the best solution from all
        if (max < local_max) max = local_max; local_max
    }
}

Как я могу сделать то же самое в TBB parallel_for?Я не запрашиваю точный код, я хотел бы просто узнать, как обновить глобальный результат в конце цикла , а не на каждой итерации ...

(яновичок в TBB)

1 Ответ

2 голосов
/ 09 ноября 2011

То, что вы делаете в этом примере, называется сокращением, поэтому используйте parallel_reduce. Это должно быть более эффективным, чем обновление глобальной переменной под блокировкой. Основная идея состоит в том, что local_max является переменной-членом класса тела для parallel_reduce, а его метод join() получает другой экземпляр тела и обновляет local_max, чтобы оно было больше текущего значения и значения в другой экземпляр. Затем после вызова параллельного_редуцирования вы берете значение local_max из исходного объекта body и присваиваете его глобальной переменной.

...