「camp」の意味や使い方 わかりやすく解説 Weblio辞書 (original) (raw)
C++ AMP (C++ Accelerated Massive Parallelism) [1]とは、マイクロソフトが中心になって開発していた、演算アクセラレータを活用した並列プログラミングのためのC++言語拡張およびライブラリである。バックエンドとしてDirectCompute (DirectX) やOpenCLなどを使用した実装が存在している。C++ AMPによって、DirectComputeやOpenCLよりも高レベルの並列プログラミングAPIが提供される。
概要
マイクロソフトはWindows上においてGPGPUを標準化するために、DirectX 11にてDirectComputeを導入した。しかし、DirectComputeはDirect3D APIを直接操作する必要があるため、OpenMPを利用した一般的なCPU向けのC++並列プログラミングなどと比較してハードルが高い[2]。マイクロソフトはより抽象化された純粋C++プログラミングに近いGPU並列プログラミングモデルを提供するAPIおよび言語拡張として、2012年にC++ AMPの仕様を公開した[3]。また、マイクロソフトによるC++ AMPの公式プロプライエタリ実装として、Microsoft Visual C++ 2012はDirectComputeをバックエンドとした最初のC++ AMP対応コンパイラとなっている。
C++ AMPのライブラリおよびC++ AMPに対応したVisual C++コンパイラが付属しているのはVisual Studio 2012以降であるが、Visual Studio 2013ではC++ AMP v1.2規格に対応し、さらにコンピュートシェーダー以外のシェーダーステージとの相互運用やテクスチャフィルタリング(サンプラー)などの機能が強化されている[4] [5] [6]。しかしVisual C++ 2022以降、C++ AMPは非推奨となった[7]。
なお、C++ AMP自体はDirectCompute/Windows専用というわけではなく、またGPU専用というわけでもない[8]。AMDとマイクロソフトは、OpenCLなどをバックエンドとするLinuxやOS X向けのC++ AMP v1.2オープン実装を発表した[9]。その後、同コンパイラはMulticoreWareを経てRadeon Open Compute (ROCm) プラットフォームに移管され、Clamp, Kalmar, _HCC_と名前を変えながら開発が続けられていたが、2019年6月予定の最終リリースをもってHCCの開発が終了することになった[10]。HCCでは、OpenCLのカーネル記述言語"OpenCL C"や中間言語"SPIR"[11]、およびHSA (Heterogeneous System Architecture) の中間言語"HSAIL"[12]への変換層が提供され、Visual C++版よりもさらにヘテロジニアス環境向けを意識した実装となっている。
MSDNブログではCUDA、OpenCL、DirectComputeプログラマー向けに、各APIに対応するC++ AMP相当機能の比較資料が公開されている。
- C++ AMP for the CUDA Programmer - Parallel Programming in Native Code - Site Home - MSDN Blogs
- C++ AMP for the OpenCL Programmer - Parallel Programming in Native Code - Site Home - MSDN Blogs
- C++ AMP for the DirectCompute Programmer - Parallel Programming in Native Code - Site Home - MSDN Blogs
コード例
C++ AMPのコード例を示す。OpenMPの#pragma omp parallel for
のように、並列処理するコード単位すなわちカーネルを、C++11のラムダ式を使ってインラインで記述している部分が特徴的である。デフォルトのアクセラレーターを使用する場合、OpenCLやDirectComputeのような冗長なデバイス準備処理の記述も不要となる。
なおVisual C++実装では、実行環境にDirectX 11対応のGPUが搭載されている場合、restrict(amp)
句が指定されたコードの実行にはGPUが使用される[13]。対応GPUが搭載されていない場合は、Direct3D WARPデバイスやREFデバイスなどによるCPUエミュレーション実行(フォールバック)が提供される[14]。
等差数列を作成する例
#include <amp.h> using namespace concurrency;
int main() { const int ElemCount = 100; int ary[ElemCount]; array_view<int, 1> av(ElemCount, ary);
parallel_for_each(extent<1>(ElemCount),
[=](index<1> idx) restrict(amp)
{
int i = idx[0];
av[i] = i;
});
av.synchronize();
}
多次元配列の例
#include #include <amp.h> #include <amp_graphics.h>
using namespace concurrency; using namespace concurrency::graphics;
int main() { const int width = 10; const int height = 3; const int depth = 2; const int elemCount = width * height * depth;
std::vector<float_3> srcHost(elemCount);
std::vector<float_3> dstHost(elemCount);
for (int z = 0; z < depth; ++z)
for (int y = 0; y < height; ++y)
for (int x = 0; x < width; ++x)
{
srcHost[z * height * width + y * width + x] = float_3(float(x), float(y), float(z));
}
array_view<float_3, 3> srcView(depth, height, width, srcHost);
array_view<float_3, 3> dstView(depth, height, width, dstHost);
parallel_for_each(
dstView.extent,
[=](index<3> idx) restrict(amp)
{
const auto globalx = idx[2];
const auto globaly = idx[1];
const auto globalz = idx[0];
auto temp = srcView[idx];
if (globaly == 0)
{
temp += 0.5f;
}
if (globalz == 0)
{
temp *= -1;
}
dstView[idx] = temp;
});
dstView.synchronize();
for (int z = 0; z < depth; ++z)
for (int y = 0; y < height; ++y)
for (int x = 0; x < width; ++x)
{
const auto val = dstHost[z * height * width + y * width + x];
printf("[%d][%d][%d] = (%.1f, %.1f, %.1f)\n", z, y, x, val.x, val.y, val.z);
}
}
関連項目
参照
- ^ C++ AMP (C++ Accelerated Massive Parallelism)
- ^ 4Gamer.net ― 見えてきたAMDの次世代GPUアーキテクチャ。なぜAMDはVLIWを捨てるのか
- ^ MicrosoftがC++ AMP仕様を公開し、データ並列処理の障壁を下げる意向
- ^ Graphics (C++ AMP) | Microsoft Learn
- ^ Texture Copy Improvements in C++ AMP with Visual Studio 2013 - Parallel Programming in Native Code - Site Home - MSDN Blogs
- ^ C++ AMP Open Spec V1.2 Published - Parallel Programming in Native Code - Site Home - MSDN Blogs
- ^ C++ AMP Overview | Microsoft Learn
- ^ accelerator Class
- ^ AMDとMS,GPU演算用途向けのコンパイラ「C++ AMP v1.2」を発表 - 4Gamer.net
- ^ RadeonOpenCompute/hcc: HCC is an Open Source, Optimizing C++ Compiler for Heterogeneous Compute currently for the ROCm GPU Computing Platform
- ^ SPIR - The first open standard intermediate language for parallel compute and graphics
- ^ HSA Developer Tools - HSA Foundation
- ^ C++ AMP Overview
- ^ Using accelerator and accelerator_view Objects
外部リンク
- C++ AMP (C++ Accelerated Massive Parallelism) - MSDN (英語)
- multicoreware / hcc / wiki / Home — Bitbucket - オープン実装のC++ AMPコンパイラ
表話編歴並列計算 | |
---|---|
総論 | クラウドコンピューティング グリッド・コンピューティング 高性能計算 コンピュータ・クラスター 分散コンピューティング |
並列レベル | タスク データ ビット 命令 |
スレッド | スーパースレッディング(英語版) ハイパースレッディング |
理論 | アムダールの法則 グスタフソンの法則 コスト効率性(英語版) Karp-Flatt metric(英語版) Parallel slowdown(英語版) Speedup(英語版) |
要素 | スレッド ファイバー プロセス PRAM Instruction window(英語版) |
調整 | キャッシュコヒーレンシ 同期 バリア マルチスレッディング マルチプロセッシング メモリコヒーレンス Cache invalidation(英語版) Application checkpointing(英語版) |
プログラミング | スレッド (コンピュータ) 並列プログラミングモデル Implicit parallelism(英語版) Explicit parallelism(英語版) 並行性 フリンの分類 SISD SIMD MISD MIMD SPMD(英語版) Lock-freeとWait-freeアルゴリズム |
ハードウェア | スーパーコンピュータ スーパースカラー ベクトル計算機 マルチプロセッシング 対称型 非対称型 マルチコア メモリ NUMA en:COMA en:分散型 共有型 分散共有型 SMT MPP Beowulf |
API | Ateji PX(英語版) Boostスレッド C++ AMP Charm++(英語版) Cilk(英語版) Coarray Fortran(英語版) CUDA Dryad(英語版) Global Arrays(英語版) Intel Cilk Plus(英語版) Intel Threading Building Blocks MPI OpenACC OpenCL OpenHMPP(英語版) OpenMP PVM POSIXスレッド UPC |
問題 | en:Embarrassingly parallel en:Grand Challenge en:Software lockout |
並行計算 カテゴリ:並行計算 カテゴリ:並列コンピューティング |