Heresy 在 2006 年,就曾經寫過一系列在 Visual Studio 中使用 OpenMP 2.0 的文章;基本上,在 Heresy 來看,他應該是 C++ 環境中,最簡單的資料平行化開發標準了。
而實際上,OpenMP 後來也有持續推出新版本,像是在 2013 年,就有推出支援 GPGPU 和 SIMD 的 OpenMP 4.0 了;在 2019,也推出了 5.0 版(可以參考《What’s new in OpenMP 5.0》,目前最新是 5.1)。
不過很遺憾的是,Heresy 這邊的主要開發環境 Microsoft Visual Studio,卻打死不肯更新 OpenMP 的部分,所以對於 OpenMP 的 支援,始終是停留在古老的 2.0 版…即便很多人都有像微軟提出反映、建議,卻始終沒有獲得正面的回覆。
直到 2019,微軟才終於想起來還有 OpenMP 這個東西要更新,以「-openmp:experimental」的形式,幫 Visual Studio 的 OpenMP,加入了 SIMD 的支援。(參考:《SIMD Extension to C++ OpenMP in Visual Studio》)
但是儘管如此,他的 OpenMP 核心的部分還是 2.0,只是為了 AI 的應用,硬加上 SIMD 的部分而已。
而到了最近的 Visual Studio 2019 16.9 的更新,微軟則是又針對了 OpenMP 的部分做了更新,變成是實驗性質地提供「-openmp:llvm」的選項,讓程式改用 LLVM 的 OpenMP runtime 函式庫(官網)(感覺是放棄自己的 OpenMP 實作了)。
這個功能目前也還在實驗階段,僅支援有限度的 OpenMP 3.0 功能:
- for 迴圈平行化支援 unsigned int
- 有限度地支援 #pragma omp task
- 需搭配 -openmp:experimental
另外,OpenMP LLVM 現階段也僅能在 amd64 平台上使用。
整體來說,目前 MSVC 針對 OpenMP 的改進還是很有限,但是至少算是開始了。
根據微軟在《Improved OpenMP Support for C++ in Visual Studio》的說法,目前改用 LLVM runtime 只是第一步,接下來應該是會認真更新 OpenMP 的支援;預計接下來將會針對 x64、x64、arm64 加入 OpenMP 3.1 的支援。
再來,則是會支援不涉及 offloading 的 OpenMP 4.5 的支援;也就是說,以目前來看應該是不用期待 OpenMP 的 GPGPU 支援了。
實際在 Visula Studio 使用的話,應該是要在專案設定的「C/C++」的「命令列」中的「其他選項」,加入「/openmp:llvm /openmp:experimental」。(「/」和「–」都可以)
其中,llvm 和 experimental 是可以並存的;像如果要使用 SIMD 的話,experimental 就還是必要的參數。
而本來在「C/C++」的「語言」中的「開啟 MP 支援」(錯很久的翻譯…)則是可以整個拿掉。
如此一來,在 include <omp.h> 的時候,內部會變成是 include <omp_llvm.h>;從 <omp_llvm.h> 的內容來看,他應該是抓 OpenMP 5.0 的版本來?
而在執行時,則會需要 libomp140.x86_64.dll 這個新的 DLL 檔(debug 版是 libomp140d.x86_64.dll);相較於此,以前對應的檔案是 vcomp140.dll。
參考: