如果我为编译器启用OpenMP,是否可以并行执行任何STL算法/容器操作,如 std :: fill , std :: transform ?我目前正在与MSVC 2008合作。 或者也许有其他方法使它并发?
感谢。
答案 0 :(得分:16)
有许多项目旨在拥有并行的STL类型库:
答案 1 :(得分:3)
为了保证std::transform
和std::fill
是并行安全的,您必须编写自己的版本。这些函数的通用实现是顺序执行。
让我们以std::fill
为例。在转换为并行时,您需要将函数分解为可以异步执行而没有任何相互依赖性的较小函数。例如,一个子功能可以填充前半部分,第二个子功能可以填充后半部分。父函数必须委托(fork)两个子函数,并等待它们完成(join)。
更大的问题是,在并行执行的运行时准备中花费的开销是否可以弥补实际的并行执行时间。大填充比较小的填充有更高的理由。
也许更好的想法是制作这些函数的线程安全版本并让线程并行执行,而不是拆分函数。
在将事物分成多个线程之前,首先尝试优化参考数据。在网络上搜索面向数据的设计。文章表明,通过优化执行来减少处理器缓存未命中,程序可以更快地运行。
答案 2 :(得分:2)
目前的C ++标准根本没有谈论线程,所以没有。 Here或多或少是关于STL线程安全的原始声明。
查看std::fill
的一个常见(GCC)实现:
template<typename _ForwardIter, typename _Tp>
void
fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
{
for ( ; __first != __last; ++__first)
*__first = __value;
}
很明显,并行执行并不安全(需要专门的实现。)
这是Parallel Mode的GCC扩展名。
答案 3 :(得分:2)
Visual Studio 2010提供Parallel Patterns Library,它具有并行执行的STL样式算法。当然,这是针对VS2010的微软特有的(我猜)。