다음을 통해 공유


Windows 스토어 응용 프로그램에서 C++ AMP 사용

사용할 수 있는 c + + AMP (c + + 가속 대규모 병렬)를 Windows 스토어 GPU (그래픽 처리 장치) 또는 다른 계산 액셀러레이터에서 계산을 수행 하는 응용 프로그램입니다.그러나 c + + AMP Windows 런타임 (WinRT) 형식으로 직접 작업을 위한 Api를 제공 하지 않는 및 WinRT c + + AMP에 대 한 래퍼를 제공 하지 않습니다.WinRT 형식 코드를 사용할 때-직접 만든 포함 하 여-c + + AMP와 호환 되는 형식으로 변환 해야 합니다.

성능 고려 사항

사용 하는 경우 Visual C++ 구성 요소 확장 (C++/CX)를 만들 수를 Windows 스토어 권장 일반 이전 데이터 (POD) 형식은 연속 된 저장소와 함께 사용 하는 응용 프로그램-예를 들어, std::vector 또는 C 스타일 배열-c + + AMP에 사용할 데이터에 대 한.이 마샬링 없이 발생 하기 때문에 비 포드 형식 또는 Windows RT 컨테이너를 사용 하 여 보다 높은 성능을 달성 하는 데 도움이 됩니다.

바로 이러한 방식으로 저장 된 데이터에 액세스할 수는 c + + AMP 커널 래핑하는 std::vector 또는 배열에 저장은 concurrency::array_view 다음 배열 보기에서 사용 하는 concurrency::parallel_for_each 루프:

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

Windows 런타임 형식 마샬링

WinRT Api로 작업 하는 경우 c + + AMP WinRT 컨테이너에 저장 된 데이터를 사용 할 수 있습니다는 Platform::Array<T>^ 를 사용 하 여 선언 된 구조체 또는 클래스와 같은 복잡 한 데이터 형식에는 ref 키워드 또는 value 키워드.이러한 상황에서 c + + AMP에 데이터를 사용할 수 있도록 몇 가지 추가 작업을 수행 해야 합니다.

JJ856977.collapse_all(ko-kr,VS.110).gifPlatform::Array <T> ^, T 포드 형식인

발생 하면는 Platform::Array<T>^ 및 T POD 형식은, 바로 사용 하 여 해당 내부 저장소에 액세스할 수 있습니다는 get 멤버 함수:

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

T POD 형식은 경우에 설명 되어 있는 기법 데이터를 c + + AMP를 사용 하는 다음 섹션에서 사용 합니다.

JJ856977.collapse_all(ko-kr,VS.110).gifWindows 런타임 형식: ref 클래스와 값 클래스

C + + AMP에는 복잡 한 데이터 형식을 지원 하지 않습니다.여기에 포드 비 형식 및 사용 하 여 선언 된 모든 형식에 ref 키워드 또는 value 키워드.에 지원 되지 않는 형식을 사용 하는 경우는 restrict(amp) 컨텍스트에서, 컴파일 타임 오류가 생성 됩니다.

지원 되지 않는 형식이 있을 경우 흥미로운 부분에 데이터를 복사할 수 있는 concurrency::array 개체입니다.C + + AMP를 사용 하려면 사용할 수 있도록 데이터 외에도이 수동 복사 방법 또한 성능 데이터 집약성을 최대화 하 고 사용 되지 않는 데이터에 액셀러레이터 키를 복사 되지 않도록 개선할 수 있습니다.사용 하 여 성능을 추가로 향상 시킬 수 있습니다는 배열 준비, 특별 한 형태의 인 concurrency::array 배열의 지정한 가속기와 다른 배열 사이의 빈번한 전송을 최적화할 수 AMP 런타임에 힌트를 제공 합니다.

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

참고 항목

기타 리소스

C + +를 사용 하 여 첫 번째 Windows 저장소 응용 프로그램을 만드는

c + +에서 Windows 런타임 컴포넌트 만들기