之前 Heresy 已經有在《微軟發表用於 GPU 大量平行計算的 C++ AMP》中介紹過由微軟所提出,在下一代的 Visual C++、也就是 Visual C++ 11 裡,基於其自家 Direct X 11 技術的新的 GPGPU、使用顯示卡來做通用計算的語法、C++ AMP(Accelerated Massive Parallelism)了~而隨著 Visual Studio 11 Beta 的推出,現在要試玩的話,也都可以開始用了。
在 Heresy 來看,C++ AMP 最大的好處,是在於它的語法概念是採用 C++ STL 的 Function object 的概念,和 STL 提供的 algorithm 的用法非常地相近,在簡單的範例上非常地好寫~下面就是一個簡單的 C++ AMP 的例子:
#include <amp.h> using namespace concurrency; void AddArrays(int n, int * pA, int * pB, int * pSum) { array_view<int,1> a(n, pA); array_view<int,1> b(n, pB); array_view<int,1> sum(n, pSum); parallel_for_each( sum.extent, [=](index<1> i) restrict(amp) { sum[i] = a[i] + b[i]; } ); }
上面的例子,就是一個透過 C++ AMP 來做 GPGPU 大量平行化的陣列加法了~而對應到原來的程式,就是:
void AddArrays(int n, int * pA, int * pB, int * pSum) { for (int i=0; i<n; i++) { pSum[i] = pA[i] + pB[i]; } }
雖然還沒有像 OpenACC 一樣簡單,但是相較於 nVIDIA CUDA 或 OpenCL,已經算是簡化不少了~再加上他是直接由編譯器支援,不需要額外的工具(CUDA 和 OpenCL 都要特別的編譯器去編譯 GPU 部分的程式碼),而 Visual Studio 11 在整個圖形介面的開發環境裡,也有針對這方面加入了很強大的工具,所以在程式撰寫、除錯、最佳化上,應該也都會相對地方便不少~
如果想要學著在 Visual C++ 裡面使用 C++AMP 的話,建議可以參考《Harnessing GPU compute with C++ Accelerated Massive Parallelism》這份投影片或是線上影片(官網)(這裡似乎是更完整的投影片、PPTX),算是滿完整的一個入門教學了~
另外在《C++ AMP sample projects for download》這篇文章裡,也有提供不少 C++AMP 的範例程式可以下載。
而如果本來就有在使用其他架構寫 GPGPU 程式的話,微軟也有提供一些文件,告訴開發者 C++ AMP 大致是怎麼對應到其他 GPGPU 語言的,有需要的話可以參考下面的檔案:
目前除了微軟 MSDN 上的官方文件外,也還有很多資源,可以在微軟的 MSDN Blog 上找到了~有興趣的話,可以參考微軟的「Parallel Programming in Native Code」這個部落格,裡面有許多和 C++ AMP 相關的文章。
不過雖然目前感覺資料已經不少了,Heresy 至少在 Visual Studio 11 正式版出來之前,都還不會真得下去玩吧。而另外,由於 Heresy 這邊主要是希望可以寫跨平台的程式,所以實際上 C++ AMP 這種 Windows / VC++ only 的東西,可能也不太會認真玩就是了…
不過,雖然目前 C++ AMP 是微軟所提出的、只有 Visual C++ 11 可以用的語言,不過根據《C++ AMP open spec published》一文的說法,看來微軟是打算把 C++ AMP 當作一個開放的規格~他們不但有提供完整的規格書(PDF),也鼓勵所有人根據自己的平台、來實作出 C++ AMP!
不過至於會不會有人實作呢,這就要再看了;Heresy 滿希望 gcc 也能透過 OpenCL 這類的跨平台標準,來實作出 C++AMP 啊~如果有的話,以後就可以透過 C++ AMP 來寫跨平台的 GPGPU 程式了!不過,如果主流編譯器都能支援 OpenACC 應該會更好吧? XD
[…] C++ AMP 是微軟在 2011 年發表、在 2012 年推出的一套適用於 GPGPU、大量平行化的 C++ 函式庫。他基本上算是相對高階的 GPGPU 開發方案,由於底層是使用 DirectX 來做的,所以理論上能支援不同廠牌的顯示卡(參考《C++ AMP 相關資料》)。 […]
讚讚
[…] C++ AMP、來用顯示卡做大量平行計算(GPGPU),所以要使用的話,需要有一張支援 […]
讚讚
[…] CUDA 和 OpenCL 外,不管是像 Thrust 或 Bolt 這種以函式庫形式出發的,還是 C++AMP 以及 OpenACC […]
讚讚
不知道效能上有沒有比CUDA or OpenCL or OpenACC好?
不過C++ AMP 真的有比較好寫與除錯 但就是不容易最佳化吧
讚讚
Heresy 自己沒有做過效能測試。不過, Heresy 會把他定位成比較高階的用法,也就是可以比較簡單、快速地寫出 GPGPU 程式,但是在細部控制比較弱。
如果真的想把效能做很好的調校,應該還是要用 CUDA 或 Open CL。
讚讚
Using CUDA Libraries from C++ AMP
http://blogs.msdn.com/b/nativeconcurrency/archive/2012/08/15/using-cuda-libraries-from-c-amp.aspx
讚讚
Libraries for C++ AMP
http://blogs.msdn.com/b/nativeconcurrency/archive/2012/05/19/libraries-for-c-amp.aspx
讚讚
看起來有點像 Intel PBB, 但他應該把 lambda 編成 shader 了
讚讚
TBB
讚讚
如果是對應到傳統 GPGPU 的話,的確應該算是編譯成 shader。
讚讚
這樣不只遊戲等類程式可以利用顯卡 連一般的程式都可以使用 很期待這類技術普及的世代
讚讚
其實現在已經有很多軟體有在用 GPGPU 的技術了~
像是 Adobe 的多媒體軟體,很多都有用了。
另外少影片處理工具,也都有類似的功能。
讚讚