Namespaces
Variants

std::execution::seq, std::execution::par, std::execution::par_unseq, std::execution::unseq

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <execution>
inline constexpr
std::execution::sequenced_policy seq { /* unspecified */ };
(desde C++17)
inline constexpr
std::execution::parallel_policy par { /* unspecified */ };
(desde C++17)
inline constexpr
std::execution::parallel_unsequenced_policy par_unseq { /* unspecified */ };
(desde C++17)
inline constexpr
std::execution::unsequenced_policy unseq { /* unspecified */ };
(desde C++20)

Los tipos de políticas de ejecución

  • std::execution::sequenced_policy,
  • std::execution::parallel_policy,
  • std::execution::parallel_unsequenced_policy, y
  • std::execution::unsequenced_policy

tienen las siguientes instancias respectivas:

  • std::execution::seq,
  • std::execution::par,
  • std::execution::par_unseq, y
  • std::execution::unseq.

Estas instancias se usan para especificar la política de ejecución de algoritmos paralelos, es decir, los tipos de paralelismo permitidos.

Políticas de ejecución adicionales pueden ser proporcionadas por una implementación de la biblioteca estándar (posibles adiciones futuras pueden incluir std::parallel::cuda y std::parallel::opencl).

Ejemplo

#include <algorithm>
#include <chrono>
#include <cstdint>
#include <iostream>
#include <random>
#include <vector>

#ifdef PARALLEL
#include <execution>
    namespace execution = std::execution;
#else
    enum class execution { seq, unseq, par_unseq, par };
#endif

void measure([[maybe_unused]] auto policy, std::vector<std::uint64_t> v)
{
    const auto start = std::chrono::steady_clock::now();
#ifdef PARALLEL
    std::sort(policy, v.begin(), v.end());
#else
    std::sort(v.begin(), v.end());
#endif
    const auto finish = std::chrono::steady_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(finish - start)
              << '\n';
};

int main()
{
    std::vector<std::uint64_t> v(1'000'000);
    std::mt19937 gen {std::random_device{}()};
    std::ranges::generate(v, gen);

    measure(execution::seq, v);
    measure(execution::unseq, v);
    measure(execution::par_unseq, v);
    measure(execution::par, v);
}

Posible salida:

// online GNU/gcc compiler (PARALLEL macro is not defined)
81ms
80ms
79ms
78ms

// with g++ -std=c++23 -O3 ./test.cpp -ltbb -DPARALLEL
165ms
163ms
30ms
27ms

Véase también

tipos de políticas de ejecución
(clase)