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