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 objetoarray_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ó objetoarray
são têm o alias definido por meio do objetoarray
. Eles induzem uma relação total anterior que segue a ordem do programa. Não há armazenamento em cache. Se os objetosarray_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.