Partilhar via


Classe array_view

Representa uma exibição de n dimensões sobre os dados mantidos em outro contêiner.

Sintaxe

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
O tipo de dados dos elementos no objeto array_view.

_Rank
A classificação do objeto array_view.

Membros

Construtores públicos

Nome Descrição
Construtor array_view Inicializa uma nova instância da classe array_view. Não há construtor padrão para array<T,N>. Todos os construtores são restritos a serem executados somente na CPU e não podem ser executados em um destino Direct3D.
Destruidor ~array_view Destrói o objeto array_view.

Métodos públicos

Nome Descrição
copy_to Copia o conteúdo do objeto array_view para o destino especificado chamando copy(*this, dest).
data Retorna um ponteiro para os dados brutos de array_view.
discard_data Descarta os dados atuais subjacentes a essa exibição.
get_extent Retorna o objeto de extensão do objeto array_view.
get_ref Retorna uma referência ao elemento indexado.
get_source_accelerator_view Retorna o accelerator_view em que a fonte de dados do array_view está localizada.
atualizar Notifica o objeto array_view de que sua memória associada foi modificada fora da interface array_view. Uma chamada para esse método torna todas as informações armazenadas em cache obsoletas.
reinterpret_as Retorna uma matriz unidimensional que contém todos os elementos no objeto array_view.
section Retorna uma subseção do objeto array_view que está na origem especificada e, opcionalmente, que tem a extensão especificada.
synchronize Sincroniza todas as modificações feitas no objeto array_view de volta aos dados de origem.
synchronize_async Sincroniza de maneira assíncrona todas as modificações feitas ao objeto array_view de volta aos seus dados de origem.
synchronize_to Sincroniza todas as modificações feitas ao objeto array_view com a accelerator_view especificada.
synchronize_to_async Sincroniza de modo assíncrono todas as modificações feitas ao objeto array_view para o accelerator_view especificado.
view_as Produz um array_view objeto de uma classificação diferente usando os dados desse array_view objeto.

Operadores públicos

Nome Descrição
operador() Retorna o valor do elemento especificado pelos parâmetros.
operador Retorna o elemento especificado pelos parâmetros.
operator= Copia o conteúdo do objeto especificado array_view para este objeto.

Constantes públicas

Nome Descrição
Constante rank Armazena a classificação do objeto array_view.

Membros de dados

Nome Descrição
extent Obtém o objeto extent que define a forma do objeto array_view.
source_accelerator_view Obtém a accelerator_view em que a fonte de dados do array_view está localizada
value_type O tipo de valor de array_view e a matriz associada.

Comentários

A classe array_view representa uma exibição nos dados contidos em um objeto de array ou uma subseção de um objeto array.

Você pode acessar o objeto array_view em que os dados de origem estão localizados (localmente) ou em um acelerador diferente ou em um domínio de coerência (remotamente). Quando você acessa o objeto remotamente, as exibições são copiadas e armazenadas em cache conforme necessário. Exceto pelos efeitos do cache automático, os objetos array_view têm um perfil de desempenho semelhante ao dos objetos array. Há uma pequena penalidade de desempenho quando você acessa os dados por meio de exibições.

Há três cenários de uso remoto:

  • Uma exibição para um ponteiro de memória do sistema é passada por meio de uma chamada parallel_for_each para um acelerador e acessada no acelerador.

  • Uma exibição para uma matriz localizada em um acelerador é passada por meio de uma chamada parallel_for_each para outro acelerador e é acessada lá.

  • Uma exibição para uma matriz localizada em um acelerador é acessada na CPU.

Em qualquer um desses cenários, os modos de exibição referenciados são copiados pelo runtime para o local remoto e, se modificados pelas chamadas para o objeto array_view, são copiados de volta para o local. O runtime pode otimizar o processo de cópia de alterações de volta, pode copiar apenas elementos alterados ou também copiar partes inalteradas. Sobrepor objetos array_view em uma fonte de dados não garante a integridade referencial em um local remoto.

Você deve sincronizar qualquer acesso multithread com a mesma fonte de dados.

O runtime oferece as seguintes garantias com relação ao armazenamento em cache de dados em objetos array_view:

  • Todos os acessos bem sincronizados a um objeto array e um objeto array_view nele na ordem do programa obedecem uma relação serial de acontece antes.

  • Todos os acessos bem sincronizados a objetos array_view sobrepostos no mesmo acelerador em um só objeto array são têm o alias definido por meio do objeto array. Eles induzem uma relação total anterior que segue a ordem do programa. Não há armazenamento em cache. Se os objetos array_view estiverem sendo executados em aceleradores diferentes, a ordem de acesso será indefinida, criando uma condição de corrida.

Ao criar um objeto array_view usando um ponteiro na memória do sistema, altere o objeto de exibição array_view somente por meio do ponteiro array_view. Como alternativa, chame refresh() em um dos objetos array_view anexados ao ponteiro do sistema, se a memória nativa subjacente for alterada diretamente, em vez de por meio do objeto array_view.

Qualquer ação notifica o objeto array_view de que a memória nativa subjacente foi alterada e que todas as cópias localizadas em um acelerador estão desatualizadas. Se você seguir essas diretrizes, as exibições baseadas em ponteiro serão idênticas às fornecidas às exibições de matrizes paralelas de dados.

Hierarquia de herança

_Array_view_shape

_Array_view_base

array_view

Requisitos

Cabeçalho: amp.h

Namespace: Simultaneidade

~ array_view

Destrói o objeto array_view.

~array_view()restrict(amp,cpu);

array_view

Inicializa uma nova instância da classe 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
O tipo de elemento de uma matriz de estilo C da qual os dados são fornecidos.

_Container
Um argumento de modelo que deve especificar um contêiner linear com suporte para membros data() e size().

_E0
O componente mais significativo da extensão desta seção.

_E1
O componente próximo ao mais significativo da extensão desta seção.

_E2
O componente menos significativo da extensão desta seção.

_Extent
A extensão em cada dimensão deste array_view.

_Other
Um objeto do tipo array_view<T,N> do qual inicializar o novo array_view.

_Size
O tamanho de uma matriz de estilo C da qual os dados são fornecidos.

_Src
Um ponteiro para os dados de origem que serão copiados para a nova matriz.

copy_to

Copia o conteúdo do objeto array_view para o objeto de destino especificado chamando 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
O objeto para o qual copiar.

data

Retorna um ponteiro para os dados brutos de array_view.

value_type* data() const restrict(amp,
    cpu);

const value_type* data() const restrict(amp,
    cpu);

Valor de retorno

Um ponteiro para os dados brutos do array_view.

discard_data

Descarta os dados atuais subjacentes a essa exibição. Essa é uma dica de otimização para o runtime usado para evitar copiar o conteúdo atual do modo de exibição para um destino accelerator_view no qual ele é acessado e seu uso é recomendado se o conteúdo existente não é necessário. Esse método não é operacional quando usado em um contexto de restrict(amp)

void discard_data() const restrict(cpu);

extent

Obtém o objeto extent que define a forma do objeto array_view.

__declspec(property(get= get_extent)) Concurrency::extent<_Rank> extent;

get_extent

Retorna o objeto extent do objeto array_view.

Concurrency::extent<_Rank> get_extent() const restrict(cpu, amp);

Valor de retorno

O objeto extent do objeto array_view

get_ref

Obtenha uma referência ao elemento indexado por _Index. Ao contrário dos outros operadores de indexação para acessar a array_view na CPU, esse método não sincroniza implicitamente o conteúdo dessa array_view com a CPU. Depois de acessar a array_view em um local remoto ou executar uma operação de cópia envolvendo essa array_view, os usuários são responsáveis por sincronizar explicitamente a array_view com a CPU antes de chamarem esse método. Ambos os casos resultam em comportamento indefinido.

value_type& get_ref(
    const index<_Rank>& _Index) const restrict(amp, cpu);

Parâmetros

_Index
O índice .

Valor de retorno

Referência ao elemento indexado por _Index

get_source_accelerator_view

Retorna a accelerator_view em que a fonte de dados do array_view está localizada. Se array_view não tiver uma fonte de dados, essa API gerará uma runtime_exception

accelerator_view get_source_accelerator_view() const;

Valor de retorno

operador()

Retorna o valor do elemento especificado pelos 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
O local do elemento.

_I0
O índice na primeira dimensão.

_I1
O índice na segunda dimensão.

_I2
O índice na terceira dimensão.

_I
O local do elemento.

Valor de retorno

O valor do elemento especificado pelos parâmetros.

operador

Retorna o elemento especificado pelos 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
O índice .

_I
O índice .

Valor de retorno

O valor do elemento no índice ou um array_view projetado na dimensão mais significativa.

operator=

Copia o conteúdo do objeto array_view especificado para este objeto.

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
O objeto array_view do qual copiar.

Valor de retorno

Uma referência a esse objeto array_view.

rank

Armazena a classificação do objeto array_view.

static const int rank = _Rank;

refresh

Notifica o objeto array_view de que sua memória associada foi modificada fora da interface array_view. Uma chamada para esse método torna todas as informações armazenadas em cache obsoletas.

void refresh() const restrict(cpu);

reinterpret_as

Reinterpreta a array_view por meio de uma array_view unidimensional, que, como opção, pode ter um tipo de valor diferente do array_view de origem.

Sintaxe

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
O tipo de dados do novo objeto array_view.

Valor de retorno

Um objeto array_view ou um objeto const array_view baseado neste array_view, com o tipo de elemento convertido de T em _Value_type2, e a classificação reduzida de N para 1.

Comentários

Às vezes, é conveniente exibir uma matriz multidimensional como uma matriz linear unidimensional, que pode ter um tipo de valor diferente da matriz de origem. Você pode fazer isso em uma array_view usando esse método.

Aviso Reinterpretar um objeto array_view usando um tipo de valor diferente é uma operação potencialmente insegura. Essa funcionalidade deve ser usada com cuidado.

Veja um exemplo:

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

Retorna uma subseção do objeto array_view que está na origem especificada e, opcionalmente, que tem a extensão 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
O componente mais significativo da extensão desta seção.

_E1
O componente próximo ao mais significativo da extensão desta seção.

_E2
O componente menos significativo da extensão desta seção.

_Ext
O objeto extent que especifica a extensão da seção. A origem é 0.

_Idx
O objeto de index que especifica o local da origem. A subseção é o restante da extensão.

_I0
O componente mais significativo da origem desta seção.

_I1
O componente próximo ao mais significativo da origem desta seção.

_I2
O componente menos significativo da origem desta seção.

_Rank
A classificação da seção.

_Section_extent
O objeto extent que especifica a extensão da seção.

_Section_origin
O objeto de index que especifica o local da origem.

Valor de retorno

Uma subseção do objeto array_view que está na origem especificada e, opcionalmente, que tem a extensão especificada. Quando apenas o objeto index é especificado, a subseção contém todos os elementos na extensão associada que têm índices maiores que os índices dos elementos no objeto index.

source_accelerator_view

Obtém a accelerator_view de origem à qual essa array_view está associada.

__declspec(property(get= get_source_accelerator_view)) accelerator_view source_accelerator_view;

synchronize

Sincroniza todas as modificações feitas no objeto array_view de volta aos dados de origem.

void synchronize(access_type _Access_type = access_type_read) const restrict(cpu);

void synchronize() const restrict(cpu);

Parâmetros

_Access_type
O access_type pretendido na accelerator_view de destino. Esse parâmetro tem um valor padrão de access_type_read.

synchronize_async

Sincroniza de maneira assíncrona todas as modificações feitas ao objeto array_view de volta aos seus dados de origem.

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
O access_type pretendido na accelerator_view de destino. Esse parâmetro tem um valor padrão de access_type_read.

Valor de retorno

Um futuro no qual aguardar a conclusão da operação.

synchronize_to

Sincroniza todas as modificações feitas nesta array_view à 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
A accelerator_view de destino com a qual sincronizar.

_Access_type
O access_type desejado na accelerator_view de destino. Esse parâmetro tem um valor padrão de access_type_read.

synchronize_to_async

Sincroniza de maneira assíncrona todas as modificações feitas nesta array_view à 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
A accelerator_view de destino com a qual sincronizar.

_Access_type
O access_type desejado na accelerator_view de destino. Esse parâmetro tem um valor padrão de access_type_read.

Valor de retorno

Um futuro no qual aguardar a conclusão da operação.

value_type

O tipo de valor da array_view e da matriz associada.

typedef typenamevalue_type value_type;

view_as

Reinterpreta este array_view como uma array_view de uma classificação 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
A classificação do novo objeto array_view.

_View_extent
A extent de reformulação.

value_type
O tipo de dados dos elementos no objeto array original e no objeto array_view retornado.

Valor de retorno

O objeto array_view que é construído.

Confira também

Namespace de simultaneidade (C++ AMP)