Функция parallel_for_each (C++ AMP)
Выполняет функцию в вычислительном домене.Дополнительные сведения см. в разделе Общие сведения о C++ AMP.
template <
int _Rank,
typename _Kernel_type
>
void parallel_for_each(
const extent<_Rank>& _Compute_domain,
const _Kernel_type &_Kernel
);
template <
int _Dim0,
int _Dim1,
int _Dim2,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0,
_Dim1,
_Dim2>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0,
_Dim1>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Rank,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const extent<_Rank>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
int _Dim2,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0,
_Dim1,
_Dim2>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0,
_Dim1>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0>& _Compute_domain,
const _Kernel_type& _Kernel
);
Параметры
_Accl_view
Объект accelerator_view для выполнения параллельного вычисления._Compute_domain
Объект extent, содержащий данные для вычисления._Dim0
Измерение объекта tiled_extent._Dim1
Измерение объекта tiled_extent._Dim2
Измерение объекта tiled_extent._Kernel
Объект лямбда или функции, который принимает аргумент типа "index<_Rank>" и выполняет параллельное вычисление._Kernel_type
Лямбда-выражение или функтор._Rank
Ранг области памяти.
Заметки
Функция parallel_for_each запускает вычисления, параллельные данным, на устройствах ускорителя.Базовая функциональность parallel_for_each похожа на функциональность for_each, которая выполняет функцию над каждым элементом в контейнере.Основными коспонентами при вызове parallel_for_each являются домен compute, индекс и функция ядра.Во время выполнения parallel_for_each, параллельное действие выполняется для каждого индекса в домене compute.Можно использовать параллельное действие для доступа к элементам в массивах ввода или вывода.Вызов parallel_for_each ведет себя так, как если бы он был синхронным.На практике вызов асинхронен, поскольку он выполняется на отдельном устройстве.Нет гарантий о порядке и параллелизме параллельного выполнения действий незамосщенным parallel_for_each.Действия взаимодействуют только с помощью атомарных функций.
Замосщенная версия parallel_for_each упорядочивает параллельные действия в мозаики, которые имеют фиксированный размер и 1, 2 или 3 измерения, как указано в аргументе tiled_extent.Потоки в одной мозаике имеют доступ ко всем переменным, объявленным с ключевым словом tile_static.Можно использовать метод Метод tile_barrier::wait, чтобы синхронизировать доступ к переменным, объявленным с ключевым словом tile_static.Следующие ограничения относятся к замощенному parallel_for_each:
Результат измерений области памяти мозаики не может превышать 1024.
Трехмерный: D0 * D1 * D2 ≤ 1024; и D0 ≤ 64
Двумерный: D0 * D1 ≤ 1024
Одномерный: D0 ≤ 1024
Замосщенная сетка, переданная в качестве первого параметра parallel_for_each, должна быть делима вдоль каждого из своих измерений соответствующей областью памяти мозаики.
Дополнительные сведения см. в разделе Использование плиток.
Код parallel_for_each выполняется на ускорителе, обычно на устройстве GPU.Можно передать этот ускоритель явно в parallel_for_each как необязательный параметр accelerator_view.В противном случае, ускоритель целевого объекта выбирается из объектов типа array<T,N>, которые захватываются в функции ядра.Если все массивы не привязанны к одному и тому же ускорителю, то возникает исключение.Аргумент tiled_index, передаваемый ядру, содержит коллекцию индексов, включая те, которые относятся к текущей мозаике.
Параметр _Kernel функции parallel_for_each должен быть объектом лямбда-выражения или функции.Для запуска на ускорителе, лямбда-выражение должно включать предложение restrict(amp), хотя оно может содержать дополнительные ограничения.Предложение ограничения накладывает некоторые ограничения функции ядра.Дополнительные сведения см. в разделе Предложение ограничения (C++).
Необходимо иметь возможность вызова аргумент _Kernel с помощью одного из следующих типов аргументов:
Незамосщенный: index<N>, где N должно быть такого же ранга, как extent<N>, используемый в parallel_for_each.
Замосщенный: объект tiled_index, измерения которого соответствуют измерениям объекта tiled_extent, использованного при вызове метода parallel_for_each.
Функция ядра должна возвращать void.
Поскольку функция ядра не принимает другие аргументы, все остальные данные эксплуатируемые ядром, должны быть захвачены объектом лямбда-выражения или функции.Все собранные данные должны быть переданы по значению, за исключением объектов array<T,N>, которые должны быть перехвачены по ссылке или указателем.Некоторые ограничения также применяются к типам объектов, которые можно перехватить.Дополнительные сведения см. в разделе Предложение ограничения (C++).
Если при попытке запустить parallel_for_each возникает ошибка, вызов среды выполнения создает исключение.Исключения могут создаваться по следующим причинам:
Сбой создания шейдера.
Сбой создания буферов.
Передана недопустимая область памяти.
Несоответствующие ускорители.
Требования
Заголовок: amp.h
Пространство имен: Concurrency