代表在另一個容器中保存的數據的 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 項目的數據型別。
_排行
物件的等級 array_view 。
成員
公開建構函式
| 名稱 | 描述 |
|---|---|
| array_view建構函式 | 初始化 array_view 類別的新執行個體。
array<T,N> 沒有預設建構函式。 所有建構函式都僅限於在CPU上執行,而且無法在 Direct3D 目標上執行。 |
| ~array_view解構函式 | 銷毀array_view物件。 |
公用方法
| 名稱 | 描述 |
|---|---|
| copy_to | 呼叫 copy(*this, dest),將 array_view 物件的內容複製到指定的目的地。 |
| data | 傳回 array_view 的原始數據指標。 |
| 丟棄資料 | 捨棄此檢視下的目前數據。 |
| get_extent | 傳回array_view物件的範圍物件。 |
| get_ref | 傳回索引項目的參考。 |
| get_source_accelerator_view | 傳回 數據源所在的accelerator_viewarray_view。 |
| 刷新 | 通知 array_view 物件,其綁定記憶體已在 array_view 介面外部被修改。 對此方法的呼叫會使所有快取資訊變得過時。 |
| reinterpret_as | 傳回包含 array_view 物件中所有元素的一維陣列。 |
| 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 物件。 |
| 來源加速器視圖 | 取得 array_view 的資料來源所在的 accelerator_view |
| value_type |
array_view 的數值類型和已綁定的陣列。 |
備註
類別 array_view 代表的是可以檢視包含在 陣列 對象或某個對象子區段中的數據 array。
您可以存取 array_view 所在的物件,無論該原始資料位於本機上,還是位於不同的加速器或一致性域的遠端位置。 當您從遠端存取物件時,會視需要複製和快取檢視。 除了自動快取的效果之外, array_view 物件具有與 array 對象類似的效能配置檔。 當您透過檢視存取資料時,效能會有些微影響。
有三種遠端使用案例:
系統記憶體指標的一個視圖會被通過 parallel_for_each 呼叫傳遞至加速器,並在加速器上進行存取。
位於加速器上的陣列視圖會透過
parallel_for_each呼叫傳遞到另一個加速器,並在那裡進行存取。在 CPU 上存取位於加速器上的陣列。
在上述任一案例中,參考的檢視會由執行階段複製到遠端位置,如果對 array_view 物件的呼叫進行修改,則會複製回本機位置。 執行時可能會優化複製變更的程序,可能只複製已變更的元素,或也可能複製未變更的部分。 在一個數據來源上的array_view重疊對象不保證在遠端位置維持引用完整性。
您必須同步處理相同資料來源的任何多線程存取。
執行環境會對 array_view 物件中的數據快取提供以下保證:
所有針對
array物件及其上array_view物件的所有同步存取,依程序順序遵從順序先行關係。在單一
array_view物件上的相同加速器上的所有重疊array物件的同步存取都會透過array物件進行別名處理。 它們會引發完全遵循程序順序的前置關聯性。 沒有快取。array_view如果物件在不同的加速器上執行,則存取順序為未定義,並建立競爭條件。
當您在系統記憶體中使用指標建立array_view物件時,您只能透過array_view指標變更檢視array_view物件。 如果基礎原生記憶體是直接變更的,而不是透過 array_view 物件,那麼您必須對附加到系統指標的 array_view 物件之一呼叫 refresh()。
任一動作會通知 array_view 對象基礎原生記憶體已變更,且位於加速器上的任何復本都已過期。 如果您遵循這些指導方針,指標為基礎的視圖會與提供給資料平行陣列的視圖相同。
繼承階層架構
_Array_view_shape
_Array_view_base
array_view
需求
標頭︰ amp.h
命名空間: 並行
~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 樣式陣列元素類型。
_容器
範本自變數,必須指定支持 data() 和 size() 成員的線性容器。
_E0
本節範圍中最具重要性的成分。
_E1
本節範圍中下一個最重要的元件。
_E2
本節範圍中最不重要的元件。
_程度
這個 array_view的每個維度中的範圍。
_其他
要用型別 array_view<T,N> 的物件來初始化新的 array_view。
_大小
提供數據的 C 樣式陣列大小。
_Src
複製到新陣列的資料來源指標。
複製到
藉由呼叫 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
要複製到的物件。
資料
傳回 array_view 的原始數據指標。
value_type* data() const restrict(amp,
cpu);
const value_type* data() const restrict(amp,
cpu);
傳回值
原始數據的array_view指標。
捨棄資料
捨棄此檢視下的目前數據。 這是運行時間的優化提示,用來避免將檢視的目前內容複製到存取的目標 accelerator_view ,如果不需要現有內容,則建議使用它。 在 restrict(amp) 內容中使用此方法時,這個方法為 no-op
void discard_data() const restrict(cpu);
延伸區
取得定義 extent 物件形狀的 array_view 物件。
__declspec(property(get= get_extent)) Concurrency::extent<_Rank> extent;
get_extent
傳回 array_view 物件的 範圍 物件。
Concurrency::extent<_Rank> get_extent() const restrict(cpu, amp);
傳回值
array_view 物件的 extent 物件
get_ref
取得由_Index索引的元素引用。 不同於存取 CPU 上array_view的其他索引運算符,此方法不會隱含地將此array_view的內容同步處理至 CPU。 在存取遠端位置上的 array_view 或執行涉及此 array_view 的複製作業後,使用者有責任在呼叫此方法之前,明確地將 array_view 與 CPU 同步。 無法這樣做會導致未定義的行為。
value_type& get_ref(
const index<_Rank>& _Index) const restrict(amp, cpu);
參數
_指數
索引。
傳回值
_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);
參數
_指數
元素的位置。
_I0
第一個維度中的索引。
_I1
第二個維度中的索引。
_I2
第三個維度中的索引。
_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);
參數
_指數
索引。
_I
索引。
傳回值
索引處的元素值,或是最重要維度上的 array_view 投影。
運算子=
將指定 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);
參數
_其他
要從array_view複製的物件。
傳回值
這個 array_view 對象的參考。
順位
儲存物件的排名 array_view 。
static const int rank = _Rank;
重新整理
通知 array_view 物件,其綁定記憶體已在 array_view 介面外部被修改。 對此方法的呼叫會使所有快取資訊變得過時。
void refresh() const restrict(cpu);
重新解釋為
透過一維array_view重新解譯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 物件的數據類型。
傳回值
以array_view這個 array_view為基礎的物件或 const array_view 物件,專案類型從 轉換成 T_Value_type2,且排名從 N 減少為 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);
章節
傳回位於指定原點且選擇性具有指定範圍的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
指定段落範圍的範圍物件。 原點為 0。
_Idx
指定原點位置的索引物件。 子區段是範圍的其餘部分。
_I0
此部分的起源中最重要的組件。
_I1
本節來源的次重要元件。
_I2
本節來源最不重要的元件。
_排行
區段的排名。
_Section_extent
指定段落範圍的範圍物件。
_Section_origin
指定原點位置的索引物件。
傳回值
位於指定原點之 物件的子區段,以及具有指定範圍之選擇性的 子區 array_view 段。 當僅指定 index 物件時,子區段會包含關聯範圍中所有元素,這些元素的索引大於 index 物件中元素的索引。
來源加速器檢視
取得與這個array_view相關聯的來源accelerator_view。
__declspec(property(get= get_source_accelerator_view)) accelerator_view source_accelerator_view;
同步
將針對 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。
傳回值
要等候作業完成的未來。
同步到
將對這個 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
目標加速器視圖上的所需存取類型。 此參數的預設值為 access_type_read。
同步至非同步
以非同步方式將對此 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。
_存取類型
目標accelerator_view上所需的access_type。 此參數的預設值為 access_type_read。
傳回值
要等候作業完成的未來。
value_type(值類型)
array_view和系結陣列的實值型別。
typedef typenamevalue_type value_type;
檢視為
將此 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_view物件中的項目數據類型。
傳回值
所建構的 array_view 物件。