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

對「C++ AMP 相關資料」的想法

  1. […] C++ AMP 是微軟在 2011 年發表、在 2012 年推出的一套適用於 GPGPU、大量平行化的 C++ 函式庫。他基本上算是相對高階的 GPGPU 開發方案,由於底層是使用 DirectX 來做的,所以理論上能支援不同廠牌的顯示卡(參考《C++ AMP 相關資料》)。 […]

  2. 不知道效能上有沒有比CUDA or OpenCL or OpenACC好?
    不過C++ AMP 真的有比較好寫與除錯 但就是不容易最佳化吧

    • Heresy 自己沒有做過效能測試。不過, Heresy 會把他定位成比較高階的用法,也就是可以比較簡單、快速地寫出 GPGPU 程式,但是在細部控制比較弱。
      如果真的想把效能做很好的調校,應該還是要用 CUDA 或 Open CL。

    • 其實現在已經有很多軟體有在用 GPGPU 的技術了~
      像是 Adobe 的多媒體軟體,很多都有用了。
      另外少影片處理工具,也都有類似的功能。

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料