C++ AMP (C++ AMP)
C++ Accelerated Massive Parallelism (сокращенно C++ AMP) — библиотека, использующая DirectX 11, и открытая спецификация, созданные Microsoft для реализации параллельных программ для гибридных систем на языке C++. Система C++AMP позволяет переносить вычисления на GPU (видеоускорители) без внесения большого количества изменений в программы. Код, который не может запуститься на GPU, например, из-за своей сложности, будет автоматически запущен на центральном процессоре с применением SIMD (SSE) инструкций. Реализация системы от Microsoft (единственная на настоящий момент) включена в Visual Studio 2012 и включает в себя отладчик и профилировщик. Поддержку других платформ и оборудования могли бы реализовать компания Microsoft или другие в будущем.
Для изначального релиза C++ AMP от Microsoft требуется ОС Windows 7 или Windows Server 2008 R2.[1]
В язык добавлена синтаксическая конструкция «restrict(amp)
», которая может быть указана для любой функции (в том числе для лямбда-функции), обозначающая что она может быть исполнена на акселераторе C++ AMP. Ключевое слово restrict в данном случае означает, что компилятор должен оценить, подходит ли данная функция для GPU (использует ли она лишь те возможности языка C++, которые могут быть исполнены на большинстве GPU).
Пример использования:
void myFunc() restrict(amp)
{
// Код функции
}
Microsoft или другие будущие производители систем, совместимых с C++ AMP могли бы добавить другие спецификаторы restrict, в дополнение к «amp».
Остальная часть C++ AMP доступна через заголовочный файл <amp.h>
и пространство имен «concurrency». Основные классы C++ AMP: array (контейнер данных для акселератора), array_view (обертка для данных), index (координаты точки в N-мерном декартовом пространстве с целочисленными координатами), extent (N-мерная целочисленная размерность), accelerator (вычислительный блок, например, GPU, на котором будет выделяться память и запускаться вычисление), accelerator_view (вид акселератора).
Также определена глобальная функция parallel_for_each
, которая позволяет определить параллельный цикл для C++ AMP.
Пример C++ функции, использующей C++ AMP для суммирования двух двумерных массивов:
void AddArrays(int n, int m, int * pA, int * pB, int * pSum)
{
concurrency::array_view<int,2> a(n, m, pA), b(n, m, pB), sum(n, m, pSum);
concurrency::parallel_for_each(sum.extent, [=](concurrency::index<2> i) restrict(amp)
{
sum[i] = a[i] + b[i];
});
}
См. также
[править | править код]Примечания
[править | править код]- ↑ C++ AMP One-page summary Архивировано 26 октября 2012 года. // MSDN Blogs (англ.)
Литература
[править | править код]- Kate Gregory, Ade Miller. C++ Amp: Accelerated Massive Parallelism With Microsoft Visual C++ — Microsoft, 2012—326 pages — ISBN 978-0-7356-6473-9
- István Novák and others. Beginning Windows 8 Application Development. — John Wiley & Sons, 2012—624 pages — ISBN 978-1-118-22183-9. Chapter 13 «Creating windows 8 style application with C++». Section «Using Accelerated Massive Parallelism», pages 486—489
- Sasha Goldshtein and others. Pro .NET Performance: Optimize Your C# Applications. — Apress, 2012—372 pages — ISBN 978-1-4302-4458-5. Chapter 6 «Concurrency and Parallelism». Section «General Purpose GPU Computing», pages 205—214
Ссылки
[править | править код]- C++ AMP : Language and Programming Model — Version 1.0 : August 2012 (англ.)
- Parallel Programming in Native Code — C++ AMP Team Blog (англ.)