Freigeben über


Verwenden von C++ AMP in Windows Store-Apps

Sie können C++-AMP (C++ beschleunigte enorme Parallelität) in der Windows Store-App verwenden, um Berechnungen auf dem GPU (Grafik-Verarbeitungseinheit) oder anderen Computerzugriffstasten auszuführen.bietet jedoch die Möglichkeit C++-AMP APIs nicht für das direkte Arbeiten mit Typen der Windows Runtime (WinRT), und WinRT stellt einen Wrapper nicht für C++-AMP bereit.Wenn Sie verwenden, WinRT Typen in das Code-einschließlich die ein, den Sie sich-Sie müssen sie auf Typen konvertieren erstellt haben, die mit C++-AMP kompatibel sind.

Leistung

Wenn Sie Komponentenerweiterungen für Visual C++ (C++/CX) können Sie die Windows Store-App zu erstellen, wird empfohlen, Typen der Ebene-altDaten (HÜLSE) zusammen mit zusammenhängendem Speicher – z. B. std::vector oder im C-Format Array-für Daten verwenden, die mit C++-AMP verwendet werden.Dies kann Ihnen helfen, höhere Leistung als zu erreichen, indem NichtHÜLSENtypen oder Container Windows RT verwendet, da kein Marshalling auftreten muss.

Im AMPkernel in C++ auf Daten, die auf diese Weise gespeichert wird, einfach binden Sie ein std::vector oder übergeben Sie Speicher in concurrency::array_view und verwenden Sie dann die Arrayansicht in eine concurrency::parallel_for_each-Schleife:

// simple vector addition example
std::vector<int> data0(1024, 1);
std::vector<int> data1(1024, 2);
std::vector<int> data_out(data0.size(), 0);

concurrency::array_view<int, 1> av0(data0.size(), data0);
concurrency::array_view<int, 1> av1(data1.size(), data1);
concurrency::array_view<int, 1> av2(data_out.size(), data2); 

av2.discard_data();

concurrency::parallel_for_each(av0.extent, [=](concurrency::index<1> idx) restrict(amp)
{
  av2[idx] = av0[idx] + av1[idx];
});

Marshallings-Windows Runtime-Typen

Wenn Sie mit WinRT API arbeiten, sollten Sie C++-AMP auf Daten verwenden, die in einem WinRT-Container wie Platform::Array<T>^ oder in den Typen der komplexen Daten wie Klassen oder Strukturen gespeichert wird, die deklariert werden, indem das refvalue-Schlüsselwort oder das - Schlüsselwort verwendet.In diesen Fällen müssen Sie einige zusätzliche Arbeit ausführen, um die Daten zu machen für C++-AMP.

JJ856977.collapse_all(de-de,VS.110).gif^ Platform::Array<T>, wo T ein POD-Typ ist

Wenn Sie Platform::Array<T>^ auftreten und T ein POD-Typ handelt, können Sie auf den zugrunde liegenden Speicher zugreifen, indem Sie nur die get-Memberfunktion verwenden:

Platform::Array<float>^ arr; // Assume that this was returned by a WinRT API
concurrency::array_view<float, 1> av(arr->Length, &arr->get(0));

Wenn kein T POD-Typ ist, verwenden Sie die Technik, die im folgenden Abschnitt beschrieben wird, um die Daten mit C++-AMP zu verwenden.

JJ856977.collapse_all(de-de,VS.110).gifWindows Runtime-Typen: Verweisklassen und Wertklassen

C++-AMP unterstützt keine Typen der komplexen Daten.Dies schließt NichtHÜLSENtypen und alle Typen, die deklariert werden, indem das refvalue-Schlüsselwort oder das - Schlüsselwort verwendet.Wenn ein nicht unterstützter Typ in einem restrict(amp) Kontext verwendet wird, wird ein Kompilierzeitfehler generiert.

Wenn Sie einen nicht unterstützten Typ auftreten, können Sie interessante Teile der Daten in ein concurrency::array-Objekt kopieren.Zusätzlich zur bereit als E-Mail-Anhang Daten, damit C++-AMP, dieser MANUALKopienansatz kann die Leistung verbessern nutzt, indem Datenort maximiert und die sicherstellt, werden diese Daten, die nicht verwendet werden, nicht auf Zugriffstaste kopiert.Sie können die Leistung weiter verbessern, indem Sie ein Stagingarray verwenden, das eine spezielle Art von concurrency::array ist, das einen Hinweis auf die AMPlaufzeit, dass das Array für häufige Übertragung zwischen es und andere Arrays optimiert werden sollte auf der angegebenen Zugriffstaste bereitstellt.

// pixel_color.h
ref class pixel_color sealed
{
 public: 
  pixel_color(Platform::String^ color_name, int red, int green, int blue) 
  {
    name = color_name;
    r = red;
    g = green;
    b = blue;
  }

  property Platform::String^ name; 
  property int r;
  property int g;
..property int b;
};

// Some other file
std::vector<pixel_color^> pixels (256); 

for(pixel_color ^pixel : pixels) 
{
  pixels.push_back(ref new pixel_color("blue", 0, 0, 255));
}
// Create the accelerators
auto cpuAccelerator = concurrency::accelerator(concurrency::accelerator::cpu_accelerator);
auto devAccelerator = concurrency::accelerator(concurrency::accelerator::default_accelerator);

// Create the staging arrays
concurrency::array<float, 1> red_vec(256, cpuAccelerator.default_view, devAccelerator.default_view);
concurrency::array<float, 1>  blue_vec(256, cpuAccelerator.default_view, devAccelerator.default_view); 

// Extract data from the complex array of structs into staging arrays.
concurrency::parallel_for(0, 256, [&](int i)
{ 
  red_vec[i] = pixels[i]->r;
  blue_vec[i] = pixels[i]->b;
});

// Array views are still used to copy data to the accelerator
concurrency::array_view<float, 1> av_red(red_vec);
concurrency::array_view<float, 1> av_blue(blue_vec);

// Change all pixels from blue to red.
concurrency::parallel_for_each(av_red.extent, [=](index<1> idx) restrict(amp)
{
  av_red[idx] = 255;
  av_blue[idx] = 0;
});

Siehe auch

Weitere Ressourcen

Erstellen Sie die erste Windows Store-App mit C++

Erstellen von Windows Runtime-Komponenten in C++