16

如果我为编译器启用 OpenMP,是否可以并行执行任何 STL 算法/容器操作,例如std::fillstd::transform ?我目前正在使用 MSVC 2008。或者也许还有其他方法可以使其并发?

谢谢。

4

4 回答 4

16

有许多项目旨在拥有并行 STL 类型库:

  1. OpenMP 多线程模板库
  2. libstdc++ 并行
  3. HPC++ 并行标准模板库
  4. 并行模式库(无耻地从 AshleysBrain 的回答中借用)
于 2010-03-30T18:40:25.640 回答
3

为了保证并行安全std::transformstd::fill您必须编写自己的版本。这些函数的常见实现是用于顺序执行。

让我们std::fill举一个简单的例子。在转换为并行时,您需要将函数分解为更小的函数,这些函数可以异步执行而没有任何相互依赖关系。例如,一个子功能可以填充前半部分,而第二个子功能可以填充后半部分。父函数必须委托(fork)两个子函数,并等待它们完成(加入)。

更大的问题是用于并行执行的运行时准备所花费的开销是否可以弥补实际的并行执行时间。大填充比小填充有更高的理由。

也许更好的想法是制作这些函数的线程安全版本并让线程并行执行,而不是拆分函数。

在将事物拆分为多个线程之前,首先尝试参考数据进行优化。在网络上搜索面向数据的设计。文章表明,通过优化执行以减少处理器缓存未命中,程序可以运行得更快。

于 2010-03-30T18:46:57.280 回答
2

当前的 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; 
  }

很明显,并行执行是不安全的(这需要专门的实现。)

这是Parallel Mode的 GCC 扩展。

于 2010-03-30T18:25:30.863 回答
2

Visual Studio 2010 提供了并行模式库,它具有并行执行的 STL 风格算法。当然,这是微软特定于 VS2010 的(我猜是更高版本)。

于 2010-03-30T22:16:21.347 回答