итератор zip с openmp не пойдет параллельно

Я пытаюсь использовать итератор zip (из библиотеки boost или тяги) с openmp. Моя цель состоит в том, чтобы иметь цикл for_each, который будет обрабатывать вещи параллельно через openmp.

На примере документации boost:

#pragma omp parallel for
std::for_each(
    boost::make_zip_iterator(
    boost::make_tuple(beg1, beg2)
),
    boost::make_zip_iterator(
    boost::make_tuple(end1, end2)
),
    zip_func()
);

Однако, похоже, это не работает параллельно.

Предложения?


person Noah    schedule 01.12.2011    source источник


Ответы (2)


Что вам нужно сделать, так это либо использовать omp parallel for, за которым следует цикл for, либо использовать gcc __gnu_parallel::for_each, как было предложено ранее, либо явно разделить диапазон итераций (обратите внимание на отсутствие for в прагме):

#pragma omp parallel
{
int tid = omp_get_thread_num();
int n   = omp_get_num_threads();
auto nbeg1, nbeg2, nend1, nend2  = ... // create n chunks of work, each thread takes one chunk
std::for_each(
  boost::make_zip_iterator(boost::make_tuple(nbeg1, nbeg2)),
  boost::make_zip_iterator(boost::make_tuple(nend1, nend2)),
  zip_func() );
}
person ipapadop    schedule 07.12.2011

Я не эксперт в OpenMP. Я думаю, что для использования прагмы omp OpenMP ожидает завершения построения, например:

#pragma omp parallel for 
{    
for (i = 0; i < N; i++)

Кроме того, я думаю, что std:for_each реализован с использованием OpenMP.

См. http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

person snatverk    schedule 04.12.2011
comment
Параллельный режим gcc должен быть явно включен. Поэтому, если вы не определите соответствующий заголовок или не используете пространство имен __gnu_parallel, он не войдет в этот путь кода. - person ipapadop; 07.12.2011