アクセラレータおよび accelerator_view オブジェクトの使用
使用できます、 アクセラレータ と accelerator_view クラスは、デバイスまたはエミュレーターは、AMP の C++ のコードを実行するを指定します。システムには、いくつかのデバイスまたはデバッグのサポート、または倍精度のサポート、メモリの量によって異なるエミュレーターを必要があります。C++ 高速大規模並列処理 (C++ AMP) 使用できるアクセラレータを調べて、既定値として設定、parallel_for_each、複数の呼び出しで複数のアクセラレータの指定、特別なデバッグ タスクを実行することができる Api を提供します。
既定のアクセラレータの使用
特定の 1 つを選択するコードを記述しない限り、AMP の C++ ランタイムは既定のアクセラレータを選択します。ランタイムは、既定のアクセラレータは次のとおり選択されます。
デバッグ モードでアプリケーションを実行している場合、アクセラレータは、デバッグをサポートします。
それ以外の場合は、アクセラレータが設定されている場合は、CPPAMP_DEFAULT_ACCELERATOR 環境変数で指定します。
それ以外の場合は、デバイスをエミュレートします。
それ以外の場合は、使用可能なメモリの最大量を持つデバイス。
それ以外の場合は、デバイスのディスプレイに接続されていません。
既定アクセラレータを作成し、そのプロパティを調べることによって、既定のアクセラレータのプロパティを確認できます。次のコード例は、パス、メモリ、および倍精度のサポート、既定のアクセラレータの印刷します。
void default_properties() {
accelerator default_acc;
std::wcout << default_acc.device_path << "\n";
std::wcout << default_acc.dedicated_memory << "\n";
std::wcout << (default_acc.supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
}
CPPAMP_DEFAULT_ACCELERATOR 環境変数
指定するには、CPPAMP_DEFAULT_ACCELERATOR 環境変数を設定することができます、 accelerator::device_pathの既定のアクセラレータ。パスは、ハードウェアに依存です。使用方法を次のコードをaccelerator::get_all関数を使用できるアクセラレータの一覧を取得し、各アクセラレータのパスを表示します。
void list_all_accelerators()
{
std::vector<accelerator> accs = accelerator::get_all();
for (int i = 0; i < accs.size(); i++) {
std::wcout << accs[i].device_path << "\n";
std::wcout << accs[i].dedicated_memory << "\n";
std::wcout << (accs[i].supports_double_precision ?
"double precision: true" : "double precision: false") << "\n";
}
}
アクセラレータを選択します。
アクセラレータを選択するを使用して、 accelerator::get_all使用できるアクセラレータの一覧を取得し、1 つを選択するには、メソッドはそのプロパティに基づいて。次の使用例は、最も多くのメモリが、アクセス キーの選択方法を示しています。
void pick_with_most_memory()
{
std::vector<accelerator> accs = accelerator::get_all();
accelerator acc_chosen = accs[0];
for (int i = 0; i < accs.size(); i++) {
if (accs[i].dedicated_memory > acc_chosen.dedicated_memory) {
acc_chosen = accs[i];
}
}
std::wcout << "The accelerator with the most memory is "
<< acc_chosen.device_path << "\n"
<< acc_chosen.dedicated_memory << ".\n";
}
[!メモ]
いずれかによって返されるアクセラレータのaccelerator::get_all CPU アクセラレータです。CPU アクセラレータでコードを実行することはできません。CPU アクセラレータをフィルタ リングするには、値を比較、 device_path プロパティによって返される、アクセラレータのaccelerator::get_allの値が、 accelerator::cpu_accelerator。詳細については、この資料の「特別なアクセラレータ」を参照してください。
既定アクセラレータを変更します。
呼び出すことによって、既定のアクセラレータを変更できます、 accelerator::set_defaultメソッド。GPU 上で任意のコードが実行される前にのみアプリケーションごとの実行し、変更する必要があると、既定のアクセラレータを変更できます。アクセラレータを変更するには任意の後続の関数呼び出しを返すfalse。呼び出しでは、別のアクセラレータを使用するかどうかはparallel_for_each、この資料の「複数のアクセラレータを使用して」」を読みます。コード例を次に示します既定アクセラレータをエミュレートされていませんをディスプレイに接続していないし、倍精度をサポートします。 1 に設定します。
bool pick_accelerator()
{
std::vector<accelerator> accs = accelerator::get_all();
accelerator chosen_one;
auto result =
std::find_if(accs.begin(), accs.end(), [] (const accelerator& acc)
{
return !acc.is_emulated &&
acc.supports_double_precision &&
!acc.has_display;
});
if (result != accs.end())
chosen_one = *(result);
std::wcout << chosen_one.description << std::endl;
bool success = accelerator::set_default(chosen_one.device_path);
return success;
}
複数のアクセラレータの使用
アプリケーションで複数のアクセラレータを使用する方法は 2 とおりあります。
渡すことができますaccelerator_viewオブジェクトへの呼び出しは、 parallel_for_each メソッド。
作成できます、 arrayを使用してオブジェクトacceleratorオブジェクト。C + AMP ランタイムが選択されます、 accelerator_viewオブジェクトから、キャプチャされたarrayラムダ式内のオブジェクト。
特別なアクセラレータ
デバイス パスの 3 つの特別なアクセラレータのプロパティとして使用できるには、 acceleratorクラス。
accelerator::direct3d_ref データ メンバー: このシングル スレッドのアクセラレータは、汎用のグラフィック カードをエミュレートするのに CPU 上のソフトウェアを使用します。デバッグ用に既定で使用されますが、ハードウェア アクセラレータよりも低速であるため、実稼動環境では役に立ちません。さらに、DirectX SDK および、Windows SDK でのみ利用可能で、お客様のコンピューターにインストールされている可能性がありますされていません。詳細については、「GPU コードのデバッグ」を参照してください。
accelerator::direct3d_warp データ メンバー: このアクセラレータは、ストリーミング SIMD 拡張命令 (SSE) を使用して、マルチコアの Cpu で AMP の C++ のコードを実行するため、代替ソリューションを提供します。
accelerator::cpu_accelerator データ メンバー: アレイのステージングを設定する、このアクセラレータを使用できます。AMP の C++ のコードを実行することはできません。詳細についてを参照してください、 ステージング アレイで C++ AMPの並列プログラミングにネイティブ コードのブログを投稿します。
相互運用性
AMP の C++ ランタイム間の相互運用性をサポートしている、 accelerator_viewクラスと、Direct3D ID3D11Device のインターフェイス。Create_accelerator_view メソッドは、 IUnknownインタ フェースと、 accelerator_viewオブジェクト。Get_device メソッドは、 accelerator_viewオブジェクトとは、 IUknownインターフェイス。