次の方法で共有


array_view クラス

別のコンテナーに保持されるデータの N 次元のビューを表します。

構文

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)>;

パラメーター

value_type
array_view オブジェクトの要素のデータ型。

_Rank
array_view オブジェクトのランク。

メンバー

パブリック コンストラクター

名前 説明
array_view コンストラクター array_view クラスの新しいインスタンスを初期化します。 array<T,N> の既定のコンストラクターがありません。 すべてのコンストラクターは、CPU 上のみで実行されるように制限されており、Direct3D ターゲット上で実行することはできません。
~array_view デストラクター array_view オブジェクトを破棄します。

パブリック メソッド

名前 説明
copy_to array_view を呼び出して copy(*this, dest) オブジェクトの内容を指定されたコピー先にコピーします。
data array_view の生データへのポインターを返します。
discard_data このビューの基となる現在のデータを破棄します。
get_extent array_view オブジェクトの範囲オブジェクトを返します。
get_ref インデックス付けされた要素への参照を返します。
get_source_accelerator_view array_view のデータ ソースが存在する accelerator_viewを返します。
refresh バインドされたメモリが array_view インターフェイスの外部で変更されたことを array_view オブジェクトに通知します。 このメソッドの呼び出しによって、すべてのキャッシュされた情報が表示されます。
reinterpret_as array_view オブジェクトのすべての要素を含む 1 次元配列を返します。
section 指定された原点に array_view オブジェクトのサブセクションを返し、これは必要に応じて範囲が指定されます。
synchronize array_view オブジェクトへの変更をそのソース データに同期して戻します。
synchronize_async array_view オブジェクトへの変更をそのソース データに非同期に同期して戻します。
synchronize_to array_view オブジェクトに行われた変更を指定された accelerator_view と同期します。
synchronize_to_async array_view オブジェクトに行われた変更を指定された accelerator_view と非同期に同期します。
view_as このarray_view オブジェクトのデータを使用して、別のランクのarray_view オブジェクトを生成します。

パブリック演算子

名前 説明
operator() パラメーターによって指定された要素の値を返します。
operator[] パラメーターで指定された要素を返します。
operator= 指定された array_view オブジェクトの内容をこのオブジェクトにコピーします。

パブリック定数

名前 説明
rank 定数 array_view オブジェクトのランクを格納します。

データ メンバー

名前 説明
extent extent オブジェクトの形状を定義する array_view オブジェクトを取得します。
source_accelerator_view array_view のデータ ソースが存在する accelerator_view を取得します。
value_type array_view の値型およびバインド配列。

解説

array_viewクラスは、array オブジェクトまたは array オブジェクトのサブセクションに含まれるデータに対するビューを表します。

ソース データが格納されている (ローカル)、または別のアクセラレータまたはコヒーレンス ドメイン (リモート) 上の、array_view オブジェクトにアクセスできます。 オブジェクトにリモートにアクセスすると、ビューは必要に応じてコピーされ、キャッシュされます。 自動キャッシュの効果を除いて、array_view オブジェクトには array オブジェクトと同様のパフォーマンス プロファイルがあります。 ビューを使用してデータにアクセスする場合、パフォーマンスがわずかに低下します。

リモートでの使用には次の 3 つの方法があります。

  • システム メモリ ポインターへのビューは、アクセラレータへの parallel_for_each 呼び出しによって渡され、アクセラレータでアクセスされます。

  • アクセラレータにある配列へのビューは、別のアクセラレータへの parallel_for_each 呼び出しによって渡され、そこでアクセスされます。

  • アクセラレータにある配列へのビューは CPU 上でアクセスされます。

これらのシナリオのいずれかで、参照されたビューは、リモートの場所へのランタイムによってコピーされ、array_view オブジェクトへの呼び出しによって変更される場合は、ローカルの場所へコピーして戻されます。 ランタイムは、変更をコピーして戻す処理を最適化する場合、変更された要素のみをコピーする場合、または変更されない部分もコピーする場合があります。 1 つのデータ ソースで array_view オブジェクトが重複すると、リモートの場所での参照整合性の維持が保証されません。

同じデータ ソースに対するマルチスレッド アクセスを同期する必要があります。

ランタイムは array_view オブジェクトのデータのキャッシュに関連して次の内容を保証します。

  • プログラムの順序での array オブジェクトと array_view オブジェクトへのすべての完全同期アクセスは、逐次事前発生リレーションシップに従います。

  • 単一の array_view オブジェクトの同じアクセラレータ上で重複する array オブジェクトへのすべての完全同期アクセスは、array オブジェクトを使用してエイリアス化されます。 これらは、プログラムの順序に従う合計事前発生リレーションシップを引き起こします。 キャッシュはありません。 array_view オブジェクトが異なるアクセラレータで実行されている場合、アクセスの順序は未定義で、競合状態を作成します。

システム メモリのポインターを使用して array_view オブジェクトを作成する場合、array_view ポインターのみを使用してビュー array_view オブジェクトを変更する必要があります。 また、refresh() オブジェクトを使用せずに、基になるネイティブ メモリが直接変更される場合は、システム ポインターに添付されている array_view オブジェクトの 1 つに array_view を呼び出す必要があります。

どちらの操作も、基になるネイティブ メモリが変更されていること、およびアクセラレータ内にあるコピーが古くなっていることを array_view オブジェクトに通知します。 これらのガイドラインに従う場合、ポインター ベースのビューはデータ並列配列のビューに提供されるビューと同じです。

継承階層

_Array_view_shape

_Array_view_base

array_view

要件

ヘッダー: amp.h

名前空間: Concurrency

~array_view

array_view オブジェクトを破棄します。

~array_view()restrict(amp,cpu);

array_view

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);

パラメーター

_Arr_type
データが提供される C スタイルの配列の要素型。

_Container
data() メンバーおよび size() メンバーをサポートする線形コンテナーを指定する必要があるテンプレート引数。

_E0
このセクションの範囲の最上位のコンポーネント。

_E1
このセクションの範囲の最上位の次のコンポーネント。

_E2
このセクションの範囲の最下位のコンポーネント。

_Extent
この array_view の各次元の範囲。

_Other
新しい array_view<T,N> の初期化に使用する array_view 型のオブジェクト。

_Size
データが提供される C スタイルの配列のサイズ。

_Src
新しい配列にコピーされるソース データへのポインター。

copy_to

copy(*this, dest) を呼び出して array_view オブジェクトの内容を指定されたコピー先にコピーします。

void copy_to(
    array<value_type, _Rank>& _Dest) const;

void copy_to(
    array_view<value_type, _Rank>& _Dest) const;

パラメーター

_Dest
コピー先のオブジェクト。

data

array_view の生データへのポインターを返します。

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

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

戻り値

array_view の生データへのポインター。

discard_data

このビューの基となる現在のデータを破棄します。 これは、ビューの現在の内容をアクセスしているターゲット accelerator_view にコピーしないようにするために使用するランタイムの最適化のためのヒントで、既存の内容が必要ではない場合に使用することをお勧めします。 restrict(amp) コンテキストで使用される場合、このメソッドは実行されません。

void discard_data() const restrict(cpu);

extent

extent オブジェクトの形状を定義する array_view オブジェクトを取得します。

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

get_extent

array_view オブジェクトの extent オブジェクトを返します。

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

戻り値

array_view オブジェクトの extent オブジェクト。

get_ref

_Index によってインデックス付けされた要素への参照を取得します。 CPU の array_view にアクセスするための他のインデックス作成演算子とは異なり、このメソッドは CPU にこの array_view の内容を暗黙的に同期しません。 リモートの場所で array_view にアクセスしたり、この array_view を含むコピー操作を実行したりした後は、このメソッドを呼び出す前に array_view を CPU に明示的に同期する必要があります。 これができない場合は、未定義の動作が発生します。

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

パラメーター

_Index
インデックスです。

戻り値

_Index によってインデックス付けされた要素への参照

get_source_accelerator_view

array_view のデータ ソースが存在する accelerator_view を返します。 array_view にデータ ソースがない場合、この API は runtime_exception をスローします

accelerator_view get_source_accelerator_view() const;

戻り値

operator()

パラメーターによって指定された要素の値を返します。

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);

パラメーター

_Index
要素の場所。

_I0
最初の次元のインデックス。

_I1
2 番目の次元のインデックス。

_I2
3 番目の次元のインデックス。

_I
要素の場所。

戻り値

パラメーターによって指定された要素の値。

operator[]

パラメーターで指定された要素を返します。

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);

パラメーター

_Index
インデックスです。

_I
インデックスです。

戻り値

インデックスでの要素の値、または最上位の次元に投影される array_view

operator=

指定された array_view オブジェクトの内容をこのオブジェクトにコピーします。

array_view& operator= (
    const array_view& _Other) restrict(amp,cpu);

array_view& operator= (
    const array_view<value_type, _Rank>& _Other) restrict(amp,cpu);

パラメーター

_Other
コピー元の array_view オブジェクト。

戻り値

この array_view オブジェクトへの参照。

rank

array_view オブジェクトのランクを格納します。

static const int rank = _Rank;

更新

バインドされたメモリが array_view インターフェイスの外部で変更されたことを array_view オブジェクトに通知します。 このメソッドの呼び出しによって、すべてのキャッシュされた情報が表示されます。

void refresh() const restrict(cpu);

reinterpret_as

オプションとして、ソースの array_view とは異なる値型を持つ可能性のある、1 次元 array_view を使用して array_view を再解釈します。

構文

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);

パラメーター

_Value_type2
新しい array_view オブジェクトのデータ型。

戻り値

T から _Value_type2 に変換された要素型で、N から 1 にランクを引き下げられた、この array_view に基づく array_view オブジェクトまたは const array_view オブジェクト。

解説

ソース配列とは異なる値型が含まれる可能性のある、線形の、1 次元配列として多次元配列を表示すると都合のよい場合があります。 このメソッドを使用して array_view でこれを実現できます。

警告 異なる値型を使用して array_view オブジェクトを再解釈すると、安全でない操作となる可能性があります。 この機能を使用するときは、十分に注意する必要があります。

次に例を示します。

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

指定された原点に array_view オブジェクトのサブセクションを返し、これは必要に応じて範囲が指定されます。

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);

パラメーター

_E0
このセクションの範囲の最上位のコンポーネント。

_E1
このセクションの範囲の最上位の次のコンポーネント。

_E2
このセクションの範囲の最下位のコンポーネント。

_Ext
セクションのエクステントを指定する extent オブジェクト。 原点は 0 です。

_Idx
原点の位置を指定する index オブジェクト。 サブセクションは残りの範囲です。

_I0
このセクションの原点の最上位のコンポーネント。

_I1
このセクションの原点の最上位の次のコンポーネント。

_I2
このセクションの原点の最下位のコンポーネント。

_Rank
セクションのランク。

_Section_extent
セクションのエクステントを指定する extent オブジェクト。

_Section_origin
原点の位置を指定する index オブジェクト。

戻り値

指定された原点にある array_view オブジェクトのサブセクションで、これは必要に応じて範囲が指定されます。 index のオブジェクトのみを指定すると、サブセクションには index オブジェクトの要素のインデックスより大きなインデックスを持つ関連する範囲のすべての要素が含まれます。

source_accelerator_view

この array_view が関連付けられているソースの accelerator_view を取得します。

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

synchronize

array_view オブジェクトへの変更をそのソース データに同期して戻します。

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

void synchronize() const restrict(cpu);

パラメーター

_Access_type
ターゲットの accelerator_view の目的の access_type。 このパラメーターには access_type_read の既定値があります。

synchronize_async

array_view オブジェクトへの変更をそのソース データに非同期に同期して戻します。

concurrency::completion_future synchronize_async(access_type _Access_type = access_type_read) const restrict(cpu);

concurrency::completion_future synchronize_async() const restrict(cpu);

パラメーター

_Access_type
ターゲットの accelerator_view の目的の access_type。 このパラメーターには access_type_read の既定値があります。

戻り値

操作の完了を待機する予定。

synchronize_to

この array_view に行われた変更を指定された accelerator_view と同期します。

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);

パラメーター

_Accl_view
同期ターゲットの accelerator_view。

_Access_type
ターゲットの accelerator_view の必要な access_type。 このパラメーターには access_type_read の既定値があります。

synchronize_to_async

この array_view に行われた変更を指定された accelerator_view と非同期に同期します。

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);

パラメーター

_Accl_view
同期ターゲットの accelerator_view。

_Access_type
ターゲットの accelerator_view の必要な access_type。 このパラメーターには access_type_read の既定値があります。

戻り値

操作の完了を待機する予定。

value_type

array_view の値型およびバインド配列。

typedef typenamevalue_type value_type;

view_as

異なるランクの array_view としてこの array_view を再解釈します。

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);

パラメーター

_New_rank
新しい array_view オブジェクトのランク。

_View_extent
変形を行う extent

value_type
元の array オブジェクトおよび返された array_view オブジェクトの両方にある要素のデータ型。

戻り値

構築される array_view オブジェクト。

関連項目

コンカレンシー名前空間 (C++ AMP)