C++ Accelerated Massive Parallelism ( C++ AMP för kort ) är ett DirectX 11 -baserat bibliotek och öppen specifikation skapad av Microsoft för att implementera parallella program för hybridsystem i C++. C++AMP-systemet låter dig överföra beräkningar till GPU:er (videoacceleratorer) utan att göra ett stort antal ändringar i program. Kod som inte kan köras på GPU:n, till exempel på grund av dess komplexitet, kommer att köras automatiskt på CPU:n med hjälp av SIMD (SSE) instruktioner. Microsofts implementering av systemet (den enda hittills) ingår i Visual Studio 2012 och inkluderar en debugger och profilerare. Stöd för andra plattformar och hårdvara kan implementeras av Microsoft eller andra i framtiden.
Microsofts första version av C++ AMP kräver Windows 7 eller Windows Server 2008 R2. [ett]
Syntaxkonstruktionen " restrict(amp)" har lagts till i språket, som kan specificeras för vilken funktion som helst (inklusive en lambda-funktion), vilket indikerar att den kan köras på C++ AMP-acceleratorn. Nyckelordet restrict betyder i det här fallet att kompilatorn måste utvärdera om den givna funktionen är lämplig för GPU:n (om den bara använder de funktioner i C++-språket som kan köras på de flesta GPU:er).
Användningsexempel:
void myFunc () limit ( amp ) { // Funktionskod }Microsoft eller andra framtida leverantörer av C++ AMP-kompatibla system skulle kunna lägga till andra restriktioner utöver "amp".
Resten av C++ AMP är tillgänglig via en rubrikfil <amp.h>och namnutrymmet "samtidighet". C++ AMP-kärnklasser: array (databehållare för acceleratorn), array_view (dataomslag), index (punktkoordinater i N-dimensionell kartesisk rymd med heltalskoordinater), utsträckning (N-dimensionell heltalsdimension), accelerator (beräkningsenhet, t.ex. , GPU till vilken minne kommer att allokeras och beräkningen kommer att startas), accelerator_view (acceleratorvy).
En global funktion är också definierad parallel_for_eachsom låter dig definiera en parallell loop för C++ AMP.
Exempel på C++-funktion som använder C++ AMP för att summera två 2D-matriser:
void AddArrays ( int n , int m , int * pA , int * pB , int * pSum ) { concurrency :: array_view < int , 2 > a ( n , m , pA ), b ( n , m , pB ), summa ( n , m , pSum ); samtidighet :: parallell_för_varje ( summa . omfattning , [ = ]( samtidighet :: index < 2 > i ) begränsa ( amp ) { summa [ i ] = a [ i ] + b [ i ]; }); }