тип политики выполнения c ++ 20 - PullRequest
3 голосов
/ 04 апреля 2020

Я изучал стандартные алгоритмы и заметил, что вы можете указать политику выполнения.

В найденной документации здесь перечислены 4 политики:

std::execution::sequenced_policy  
std::execution::parallel_policy 
std::execution::parallel_unsequenced_policy  
std::execution::unsequenced_policy

Я понимаю разницу между параллельными политиками и последовательными, но я не уверен, зачем вам также нужна непоследовательная и непоследовательная параллель?

Из того, что я знаю, вы в любом случае не можете гарантировать порядок выполнения потоков, так что t, которые делают параллельные и параллельные непоследовательные политики идентичными?

Зачем добавлять обычную непоследовательную политику, если если вы не можете распараллелить политику, автоматически возвращается к последовательной?

Чего мне не хватает

1 Ответ

6 голосов
/ 04 апреля 2020

Визуализация таблицы

-------------------------------------------------------------------------
|   Type                  |     Vectorization     |     Parallelization |
|------------------------------------------------------------------------                
| Sequenced               |           X           |           X         | 
| Unsequenced             |           V           |           X         |
| Parallel                |           X           |           V         |
| Parallel & unsequenced  |           V           |           V         |
-------------------------------------------------------------------------

Из последней рабочей версии C ++ 20 n4849

20.18 Политики выполнения
Объект типа политики выполнения указывает виды параллелизма, разрешенные при выполнении алгоритма, и выражает соответствующие требования к функциям доступа к элементу.

using namespace std;
vector<int> v = /* ... */;

// standard sequential sort
sort(v.begin(), v.end());

// explicitly sequential sort
sort(execution::seq, v.begin(), v.end());

// permitting parallel execution
sort(execution::par, v.begin(), v.end());

// permitting vectorization as well
sort(execution::par_unseq, v.begin(), v.end());

§ 20.18.3 Выполнение черта типа политики

  • 20.18.4 Политика последовательного выполнения [execpol.seq]

    1. Класс execute :: sequenced_policy - это используемый тип политики выполнения как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и требует, чтобы выполнение параллельного алгоритма не было распараллелено .

  • 20.18.5 Политика параллельного выполнения [execpol.par]

    1. Класс execute :: parallel_policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и указывают, что выполнение параллельного алгоритма может быть распараллеленным .

  • 20.18. 6 Политика параллельного и неупорядоченного выполнения [execpol.parunseq]

    1. Класс execute :: parallel_unsequenced_policy - это тип политики выполнения, используемый в качестве уникального типа для устранения неоднозначности перегрузки параллельного алгоритма и указания на выполнение параллельного алгоритма может быть распараллелен и векторизован .

  • 20.18.7 Политика непоследовательного выполнения [execpol.unseq]

    1. Класс unsequenced_policy - это тип политики выполнения, используемый как уникальный тип для устранения неоднозначности перегрузки параллельного алгоритма и указания на то, что выполнение параллельного алгоритма может быть векторизовано , например, выполнено в одном потоке с использованием инструкций, которые работают для нескольких элементов данных.

Дополнительные сведения

...