Visual Studio 2022 17.3

微軟在 2021 年底推出 Visual Studio 2022(17.0)後,也又推出了 17.117.2 兩次大更新了。目前看來大概就是以三個月一次的頻率,來推出新的次版號,所以現在微軟也又推出了新的 17.3 了!

官方的公告是《Visual Studio 2022 17.3 is now available!》。詳細的紀錄可以參考官方 release note

閱讀更多»

Visual C++ 終於正式支援 OpenMP 3 的 task 了

微軟的 Visual C++ 這幾年雖然對於 C++ 新的標準支援的算是相當積極,但是對於 OpenMP 的支援一直以來都很糟糕,儘管官方標準已經更新到 OpenMP 5.2 了,但是直到推出 Visual Studio 2019 的時候,卻還停留在 OpenMP 2.0 的超古老版本…

直到之前在 Visual Studio 2019 16.9 的時候,才終於試著開始幫 Visual C++ 的 OpenMP 加上新功能;當時主要的改進,是加入了 OpenMP 對於 SIMD 的支援,另外也開始試著要將 OpenMP 的實作切換到 LLVM 的版本。

而這次微軟又發布了《OpenMP Task Support for C++ in Visual Studio》,在最新的 Visual Studio 2022 17.2(還在預覽階段)中,在使用 LLVM OpenMP(加上 -openmp:llvm)的情況下,終於支援 OpenMP 3 的 task 這個 directive 了!

閱讀更多»

Visual Studio 2019 16.9 支援使用 OpenMP LLVM

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 版…即便很多人都有像微軟提出反映、建議,卻始終沒有獲得正面的回覆。

閱讀更多»

AMD 放大招了…推出 Boltzmann Initiative、支援 CUDA 程式的轉移!

NVIDIA 的 CUDA 架構,基本上應該算是現階段最成功的 GPGPU 環境之一。他在新一代、專門用來做大量平行計算的環境裡面,算是推出最早的,所以相對起來、發展的也算是最完整的;而後來雖然 Khronos 有推出跨硬體平台的開放標準 OpenCL(Intel、AMD、NVIDIA 都有支援),但是就 Heresy 所知,還是有許多開發人員是偏好 CUDA 的。

而 AMD 在 GPGPU 這一塊…個人是覺得發展的始終有點悲劇吧?Heresy 有紀錄的部分,他最早是推出自家的「Stream SDK」,而之後就徹底捨棄自己的語言、完全轉投向 OpenCL、Stream SDK 也改名為「AMD APP SDK」了。

儘管 AMD 也試著在靠 OpenCL、以及後來所推出、基於 AMD APU 的「Heterogeneous System Architecture」(異質系統架構、官網)來做平行計算的發展方向(AMD 稱之為「Heterogeneous Computing」、異質計算),但是實際上…就個人所知,成效似乎不算是很好。

閱讀更多»

GPGPU + SIMD、大改進的 OpenMP 4.0

很久以前,Heresy 曾經介紹過 OpenMP 這個超簡單的程式平行化的標準(參考);當時 Heresy 並沒有特別去管他的版本,不過實際上以 VisualStudio 來說,就算到了最新的 2013 版,也都還是只支援到 OpenMP 2.0(MSDN)。而實際上,OpenMP 在 2008 年就已經把標準更新到 3.0 了,而最新的版本,則是 2011 年的 3.1 版(維基百科)。

而在今年,OpenMP 則是發表了最新版的 OpenMP 4.0,做了相當大的改進!雖然現在似乎還沒有可以完整支援的編譯器(官方編譯器支援列表,不過似乎沒有更新的很快),不過這邊還是稍微來整理一下好了。

閱讀更多»

簡易的程式平行化-OpenMP(五) 變數的平行化

在將程式平行化的時候,其實還可能碰到一些問題。其中一個最大、最有可能碰到的,就是平行化後,每個執行緒裡的變數的獨立與否。下面是一個簡單的兩層迴圈的程式:

#pragma omp parallel for
for( int i = 0; i < 3; ++ i )
	for( int j = 0; j < 3; ++ j )
		Test2( i, j );

而裡面的函式 Test2() 內容如下

void Test2( int n, int m )
{
  printf( "<T:%d> - %d, %dn", omp_get_thread_num(), n, m );
}

閱讀更多»