C++ AMP( C++ Accelerated Massive Parallelism )は、 C++プログラミング言語とそのランタイムライブラリにまたがる要素を含むネイティブプログラミングモデルです。グラフィックスカードやグラフィックス処理ユニット(GPU)などのデータ並列ハードウェア上でコンパイルおよび実行されるプログラムを簡単に作成できます。
Visual Studio 2022(バージョン17.0)以降、C++ AMPは非推奨となり、Visual Studio 2022以降はサポートが終了となります。
C++ AMPはDirectX 11上で実装されたライブラリであり、 MicrosoftがC++で直接データ並列処理を実装するためのオープン仕様です。開発者がGPUプログラミングを容易に行えるようにすることを目的としており、GPUに関する知識がまったくない状態(システムが最善を尽くす)から、より細かく制御できる状態まで、幅広いレベルに対応しつつ移植性も確保しています。Microsoftの実装では、GPU上で実行できないコードは代わりに1つ以上のCPUにフォールバックし、SSE命令を使用します。Microsoftの実装は、デバッガーとプロファイラーのサポートを含め、Visual Studio 2012に含まれています。
Microsoft による最初の C++ AMP リリースでは、少なくとも Windows 7 または Windows Server 2008 R2 が必要です。[ 1 ] C++ AMP はオープンな仕様であるため、いずれは Microsoft 以外の実装も登場するはずです。その初期の例の 1 つは、Intel によるClang – LLVMおよび Open Computing Language ( OpenCL )上での C++ AMP の実験的実装である Shevlin Park です。 [ 2 ]
2013 年 11 月 12 日、HSA Foundation は、現在のC++ AMP仕様をサポートするOpenCL、Standard Portable Intermediate Representation (SPIR)、およびHSA Intermediate Language (HSAIL) に出力する C++ AMP コンパイラを発表しました。 [ 3 ]ソースコードはhttps://github.com/RadeonOpenCompute/hccで入手できます。C++ AMP のサポートは廃止されたとみなされており、現在の ROCm 1.9 シリーズがそれをサポートする最後のバージョンとなります。[ 4 ]
C++AMPの基本的な概念、例えばC++クラスを用いて並列処理や異種プログラミング機能を表現するといった概念は、SYCL標準に大きな影響を与えている。
Microsoft は、restrict(amp)関数が C++ AMP アクセラレータで実行できることを宣言するために、任意の関数 (ラムダ式を含む) に適用できる機能を追加しました。コンパイラは自動的に計算カーネルを生成するため、管理の定型コードや別の言語を使用する必要がなくなります。restrict キーワードは、関数がほとんどの GPU でサポートされている言語機能のみを使用していることを静的にチェックするようにコンパイラに指示します。たとえば、void myFunc() restrict(amp) {…} Microsoft やオープン C++ AMP 仕様の他の実装者は、C++ AMP とは関係のない目的を含め、他の目的で他の restrict 指定子を追加できます。
新しい言語機能以外にも、C++ AMP の残りの機能は、<amp.h>concurrency 名前空間のヘッダー ファイルから利用できます。主要な C++ AMP クラスは、array(アクセラレータ上のデータを格納するコンテナ)、array_view(データのラッパー)、index(N 次元の点)、extent(N 次元のサイズ)、accelerator(メモリを割り当てて実行する GPU などの計算リソース)、accelerator_view(アクセラレータのビュー) です。グローバル関数を使用すると、parallel_for_each並列ループを記述できます。