Namespaces
Variants

std::experimental:: where_expression

From cppreference.net
Definido en el encabezado <experimental/simd>
template < class M, class V >
class where_expression ;
(parallelism TS v2)

La plantilla de clase where_expression abstrae la noción de elementos seleccionados de un lvalue dado de tipo aritmético o de paralelismo de datos. Los elementos seleccionados son los elementos del lvalue (de tipo V ) para los cuales el elemento correspondiente de la máscara (de tipo M ) es verdadero. Los operadores aplicados a objetos de tipo where_expression<M, V> se aplican únicamente a los elementos seleccionados. Todos los demás elementos permanecen sin cambios.

Utilice la función where para construir objetos where_expression .

Parámetros de plantilla

M - El tipo de máscara
V - El tipo de valor sobre el que M se aplica

Las combinaciones válidas de ( M , V ) son:

  • ( simd_mask < T, Abi > , simd < T, Abi > ) ,
  • ( simd_mask < T, Abi > , simd_mask < T, Abi > ) ,
  • ( bool , T ) .

Funciones miembro

asigna a las posiciones seleccionadas
(función miembro pública)
operadores compuestos
(función miembro pública)
operadores de incremento y decremento
(función miembro pública)
carga desde dirección a las posiciones seleccionadas
(función miembro pública)

Ejemplo

#include <cstddef>
#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;
void print(auto const& a)
{
    for (std::size_t i{}; i != std::size(a); ++i)
        std::cout << a[i] << ' ';
    std::cout << '\n';
}
template<class A>
stdx::simd<int, A> my_abs(stdx::simd<int, A> x)
{
    where(x < 0, x) = -x;
    return x;
}
int main()
{
    const stdx::native_simd<int> a([](int i) { return i - 2; });
    print(a);
    const auto b = my_abs(a);
    print(b);
}

Salida posible:

-2 -1 0 1 
2 1 0 1