Pomocí objektů akcelerátor a accelerator_view
Můžete použít třídy accelerator a accelerator_view, které umožňují určit, na kterém zařízení nebo emulátoru spustit kód AMP.Systém může mít několik zařízení nebo emulátorů, které se liší podle množství paměti, podpory ladění nebo podpory dvojité přesnosti.C++ AMP poskytuje rozhraní API, která umožňují zkoumat všechny dostupné akcelerátory, nastavení jednoho z nich jako výchozí, použití více akcelerátorů pro více volání na parallel_for_each a provádění zvláštních ladících úloh.
Použitím Výchozího akcelerátoru
Pokud nenapíšete kód pro výběr zvoleného akcelerátoru, zvolí modul runtime C++ AMP výchozí akcelerátor.Modul runtime zvolí výchozí akcelerátor takto:
Pokud je aplikace spuštěna v režimu ladění, akcelerátor podporující ladění.
V opačném případě akcelerátor zadaný proměnnou prostředí CPPAMP_DEFAULT_ACCELERATOR, pokud je nastavena.
Jinak – neemulované zařízení.
Jinak zařízení, které má největší velikost dostupné paměti.
Jinak zařízení, která není připojeno k zobrazení.
Můžete určit vlastnosti výchozího akcelerátoru sestavením a přezkoumáním vlastnosti výchozího akcelerátoru.Následující ukázka kódu zobrazí cestu, paměť a podporu dvojité přesnosti výchozího akcelerátoru.
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";
}
Proměnná prostředí CPPAMP_DEFAULT_ACCELERATOR
Můžete nastavit proměnnou prostředí CPPAMP_DEFAULT_ACCELERATOR zadáním accelerator::device_path výchozí akcelerátoru.Umístění je závislé na hardwaru.Následující kód používá funkci accelerator::get_all pro načtení seznamu dostupných akcelerátorů a zobrazení umístění každého akcelerátoru.
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";
}
}
Výběr akcelerátoru
Chcete-li vybrat akcelerátor, použijte metodu accelerator::get_all pro načtení seznamu dostupných akcelerátorů a následně vyberte jeden z nich na základě vlastností akcelerátoru.Tento příklad ukazuje, jak vybrat akcelerátor, který má nejvíce paměti:
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";
}
[!POZNÁMKA]
Jeden z akcelerátorů vrácený accelerator::get_all je akcelerátor procesoru.Kód nelze spustit na akcelerátoru procesoru.Chcete-li filtrovat akcelerátor procesoru, porovnejte hodnotu vlastnosti akcelerátoru device_path vrácenou accelerator::get_all s hodnotou accelerator::cpu_accelerator.Více informací naleznete v oddílu "Speciální akcelerátory" v rámci tomto tématu.
Změna výchozího akcelerátoru
Můžete změnit výchozí akcelerátor voláním accelerator::set_default metoda.Výchozí akcelerátor lze změnit pouze jednou za spuštění aplikace a je nutné jej změnit před spuštěním libovolného kódu v GPU.Jakákoli následná volání funkce změny akcelerátoru vrátí false.Pokud chcete použít jiný akcelerátor ve volání parallel_for_each, přečtěte si v této sekci článek "Použití více akcelerátorů".Následující ukázka kódu nastaví výchozí akcelerátor na akcelerátor, který není emulován, není připojen k zobrazení a podporuje dvojitou přesnost.
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;
}
Použití více akcelerátorů
Existují dvě možnosti použití více akcelerátorů v aplikaci:
Můžete předat objekt accelerator_view k volání metody parallel_for_each.
Můžete vytvořit objekt array pomocí zvláštní objektu accelerator.Modul runtime jazyka C+ AMP vybere objekt accelerator_view ze zachyceného objektu array v rámci výrazu lambda.
Speciální akcelerátory
Umístění zařízení tří speciálních akcelerátorů jsou dostupná jako vlastnosti třídy accelerator:
Datový člen Accelerator::direct3d_ref: Tento jedno vláknový akcelerátor používá software na procesoru pro emulaci obecné grafické kartyPoužívá se ve výchozím nastavení pro ladění, ale není užitečné ve výrobě, protože je pomalejší než hardwarové akcelerátory.Navíc je k dispozici pouze jako součást rozhraní DirectX SDK a Windows SDK a pravděpodobné nebude nainstalován na počítači zákazníka.Další informace naleznete v tématu Ladění kódu GPU.
Datový člen Accelerator::direct3d_warp: Tento akcelerátor poskytuje záložní řešení pro provádění kódu jazyka C++ AMP na více jádrových procesorech pomocí Streaming SIMD Extensions (SSE).
Datový člen Accelerator::cpu_accelerator: Pomocí tohoto akcelerátoru nastavíte pracovní pole.Nedokáže spustit kód jazyka C++ AMP.Další informace naleznete v příspěvku Pracovní pole v C++ AMP na blogu Paralelní programování v nativním kódu.
Vzájemná spolupráce
C++ AMP runtime podporuje interoperabilitu mezi třídou accelerator_view a rozhraním Direct3D ID3D11Device.Metoda Create_accelerator_view přebírá rozhraní IUnknown a vrací objekt accelerator_view.Metoda Get_device přebírá objekt accelerator_view a vrací rozhraní IUknown.