共用方式為


使用 accelerator 和 accelerator_view 物件

您可以使用 acceleratoraccelerator_view 類別指定裝置或模擬器來執行您的 AMP C++ 程式碼。 系統可能會包含數個記憶體大小,偵錯的支援,或雙精度支援等相異的裝置或模擬器。 C++ Accelerated Massive Parallelism (C++ AMP) 提供應用程式介面供您檢查可用的 accelerator ,設置其一為預設,指定多個 accelerator 予 parallel_for_each 多重呼叫,和執行特別的偵錯工作。

使用預設的 Accelerator

C++ AMP 執行階段將會選擇預設的 accelerator ,除非您撰寫程式碼來指定。 執行階段會如下選擇預設的 accelerator :

  1. 如果應用程式在偵錯模式下執行,則挑選支援偵錯的 accelerator 。

  2. 否則,如果 _DEFAULT_ACCELERATOR 有被設置的話,則挑選其指定的 accelerator 。

  3. 否則,選擇非模擬的裝置。

  4. 否則,選擇具有最多可用記憶體的裝置。

  5. 否則,選擇沒有被附加至顯示的裝置。

您可以透過建立預設的 accelerator 並檢查其屬性來判斷預設 accelerator 的屬性。 以下的範例程式碼印出預設 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";
}

Hh873132.collapse_all(zh-tw,VS.110).gifCPPAMP_DEFAULT_ACCELERATOR 環境變數

您可以設定 CPPAMP_DEFAULT_ACCELERATOR 環境變數,以指定預設加速器的accelerator::device_path。 這個路徑是硬體相依的。 下列程式碼會使用 accelerator::get_all 函式擷取可用的 accelerator 清單並各別顯示其路徑。

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

若要選取 accelerator ,請使用 accelerator::get_all 方法擷取可用的 accelerator 清單,接著根據其屬性選擇。 這個範例顯示如何挑選擁有最多記憶體的 accelerator :

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 所傳回的 accelerator 是 CPU accelerator 。您無法在 CPU accelerator 上執行程式碼。若要篩選掉 CPU accelerator ,您可以將 accelerator::get_all 所回傳的 accelerator 的 device_path 屬性值與 accelerator::cpu_accelerator 的值做比較。如需更多的資訊,請參閱本文「特殊的 Accelerator 」一節。

變更預設的 Accelerator

您可以藉由呼叫 accelerator::set_default 方法來改變預設的 accelerator 。 在應用程式每次執行時,您僅能改變預設的 accelerator 一次,並且它必須在任何程式碼開始於 GPU 上執行前完成。 任何接下來的 accelerator 變更函式呼叫均會回傳 false 。 如果您想要藉由呼叫 parallel_for_each 來使用不同的 accelerator ,請參閱本文「使用多個 Accelerator 」一節。 下列的範例程式碼將一個非模擬,未附加至顯示,並支援雙精度的 accelerator 設置為預設。

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

使用多個 Accelerator

有兩種方式可以在您的應用程式中使用多個 accelerator :

  • 您可以在呼叫 parallel_for_each accelerator_view 物件。

  • 您可以使用指定的 accelerator 物件來建立一個 array 物件。 C++ AMP 執行階段會從 lambda 運算式裏擷取的 array 物件來選取 accelerator_view 物件。

特殊的 Accelerator

三個特殊的 accelerator 的裝置路徑可以藉由 accelerator 的屬性來取得:

  • accelerator::direct3d_ref 資料成員: 此單執行緒 accelerator 使用在 CPU 上執行的軟體來模擬一張一般圖形卡。 它預設來偵錯,但因為比硬體加速器慢所以並不實用。 此外,它只能在 DirectX SDK 和 Windows SDK 上使用,您的客戶的電腦很可能沒有安裝它們。 如需詳細資訊,請參閱偵錯 GPU 程式碼

  • accelerator::direct3d_warp 資料成員: 此 accelerator 提供回退函式供在使用 Streaming SIMD Extensions (SSE) 的多核心電腦上執行的 C++ AMP 程式碼使用。

  • accelerator::cpu_accelerator 資料成員: 您可以使用此 accelerator 來設置階段式陣列。 它無法執行 C++ AMP 程式碼。 如需詳細資訊,請參閱 Parallel Programming in Native Code 部落格上的文章 Staging Arrays in C++ AMP

互通性

C++ AMP 執行階段可以在 accelerator_view ID3D11Device interface 間相互支援。 create_accelerator_view 方法接受IUnknown 介面,並傳回 accelerator_view 物件。 get_device 方法接受accelerator_view 物件,並傳回 IUknown 介面。

請參閱

參考

accelerator 類別

accelerator_view 類別

其他資源

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

偵錯 GPU 程式碼