Поделиться через


Функция 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

См. также

Ссылки

Пространство имен Concurrency (C++ AMP)