Функция 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.
3D: D0 * D1 * D2 ≤ 1024; и D0 ≤ 64
2D: D0 * D1 ≤ 1024
1D: 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