Sdílet prostřednictvím


Používání modelu C++ AMP v aplikacích pro Windows Store

C++ AMP (C++ Accelerated masivní paralelismus) můžete použít ve vaší Windows Store app provádět výpočty na GPU (Graphics Processing Unit) nebo jiné počítačové akcelerátory.Avšak C++ AMP neposkytuje rozhraní API pro práci přímo s typy za běhu systému Windows (WinRT) a WinRT neposkytuje obálka pro C++ AMP.Při použití WinRT typy ve vašem kódu, včetně těch, které jste sami vytvořili, je nutné převést na typy, které jsou kompatibilní s C++ AMP.

Důležité informace o výkonu

Pokud používáte rozšíření komponent v jazyce Visual C++ (C++/CX) k vytvoření vašeho Windows Store app, doporučujeme použít typy prostý stará data (POD) spolu s souvislé úložiště – například std::vector nebo C ve stylu matice – pro data, která bude použita s C++ AMP.To může pomoci dosáhnout vyšší výkon než použití typů bez LUSKŮ nebo kontejnery Windows RT, protože žádné zařazování musí dojít.

C++ AMP jádra, pro přístup k datům, uložené tímto způsobem pouze zalomení std::vector nebo pole úložiště v concurrency::array_view a pomocí zobrazení pole v concurrency::parallel_for_each smyčka:

// 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];
});

Zařazování typy za běhu systému Windows

Při práci s WinRT API můžete chtít použít na data uložená v kontejneru WinRT, jako například C++ AMP Platform::Array<T>^ nebo v komplexní datové typy, například třídy nebo struktury, které jsou deklarovány pomocí ref klíčové slovo nebo value klíčové slovo.V těchto situacích budete muset některé práci, chcete-li zpřístupnit data C++ AMP.

JJ856977.collapse_all(cs-cz,VS.110).gifPlatform::Array <T> ^, kde T je typ LUSKU

Pokud se setkáte Platform::Array<T>^ a T je typ LUSKU, jeho základní úložiště můžete přistupovat pouze pomocí get členskou funkci:

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

Pokud T typ LUSKU, pomocí techniky, která je popsána v následující části data k C++ AMP.

JJ856977.collapse_all(cs-cz,VS.110).gifTypy za běhu systému Windows: ref tříd a hodnota

C++ AMP nepodporuje komplexní datové typy.Jedná se o typy bez LUSKŮ a všechny typy, které jsou deklarovány pomocí ref klíčové slovo nebo value klíčové slovo.Pokud je použit nepodporovaný typ na restrict(amp) generování kontextu, chyby v době kompilace.

Pokud narazíte na nepodporovaný typ, můžete zkopírovat zajímavé části svá data do concurrency::array objektu.Kromě zpřístupnění dat pro C++ AMP využívat, můžete tento přístup ručně kopírovat také zvýšit výkon, maximalizuje místo dat a tím, že zajistí, že data nebudou použita není zkopírován do akcelerátor.Dále výkon lze zvýšit použitím pracovní pole, což je speciální forma concurrency::array , který poskytuje nápovědu pro modul runtime AMP pole, které má být optimalizován pro častý přenos mezi ji a ostatní pole na zadaný akcelerátor.

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

Viz také

Další zdroje

Vytvoření první aplikace úložiště systému Windows pomocí C++

Vytváření Runtime součásti systému Windows v jazyce C++