Может любая из операций алгоритмов/контейнера STL как станд.:: заливка, станд.:: преобразуйте быть выполненными параллельно, если я включаю OpenMP для своего компилятора? Я работаю с MSVC 2008 в данный момент. Или возможно существуют другие способы сделать это параллельным?
Спасибо.
Существует ряд проектов, направленных на создание параллельных библиотек типов STL:
Текущие стандарты C ++ вообще не говорят о потоках, поэтому нет. Здесь более или менее оригинальное утверждение о безопасности потоков STL.
Посмотрите на одну общую (GCC) реализацию std :: fill
:
template<typename _ForwardIter, typename _Tp>
void
fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
{
for ( ; __first != __last; ++__first)
*__first = __value;
}
Очевидно, что это небезопасно для параллельного выполнения (что потребует специальной реализации).
А вот расширение GCC для параллельного режима .
Чтобы гарантировать параллельную безопасность std :: transform
и std :: fill
, у вас будет написать свою версию. Обычная реализация этих функций предназначена для последовательного выполнения.
Возьмем std :: fill
в качестве простого примера. При преобразовании в параллельный вам нужно будет разбить функцию на более мелкие функции, которые могут выполняться асинхронно без каких-либо взаимозависимостей. Например, одна подфункция может заполнять первую половину, а вторая подфункция может заполнять вторую половину. Родительская функция должна делегировать (разветвлять) две подфункции и ждать, пока они закончатся (соединятся).
Более важный вопрос заключается в том, могут ли накладные расходы, потраченные на подготовку к параллельному выполнению во время выполнения, компенсировать фактическое время параллельного выполнения. Большие заливки имеют более высокое обоснование, чем мелкие.
Возможно, лучшая идея - сделать поточно-безопасные версии этих функций и заставить потоки выполняться параллельно, а не разделять функции.
Прежде чем разбивать вещи на несколько потоков, сначала попробуйте выполнить оптимизацию по данным. Найдите в Интернете Дизайн, ориентированный на данные . В статьях было показано, что за счет оптимизации выполнения для уменьшения промахов в кэше процессора программа может работать значительно быстрее.
Visual Studio 2010 предоставляет Библиотеку параллельных шаблонов , в которой есть алгоритмы в стиле STL, которые выполняются параллельно. Конечно, это специфично для VS2010 (и выше, я думаю) от Microsoft.