Share via


Verwenden von accelerator-Objekten und accelerator_view-Objekten

Können Sie die Accelerator und Accelerator_view Klassen, die dem Gerät oder Emulator zum Ausführen des Codes C++ AMP auf angeben.Ein System möglicherweise mehrere Geräte und Emulatoren, die durch die Größe des Speichers unterscheiden Debuggen Unterstützung oder Unterstützung mit doppelter Genauigkeit.C++ Accelerated Massive Parallelism (C++ AMP) bietet APIs, die Sie verwenden können, überprüfen Sie die verfügbaren Schnellinfos, eine davon als Standard festlegen, Angeben mehrerer Zugriffstasten für mehrere Aufrufe von Parallel_for_each und spezielle Debugaufgaben ausführen.

Verwenden die Standard-Accelerator

Die AMP C++ Runtime wählt einen Standard-Accelerator, wenn Sie zum Auswählen einer bestimmten Code.Die Common Language Runtime wählt die Standard-Accelerator wie folgt:

  1. Wenn die Anwendung im Debugmodus ausgeführt wird, unterstützt eine Schnellinfo, das Debuggen.

  2. Andernfalls der Accelerator, die durch die CPPAMP_DEFAULT_ACCELERATOR-Umgebungsvariable angegeben wird, wenn sie festgelegt ist.

  3. Andernfalls einen nicht emulierten Gerät.

  4. Anderenfalls das Gerät, das die größte Menge des verfügbaren Speichers hat.

  5. Andernfalls ein Gerät, das die Anzeige nicht verbunden ist.

Sie können die Eigenschaften des Standard-Accelerator bestimmen, von die Standard-Accelerator erstellen und seine Eigenschaften untersuchen.Im folgenden Codebeispiel wird druckt Pfad, Speicher und Unterstützung der Standard-Accelerator mit doppelter Genauigkeit.

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(de-de,VS.110).gifCPPAMP_DEFAULT_ACCELERATOR-Umgebungsvariable

Sie können festlegen, dass die CPPAMP_DEFAULT_ACCELERATOR-Umgebungsvariable angeben der accelerator::device_path von Standard-Accelerator.Der Pfad ist hardwareabhängig.Der folgende code verwendet die accelerator::get_all Funktion zum Abrufen einer Liste der verfügbaren Schnellinfos und dann den Pfad der einzelnen Schnellinfo anzuzeigen.

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

Eine Schnellinfo auswählen

Um eine Schnellinfo auswählen möchten, verwenden Sie die accelerator::get_all -Methode, um eine Liste der verfügbaren Schnellinfos abzurufen und anschließend eine anhand seiner Eigenschaften.In diesem Beispiel wird veranschaulicht, wie das Gaspedal auswählt, das meisten Speicher hat:

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

Eine der Zugriffstasten, die durch zurückgegeben werden accelerator::get_all ist die CPU-Beschleuniger.Sie können nicht auf das Gaspedal CPU Code ausführen.Um die CPU-Accelerator herauszufiltern, vergleichen Sie den Wert von der Device_path Eigenschaft der Accelerator, das von accelerator::get_all mit dem Wert des der accelerator::cpu_accelerator.Weitere Informationen finden Sie im Abschnitt "Spezielle Beschleuniger" in diesem Artikel.

Ändern der Standard-Accelerator

Sie können die Standard-Accelerator ändern, durch Aufrufen der accelerator::set_default Methode.Sie können die Standard-Accelerator ändern, nur einmal pro Anwendung Ausführung und Sie es ändern müssen bevor Code auf der GPU ausgeführt wird.Alle nachfolgenden Funktionsaufrufen so ändern Sie das Gaspedal zurück false.Möchten Sie verwenden einen anderen Accelerator in einem Aufruf von parallel_for_each, lesen Sie den Abschnitt "Verwenden von mehreren Schnellinfos" in diesem Artikel.Im folgenden Codebeispiel legt die Standard-Accelerator, die nicht emuliert wird, ist nicht auf einen Monitor angeschlossen und mit doppelter Genauigkeit unterstützt.

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

Verwenden von mehreren Schnellinfos

Es gibt zwei Möglichkeiten, mehrere Accelerators in Ihrer Anwendung verwenden:

  • Sie können übergeben, accelerator_view -Objekten, die Aufrufe an die Parallel_for_each Methode.

  • Sie konstruieren ein array Objekt anhand eines bestimmten accelerator Objekt.C + AMP-Runtime holen die accelerator_view -Objekt aus der aufgezeichneten array Objekt im Lambda-Ausdruck.

Spezielle Accelerators

Die Gerätepfade drei spezielle Schnellinfos stehen als Eigenschaften des der accelerator Klasse:

  • accelerator::direct3d_ref-Datenmember: Diese Singlethread-Beschleuniger verwendet die Software auf der CPU eine generische Grafikkarte emulieren.Es wird standardmäßig zum Debuggen verwendet, aber es ist nicht in der Produktionsumgebung nützlich, weil es langsamer als die Hardwarebeschleuniger ist.Darüber hinaus steht nur in DirectX SDK und das Windows SDK, und es ist unwahrscheinlich, dass auf dem Computer Ihrer Kunden installiert werden.Weitere Informationen finden Sie unter Debuggen von GPU-Code.

  • accelerator::direct3d_warp-Datenmember: Dieser Accelerator bietet eine alternative Lösung für die Ausführung von C++ AMP Code auf Multicore-CPUs, die Streaming-SIMD-Erweiterungen (SSE) zu verwenden.

  • accelerator::cpu_accelerator-Datenmember: Dieser Accelerator können für das Einrichten von staging-Arrays.Es kann nicht C++ AMP Code ausgeführt werden.Weitere Informationen finden Sie unter der Staging-Arrays in C++ AMP auf die parallele Programmierung in systemeigenem Code Blog veröffentlichen.

Interoperabilität

Die AMP C++ Runtime unterstützt die Interoperabilität zwischen den accelerator_view -Klasse und der Direct3D ID3D11Device-Schnittstelle.Die Create_accelerator_view -Methode nimmt eine IUnknown -Schnittstelle und gibt ein accelerator_view Objekt.Die Get_device -Methode nimmt eine accelerator_view -Objekt und gibt eine IUknown Schnittstelle.

Siehe auch

Referenz

Zugriffstastenklasse

accelerator_view-Klasse

Weitere Ressourcen

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

Debuggen von GPU-Code