支援 C++20 的 Visual Studio 2019 16.10

雖然之前微軟已經預告今年夏天會推出 64 位元的 Visual Studio 2022 預覽版了,不過既有的 Visual Studio 2019 還是有在繼續更新的~

而這次推出的,則是號稱支援 C++20 完整功能的 16.10 正式版本了!官方的公告是:《Visual Studio 2019 v16.10 and v16.11 Preview 1 are Available Today!》。

閱讀更多»

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 );
}

閱讀更多»

簡易的程式平行化-OpenMP(二)語法說明

之前對於多執行緒和 OpenMP 的平行化已經做了些簡單的介紹,有興趣的可以回頭參考《簡易的程式平行化方法-OpenMP(一)》。而由於 Heresy 最近看了些資料,也做了些測試,所以主要可能想來講最近學的一些語法吧~

首先,在 Heresy 的認知裡,一般會用到 OpenMP 的部分分為三類:

而 function 的部份是獨立呼叫的,其實在一般的情況下,似乎不大會用到。而 directive 和 clause 的用法,大致上應該是:

#pragma omp directive [clause]

閱讀更多»

簡易的程式平行化方法-OpenMP(一)簡介

嗯~首先,Heresy 也是最近才開始試著用 openMP 的,所以其是這篇與其說是教學或介紹,倒不如說是學習心得會更為恰當。會不會繼續用?說實話也是未知數。總之,看著辦囉~

也希望有人對這東西有研究的話,能多多指教。


多執行緒的概念

目前雙核心的 CPU 當道,AMD 的 Athlon64x2、Intel 的 Pentium-D、Core Duo,以及即將上市的 Core 2 Duo,儼然將成為下一代電腦的主流(尤其是超低價的 Pentium D,絕對是現階段 C/P 值極高的雙核心 CPU)。但是雙核心有什麼用呢?

對於一般單一執行緒(single thread)的程式,多核心的處理器並沒有辦法提升它的處理效能;不過對於多執行緒(multi thread)的程式,就可以透過不同的核心同時計算,來達到加速的目的了!簡單的例子,以單執行緒的程式來說,一件事做一次要十秒的話,要做十次,都丟給同一顆核心做的話,自然就是 10 秒 * 10 次,也就是 100 秒了;但是以多執行緒的程式來說,它可以把這一件事,分給兩顆核心各自做,每顆核心各做 5 次,所以所需要的時間就只需要 50 秒!

當然,多執行緒的程式實際上沒這麼簡單。在工作的切割、結合上,也是要多花時間的,所以在現實中,即使最佳狀況,雙核心的效能也不會是 1 + 1 = 2 這樣的理想化。除此之外,也不是所有工作都是可以切割的!很多工作是有關聯性的,這樣如果直接切割給不同的處理核心各自去平行運算,出來的結果是肯定有問題的。而且,多執行緒的程式在編寫、維護上,也都比單一執行緒的程式複雜上不少。

不過,如果電腦本身是多處理器、多核心處理器,或是處理器擁有像 Intel Hyper-Threading Technology 這類的能在同一個時間處理多個執行緒的功能的話,那把各自獨立的工作由單一執行緒改成多執行緒,在執行的效率上,大多還是會有增進的!

閱讀更多»