C++ AMP 相關資料

之前 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 CUDAOpenCL,已經算是簡化不少了~再加上他是直接由編譯器支援,不需要額外的工具(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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。