Zip-итератор с openmp не будет идти параллельно - PullRequest
0 голосов
/ 01 декабря 2011

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

Используя пример из буст-документации:

#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()
);

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

Предложения

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Вам нужно либо использовать omp parallel for с последующим циклом aa 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() );
}
0 голосов
/ 04 декабря 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

...