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


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

См. также

Ссылки

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