簡體   English   中英

STL算法和並發編程

[英]STL algorithms and concurrent programming

如果我為我的編譯器啟用OpenMP,是否可以並行執行任何STL算法/容器操作,如std :: fillstd :: transform 我目前正在與MSVC 2008合作。 或者也許有其他方法使它並發?

謝謝。

有許多項目旨在擁有並行的STL類型庫:

  1. OpenMP多線程模板庫
  2. libstdc ++ parallel
  3. HPC ++並行標准模板庫
  4. 並行模式庫 (從AshleysBrain的答案中無恥地借用)

為了保證std::transformstd::fill是並行安全的,你必須編寫自己的版本。 這些函數的通用實現是順序執行。

讓我們把std::fill作為一個簡單的例子。 在轉換為並行時,您需要將函數分解為可以異步執行而沒有任何相互依賴性的較小函數。 例如,一個子功能可以填充前半部分,第二個子功能可以填充后半部分。 父函數必須委托(fork)兩個子函數,並等待它們完成(join)。

更大的問題是在並行執行的運行時准備中花費的開銷是否可以彌補實際的並行執行時間。 大填充比小填充有更高的理由。

也許更好的想法是制作這些函數的線程安全版本並讓線程並行執行,而不是拆分函數。

在將事物分成多個線程之前,首先嘗試參考數據進行優化。 在網上搜索面向數據的設計 文章表明,通過優化執行來減少處理器緩存未命中,程序可以更快地運行。

當前的C ++標准根本不討論線程,所以沒有。 這里或多或少是關於STL線程安全的原始聲明。

編輯:

看一下std::fill一個常見(GCC)實現:

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樣式算法。 當然,這是針對VS2010的微軟特有的(我猜)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM