C++AMP

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 ]; }); }

Se även

Anteckningar

  1. C++ AMP Ensidig sammanfattning Arkiverad 26 oktober 2012. // MSDN-bloggar  

Litteratur

  • Kate Gregory, Ade Miller. C++ Amp: Accelerated Massive Parallelism With Microsoft Visual C++ - Microsoft, 2012—326 sidor - ISBN 978-0-7356-6473-9
  • István Novák och andra. Börjar Windows 8-applikationsutveckling. — John Wiley & Sons, 2012—624 sidor — ISBN 978-1-118-22183-9 . Kapitel 13 "Skapa Windows 8-program med C++". Avsnittet "Att använda accelererad massiv parallellism" , sidorna 486-489
  • Sasha Goldstein och andra. Pro .NET-prestanda: Optimera dina C#-applikationer. - Apress, 2012-372 sidor - ISBN 978-1-4302-4458-5 . Kapitel 6 "Samtidighet och parallellism". Avsnittet "GPU Computing för allmänna ändamål" , sidorna 205—214

Länkar