C++ Accelerated Massive Parallelism ( zkráceně C++ AMP ) je knihovna založená na DirectX 11 a otevřená specifikace vytvořená společností Microsoft pro implementaci paralelních programů pro hybridní systémy v C++. Systém C++AMP umožňuje přenášet výpočty na GPU (video akcelerátory), aniž by bylo nutné provádět velké množství změn v programech. Kód, který nelze spustit na GPU, například kvůli jeho složitosti, bude automaticky spuštěn na CPU pomocí instrukcí SIMD (SSE). Implementace systému od Microsoftu (zatím jediná) je součástí Visual Studia 2012 a zahrnuje debugger a profiler. Podporu pro další platformy a hardware by mohl v budoucnu implementovat Microsoft nebo jiní.
První vydání C++ AMP od společnosti Microsoft vyžaduje Windows 7 nebo Windows Server 2008 R2. [jeden]
Do jazyka byla přidána konstrukce syntaxe " restrict(amp)", kterou lze zadat pro libovolnou funkci (včetně funkce lambda), což znamená, že ji lze spustit na akcelerátoru C++ AMP. Klíčové slovo omezení v tomto případě znamená, že kompilátor musí vyhodnotit, zda je daná funkce vhodná pro GPU (zda využívá pouze ty vlastnosti jazyka C++, které lze spustit na většině GPU).
Příklad použití:
void myFunc () limited ( amp ) { // Kód funkce }Microsoft nebo jiní budoucí dodavatelé systémů kompatibilních s C++ AMP by mohli kromě „amp“ přidat další specifikátory omezení.
Zbytek C++ AMP je dostupný prostřednictvím souboru záhlaví <amp.h>a jmenného prostoru „concurrency“. C++ třídy jádra AMP: pole (datový kontejner pro akcelerátor), array_view (obálka dat), index (souřadnice bodů v N-rozměrném kartézském prostoru s celočíselnými souřadnicemi), rozsah (N-rozměrný celočíselný rozměr), akcelerátor (výpočetní jednotka, např. , GPU, na kterém bude alokována paměť a bude spuštěn výpočet), accelerator_view (pohled akcelerátoru).
Je také definována globální funkce parallel_for_each, která umožňuje definovat paralelní smyčku pro C++ AMP.
Příklad funkce C++ používající C++ AMP k sečtení dvou 2D polí:
void AddArrays ( int n , int m , int * pA , int * pB , int * pSum ) { souběžnost :: array_view < int , 2 > a ( n , m , pA ), b ( n , m , pB ), součet ( n , m , pSum ); souběžnost :: parallel_for_each ( suma . rozsah , [ = ]( souběžnost :: index < 2 > i ) omezit ( amp ) { součet [ i ] = a [ i ] + b [ i ]; }); }