Как мне распараллелить цикл for через C ++ std :: list с помощью OpenMP?

Я хотел бы перебрать все элементы в std :: list параллельно, используя OpenMP. Цикл должен иметь возможность изменять элементы списка. Есть ли для этого простое решение? Кажется, что OpenMP 3.0 поддерживает параллельные циклы for, когда итератор является итератором произвольного доступа, но не иначе. В любом случае я бы предпочел использовать OpenMP 2.0, поскольку у меня нет полного контроля над тем, какие компиляторы мне доступны.

Если бы мой контейнер был вектором, я мог бы использовать:

#pragma omp parallel for
for (auto it = v.begin(); it != v.end(); ++it) {
    it->process();
}

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

20
задан mshang 1 January 2012 в 01:46
поделиться