array_view (Clase)
Representa una vista N dimensional sobre los datos contenidos en otro contenedor.
Sintaxis
template <
typename value_type,
int _Rank = 1
>
class array_view : public _Array_view_base<_Rank, sizeof(value_type)/sizeof(int)>;
template <
typename value_type,
int _Rank
>
class array_view<const value_type, _Rank> : public _Array_view_base<_Rank, sizeof(value_type)/sizeof(int)>;
Parámetros
value_type
El tipo de datos de los elementos en el elemento array_view
.
_Rank
La clasificación del objeto array_view
.
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
array_view Constructor | Inicializa una nueva instancia de la clase array_view . No hay ningún constructor predeterminado para array<T,N> . Todos los constructores están restringidos a ejecutarse solo en la CPU y no se pueden ejecutar en un destino de Direct3D. |
~array_view Destructor | Destruye el objeto array_view . |
Métodos públicos
Nombre | Descripción |
---|---|
copy_to | Copia el contenido del objeto array_view en el destino especificado al llamar a copy(*this, dest) . |
data | Devuelve un puntero a los datos sin procesar del array_view . |
discard_data | Descarta los datos actuales subyacentes a esta vista. |
get_extent | Devuelve el objeto de extensión del objeto array_view. |
get_ref | Devuelve una referencia al elemento indexado. |
get_source_accelerator_view | Devuelve la accelerator_view donde se encuentra el origen de datos de array_view . |
refresh | Notifica al objeto array_view que se ha modificado su memoria límite fuera de la interfaz array_view . Una llamada a este método representa toda la información almacenada en caché obsoleta. |
reinterpret_as | Devuelve una matriz unidimensional que contiene todos los elementos del objeto array_view . |
section | Devuelve una subsección del objeto array_view que se encuentra en el origen especificado y que, opcionalmente, tiene la extensión especificada. |
synchronize | Sincroniza de nuevo cualquier modificación realizada en el objeto array_view con sus datos de origen. |
synchronize_async | Sincroniza de nuevo asincrónicamente cualquier modificación realizada en el objeto array_view con sus datos de origen. |
synchronize_to | Sincroniza las modificaciones realizadas en el objeto array_view con el accelerator_view especificado. |
synchronize_to_async | Sincroniza asincrónicamente las modificaciones realizadas en el objeto array_view con el accelerator_view especificado. |
view_as | Genera un array_view objeto de una clasificación diferente mediante los datos de este array_view objeto. |
Operadores públicos
Nombre | Descripción |
---|---|
operator() | Devuelve el valor del elemento especificado por el parámetro o los parámetros. |
operator[] | Devuelve el elemento especificado por los parámetros. |
operator= | Copia el contenido del objeto array_view especificado en este. |
Constantes públicas
Nombre | Descripción |
---|---|
rank (Constante) | Almacena la clasificación del objeto array_view . |
Miembros de datos
Nombre | Descripción |
---|---|
extent | Obtiene el objeto extent que define la forma del objeto array_view . |
source_accelerator_view | Obtiene la accelerator_view donde se encuentra el origen de datos de array_view . |
value_type | El tipo de valor de array_view y la matriz de límites. |
Comentarios
La clase array_view
representa una vista de los datos contenidos en un objeto de matriz o una subsección de un objeto array
.
Puede acceder al objeto array_view
donde se encuentran los datos de origen (localmente) o en un acelerador diferente o en un dominio de coherencia (de forma remota). Cuando se accede al objeto de forma remota, las vistas se copian y se almacenan en caché según sea necesario. Excepto en el caso de los efectos del almacenamiento en caché automático, los objetos array_view
tienen un perfil de rendimiento similar al de los objetos array
. Hay una pequeña penalización de rendimiento cuando se accede a los datos a través de vistas.
Hay tres escenarios de uso remoto:
Una vista a un puntero de memoria del sistema se pasa mediante una llamada de parallel_for_each a un acelerador y se accede a ella en el acelerador.
Se pasa una vista a una matriz ubicada en un acelerador mediante una llamada de
parallel_for_each
a otro acelerador y se accede a ella allí.Se accede en la CPU a una vista de una matriz ubicada en un acelerador.
En cualquiera de estos escenarios, el runtime copia las vistas a las que se hace referencia en la ubicación remota y, si se modifican mediante las llamadas al objeto array_view
, se copian de nuevo en la ubicación local. El runtime podría optimizar el proceso de copiar nuevamente los cambios; podría copiar solo elementos modificados o también copiar partes sin cambios. No se garantiza que los objetos superpuestos array_view
en un origen de datos mantengan la integridad referencial en una ubicación remota.
Debe sincronizar cualquier acceso de multithreading al mismo origen de datos.
El runtime realiza las siguientes garantías relativas al almacenamiento en caché de datos en objetos array_view
:
Todos los accesos bien sincronizados a un objeto
array
y un objetoarray_view
en él en cuanto al orden de programa obedecen una relación serial del tipo ocurre-antes.Todos los accesos bien sincronizados a objetos superpuestos
array_view
en el mismo acelerador de un solo objetoarray
reciben un alias a través del objetoarray
. Inducen una relación total ocurre-antes a la que obedece el orden del programa. No hay almacenamiento en caché. Si los objetosarray_view
se ejecutan en distintos aceleradores, el orden de acceso no está definido, lo que crea una condición de carrera.
Al crear un objeto array_view
mediante un puntero en la memoria del sistema, debe cambiar el objeto de vista array_view
solo a través del puntero array_view
. Como alternativa, debe llamar a refresh()
en uno de los objetos array_view
adjuntos al puntero del sistema, si la memoria nativa subyacente se cambia directamente, en lugar de a través del objeto array_view
.
Cualquiera de las acciones notifica al objeto array_view
que memoria nativa subyacente ha cambiado y que las copias que se encuentran ubicadas en un acelerador están obsoletas. Si sigue estas directrices, las vistas basadas en puntero son idénticas a las proporcionadas a las vistas de matrices paralelas de datos.
Jerarquía de herencia
_Array_view_shape
_Array_view_base
array_view
Requisitos
Encabezado: amp.h
Espacio de nombres: simultaneidad
~array_view
Destruye el objeto array_view
.
~array_view()restrict(amp,cpu);
array_view
Inicializa una nueva instancia de la clase array_view
.
array_view(
array<value_type, _Rank>& _Src)restrict(amp,cpu);
array_view(
const array_view& _Other)restrict(amp,cpu);
explicit array_view(
const Concurrency::extent<_Rank>& _Extent) restrict(cpu);
template <
typename _Container
>
array_view(
const Concurrency::extent<_Rank>& _Extent,
_Container& _Src) restrict(cpu);
array_view(
const Concurrency::extent<_Rank>& _Extent,
value_type* _Src)restrict(amp,cpu);
explicit array_view(
int _E0) restrict(cpu);
template <
typename _Container
>
explicit array_view(
_Container& _Src,
typename std::enable_if<details::_Is_container<_Container>::type::value, void **>::type = 0) restrict(cpu);
template <
typename _Container
>
explicit array_view(
int _E0,
_Container& _Src) restrict(cpu);
explicit array_view(
int _E0,
int _E1) __CPU_ONLY;
template <
typename _Container
>
explicit array_view(
int _E0,
int _E1,
_Container& _Src) restrict(cpu);
explicit array_view(
int _E0,
int _E1,
int _E2) __CPU_ONLY;
template <
typename _Container
>
explicit array_view(
int _E0,
int _E1,
int _E2,
_Container& _Src);
explicit array_view(
int _E0,
_In_ value_type* _Src)restrict(amp,cpu);
template <
typename _Arr_type,
int _Size
>
explicit array_view(
_In_ _Arr_type (& _Src) [_Size]) restrict(amp,cpu);
explicit array_view(
int _E0,
int _E1,
_In_ value_type* _Src)restrict(amp,cpu);
explicit array_view(
int _E0,
int _E1,
int _E2,
_In_ value_type* _Src)restrict(amp,cpu);
array_view(
const array<value_type, _Rank>& _Src)restrict(amp,cpu);
array_view(
const array_view<value_type, _Rank>& _Src)restrict(amp,cpu);
array_view(
const array_view<const value_type, _Rank>& _Src)restrict(amp,cpu);
template <
typename _Container
>
array_view(
const Concurrency::extent<_Rank>& _Extent,
const _Container& _Src) restrict(cpu);
template <
typename _Container
>
explicit array_view(
const _Container& _Src,
typename std::enable_if<details::_Is_container<_Container>::type::value, void **>::type = 0) restrict(cpu);
array_view(
const Concurrency::extent<_Rank>& _Extent,
const value_type* _Src)restrict(amp,cpu);
template <
typename _Arr_type,
int _Size
>
explicit array_view(
const _In_ _Arr_type (& _Src) [_Size]) restrict(amp,cpu);
template <
typename _Container
>
array_view(
int _E0,
const _Container& _Src);
template <
typename _Container
>
array_view(
int _E0,
int _E1,
const _Container& _Src);
template <
typename _Container
>
array_view(
int _E0,
int _E1,
int _E2,
const _Container& _Src);
array_view(
int _E0,
const value_type* _Src)restrict(amp,cpu);
array_view(
int _E0,
int _E1,
const value_type* _Src) restrict(amp,cpu);
array_view(
int _E0,
int _E1,
int _E2,
const value_type* _Src) restrict(amp,cpu);
Parámetros
_Arr_type
El tipo de elemento de una matriz de estilo C a partir de la cual se proporcionan los datos.
_Container
Un argumento de plantilla que debe especificar un contenedor lineal que admita miembros data()
y size()
.
_E0
El componente más significativo de la extensión de esta sección.
_E1
El siguiente componente más significativo de la extensión de esta sección.
_E2
El componente menos significativo de la extensión de esta sección.
_Extent
La extensión en cada dimensión de esta matriz array_view
.
_Other
Un objeto de tipo array_view<T,N>
a partir del cual se inicializará el nuevo objeto array_view
.
_Size
El tamaño de una matriz de estilo C a partir de la cual se proporcionan los datos.
_Src
Un puntero a los datos de origen que se copiarán en la nueva matriz.
copy_to
Copia el contenido del objeto array_view
en el objeto de destino especificado al llamar a copy(*this, dest)
.
void copy_to(
array<value_type, _Rank>& _Dest) const;
void copy_to(
array_view<value_type, _Rank>& _Dest) const;
Parámetros
_Dest
El objeto en el que se copia.
data
Devuelve un puntero a los datos sin procesar del array_view
.
value_type* data() const restrict(amp,
cpu);
const value_type* data() const restrict(amp,
cpu);
Valor devuelto
Un puntero a los datos sin procesar de array_view
.
discard_data
Descarta los datos actuales subyacentes a esta vista. Esta es una sugerencia de optimización para el runtime que se usa para evitar copiar el contenido actual de la vista en un accelerator_view
de destino en el cual se accede a ella y se recomienda su uso si no se necesita el contenido existente. Este método no implica ninguna operación cuando se usa en un contexto restrict(amp)
void discard_data() const restrict(cpu);
extent
Obtiene el objeto extent
que define la forma del objeto array_view
.
__declspec(property(get= get_extent)) Concurrency::extent<_Rank> extent;
get_extent
Devuelve el objeto extent del objeto array_view
.
Concurrency::extent<_Rank> get_extent() const restrict(cpu, amp);
Valor devuelto
El objeto extent
del objeto array_view
get_ref
Obtenga una referencia al elemento indexado por _Index. A diferencia de los otros operadores de indexación para acceder al array_view en la CPU, este método no sincroniza implícitamente este contenido de array_view con la CPU. Después de acceder a array_view en una ubicación remota o realizar una operación de copia que implique a esta array_view, los usuarios son responsables de sincronizar explícitamente la array_view con la CPU antes de llamar a este método. Si no lo hacen, se produce un comportamiento indefinido.
value_type& get_ref(
const index<_Rank>& _Index) const restrict(amp, cpu);
Parámetros
_Index
El índice.
Valor devuelto
Una referencia al elemento indexado por _Index
get_source_accelerator_view
Devuelve la accelerator_view donde se encuentra el origen de datos de la array_view. Si la array_view no tiene un origen de datos, esta API produce una runtime_exception
accelerator_view get_source_accelerator_view() const;
Valor devuelto
operator()
Devuelve el valor del elemento especificado por el parámetro o los parámetros.
value_type& operator() (
const index<_Rank>& _Index) const restrict(amp,cpu);
typename details::_Projection_result_type<value_type,_Rank>::_Result_type operator() (
int _I) const restrict(amp,cpu);
value_type& operator() (
int _I0,
int _I1) const restrict(amp,cpu);
value_type& operator() (
int _I0,
int _I1,
int _I2) const restrict(amp,cpu);
typename details::_Projection_result_type<value_type,_Rank>::_Const_result_type operator() (
int _I) const restrict(amp,cpu);
Parámetros
_Index
La ubicación del elemento.
_I0
El índice en la primera dimensión.
_I1
El índice en la segunda dimensión.
_I2
El índice en la tercera dimensión.
_I
La ubicación del elemento.
Valor devuelto
Devuelve el valor del elemento especificado por el parámetro o los parámetros.
operator[]
Devuelve el elemento especificado por los parámetros.
typename details::_Projection_result_type<value_type,_Rank>::_Const_result_type operator[] (
int _I) const restrict(amp,cpu);
value_type& operator[] (
const index<_Rank>& _Index) const restrict(amp,cpu);
Parámetros
_Index
El índice.
_I
El índice.
Valor devuelto
El valor del elemento en el índice o un array_view
proyectado en la dimensión más significativa.
operator=
Copia el contenido del objeto array_view
especificado en este.
array_view& operator= (
const array_view& _Other) restrict(amp,cpu);
array_view& operator= (
const array_view<value_type, _Rank>& _Other) restrict(amp,cpu);
Parámetros
_Other
El objeto array_view
desde el que se va a copiar.
Valor devuelto
La referencia a este objeto array_view
.
rank
Almacena la clasificación del objeto array_view
.
static const int rank = _Rank;
actualizar
Notifica al objeto array_view
que se ha modificado su memoria límite fuera de la interfaz array_view
. Una llamada a este método representa toda la información almacenada en caché obsoleta.
void refresh() const restrict(cpu);
reinterpret_as
Reinterpreta la array_view a través de una array_view unidimensional, que opcionalmente puede tener un tipo de valor diferente al de la array_view de origen.
Sintaxis
template <
typename _Value_type2
>
array_view< _Value_type2, _Rank> reinterpret_as() const restrict(amp,cpu);
template <
typename _Value_type2
>
array_view<const _Value_type2, _Rank> reinterpret_as() const restrict(amp,cpu);
Parámetros
_Value_type2
El tipo de datos del objeto array_view
nuevo.
Valor devuelto
Un objeto array_view
o objeto const array_view
que se basa en este array_view
, con el tipo de elemento convertido de T
a _Value_type2
y el rango reducido de N a 1.
Comentarios
A veces resulta conveniente ver una matriz multidimensional como si fuera una matriz unidimensional lineal, que podría tener un tipo de valor diferente al de la matriz de origen. Puede lograrlo en un array_view
mediante este método.
Precaución Reinterpretar un objeto de array_view mediante un tipo de valor diferente es una operación potencialmente insegura. Esta funcionalidad debe usarse con cuidado.
Este es un ejemplo:
struct RGB { float r; float g; float b; };
array<RGB,3> a = ...;
array_view<float,1> v = a.reinterpret_as<float>();
assert(v.extent == 3*a.extent);
section
Devuelve una subsección del objeto array_view
que se encuentra en el origen especificado y que, opcionalmente, tiene la extensión especificada.
array_view section(
const Concurrency::index<_Rank>& _Section_origin,
const Concurrency::extent<_Rank>& _Section_extent) const restrict(amp,cpu);
array_view section(
const Concurrency::index<_Rank>& _Idx) const restrict(amp,cpu);
array_view section(
const Concurrency::extent<_Rank>& _Ext) const restrict(amp,cpu);
array_view section(
int _I0,
int _E0) const restrict(amp,cpu);
array_view section(
int _I0,
int _I1,
int _E0,
int _E1) const restrict(amp,cpu);
array_view section(
int _I0,
int _I1,
int _I2,
int _E0,
int _E1,
int _E2) const restrict(amp,cpu);
Parámetros
_E0
El componente más significativo de la extensión de esta sección.
_E1
El siguiente componente más significativo de la extensión de esta sección.
_E2
El componente menos significativo de la extensión de esta sección.
_Ext
El objeto extent que especifica la extensión de la sección. El origen es 0.
_Idx
El objeto index que especifica la ubicación del origen. La subsección es el resto de la extensión.
_I0
El componente más significativo del origen de esta sección.
_I1
El siguiente componente más significativo del origen de esta sección.
_I2
El componente menos significativo del origen de esta sección.
_Rank
Rango de la sección.
_Section_extent
El objeto extent que especifica la extensión de la sección.
_Section_origin
El objeto index que especifica la ubicación del origen.
Valor devuelto
Una subsección del objeto array_view
que se encuentra en el origen especificado y que, opcionalmente, tiene la extensión especificada. Cuando solo se especifica el objeto index
, la subsección contiene todos los elementos en la extensión asociada que tengan índices mayores que los índices de los elementos del objeto index
.
source_accelerator_view
Obtiene la accelerator_view de origen a la que está asociada esta array_view.
__declspec(property(get= get_source_accelerator_view)) accelerator_view source_accelerator_view;
synchronize
Sincroniza de nuevo cualquier modificación realizada en el objeto array_view
con sus datos de origen.
void synchronize(access_type _Access_type = access_type_read) const restrict(cpu);
void synchronize() const restrict(cpu);
Parámetros
_Access_type
El access_type previsto en la accelerator_view de destino. Este parámetro tiene un valor predeterminado de access_type_read
.
synchronize_async
Sincroniza de nuevo asincrónicamente cualquier modificación realizada en el objeto array_view
con sus datos de origen.
concurrency::completion_future synchronize_async(access_type _Access_type = access_type_read) const restrict(cpu);
concurrency::completion_future synchronize_async() const restrict(cpu);
Parámetros
_Access_type
El access_type previsto en la accelerator_view de destino. Este parámetro tiene un valor predeterminado de access_type_read
.
Valor devuelto
Un futuro durante el cual esperar a que se complete la operación.
synchronize_to
Sincroniza cualquier modificación realizada a esta array_view en la accelerator_view especificada.
void synchronize_to(
const accelerator_view& _Accl_view,
access_type _Access_type = access_type_read) const restrict(cpu);
void synchronize_to(
const accelerator_view& _Accl_view) const restrict(cpu);
Parámetros
_Accl_view
La accelerator_view de destino con la que se sincronizará.
_Access_type
El access_type deseado en la accelerator_view de destino. Este parámetro tiene un valor predeterminado de access_type_read.
synchronize_to_async
Sincroniza asincrónicamente cualquier modificación realizada a esta array_view en la accelerator_view especificada.
concurrency::completion_future synchronize_to_async(
const accelerator_view& _Accl_view,
access_type _Access_type = access_type_read) const restrict(cpu);
concurrency::completion_future synchronize_to_async(
const accelerator_view& _Accl_view) const restrict(cpu);
Parámetros
_Accl_view
La accelerator_view de destino con la que se sincronizará.
_Access_type
El access_type deseado en la accelerator_view de destino. Este parámetro tiene un valor predeterminado de access_type_read.
Valor devuelto
Un futuro durante el cual esperar a que se complete la operación.
value_type
El tipo de valor de la array_view y la matriz de límites.
typedef typenamevalue_type value_type;
view_as
Reinterpreta esta array_view
como una array_view
de un rango diferente.
template <
int _New_rank
>
array_view<value_type,_New_rank> view_as(
const Concurrency::extent<_New_rank>& _View_extent) const restrict(amp,cpu);
template <
int _New_rank
>
array_view<const value_type,_New_rank> view_as(
const Concurrency::extent<_New_rank> _View_extent) const restrict(amp,cpu);
Parámetros
_New_rank
El rango del nuevo objeto array_view
.
_View_extent
El extent
que cambia de forma.
value_type
El tipo de datos de los elementos del objeto array original y del objeto array_view
devuelto.
Valor devuelto
El objeto array_view
que está construido.