次の方法で共有


アクセラレータおよび accelerator_view オブジェクトの使用

使用できます、 アクセラレータaccelerator_view クラスは、デバイスまたはエミュレーターは、AMP の C++ のコードを実行するを指定します。システムには、いくつかのデバイスまたはデバッグのサポート、または倍精度のサポート、メモリの量によって異なるエミュレーターを必要があります。C++ 高速大規模並列処理 (C++ AMP) 使用できるアクセラレータを調べて、既定値として設定、parallel_for_each、複数の呼び出しで複数のアクセラレータの指定、特別なデバッグ タスクを実行することができる Api を提供します。

既定のアクセラレータの使用

特定の 1 つを選択するコードを記述しない限り、AMP の C++ ランタイムは既定のアクセラレータを選択します。ランタイムは、既定のアクセラレータは次のとおり選択されます。

  1. デバッグ モードでアプリケーションを実行している場合、アクセラレータは、デバッグをサポートします。

  2. それ以外の場合は、アクセラレータが設定されている場合は、CPPAMP_DEFAULT_ACCELERATOR 環境変数で指定します。

  3. それ以外の場合は、デバイスをエミュレートします。

  4. それ以外の場合は、使用可能なメモリの最大量を持つデバイス。

  5. それ以外の場合は、デバイスのディスプレイに接続されていません。

既定アクセラレータを作成し、そのプロパティを調べることによって、既定のアクセラレータのプロパティを確認できます。次のコード例は、パス、メモリ、および倍精度のサポート、既定のアクセラレータの印刷します。

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";
}

Hh873132.collapse_all(ja-jp,VS.110).gifCPPAMP_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インターフェイス。

参照

関連項目

accelerator クラス

accelerator_view クラス

その他の技術情報

C++ AMP (C++ Accelerated Massive Parallelism)

GPU コードのデバッグ