array_view Class
Represents an N-dimensional view over the data held in another container.
Syntax
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)>;
Parameters
value_type
The data type of the elements in the array_view
object.
_Rank
The rank of the array_view
object.
Members
Public Constructors
Name | Description |
---|---|
array_view Constructor | Initializes a new instance of the array_view class. There is no default constructor for array<T,N> . All constructors are restricted to run on the CPU only and cannot be executed on a Direct3D target. |
~array_view Destructor | Destroys the array_view object. |
Public Methods
Name | Description |
---|---|
copy_to | Copies the contents of the array_view object to the specified destination by calling copy(*this, dest) . |
data | Returns a pointer to the raw data of the array_view . |
discard_data | Discards the current data underlying this view. |
get_extent | Returns the extent object of the array_view object. |
get_ref | Returns a reference to the indexed element. |
get_source_accelerator_view | Returns the accelerator_view where the data source of the array_view is located. |
refresh | Notifies the array_view object that its bound memory has been modified outside the array_view interface. A call to this method renders all cached information stale. |
reinterpret_as | Returns a one-dimensional array that contains all the elements in the array_view object. |
section | Returns a subsection of the array_view object that's at the specified origin and, optionally, that has the specified extent. |
synchronize | Synchronizes any modifications made to the array_view object back to its source data. |
synchronize_async | Asynchronously synchronizes any modifications made to the array_view object back to its source data. |
synchronize_to | Synchronizes any modifications made to the array_view object to the specified accelerator_view. |
synchronize_to_async | Asynchronously synchronizes any modifications made to the array_view object to the specified accelerator_view. |
view_as | Produces an array_view object of a different rank using this array_view object's data. |
Public Operators
Name | Description |
---|---|
operator() | Returns the value of the element that is specified by the parameter or parameters. |
operator[] | Returns the element that is specified by the parameters. |
operator= | Copies the contents of the specified array_view object into this one. |
Public Constants
Name | Description |
---|---|
rank Constant | Stores the rank of the array_view object. |
Data Members
Name | Description |
---|---|
extent | Gets the extent object that defines the shape of the array_view object. |
source_accelerator_view | Gets the accelerator_view where the data source of the array_view is located |
value_type | The value type of the array_view and the bound array. |
Remarks
The array_view
class represents a view into the data that is contained in an array object or a subsection of an array
object.
You can access the array_view
object where the source data is located (locally) or on a different accelerator or a coherence domain (remotely). When you access the object remotely, views are copied and cached as necessary. Except for the effects of automatic caching, array_view
objects have a performance profile similar to that of array
objects. There is a small performance penalty when you access the data through views.
There are three remote usage scenarios:
A view to a system memory pointer is passed by means of a parallel_for_each call to an accelerator and accessed on the accelerator.
A view to an array located on an accelerator is passed by means of a
parallel_for_each
call to another accelerator and is accessed there.A view to an array located on an accelerator is accessed on the CPU.
In any one of these scenarios, the referenced views are copied by the runtime to the remote location and, if modified by the calls to the array_view
object, are copied back to the local location. The runtime might optimize the process of copying changes back, might copy only changed elements, or might copy unchanged portions also. Overlapping array_view
objects on one data source are not guaranteed to maintain referential integrity in a remote location.
You must synchronize any multithreaded access to the same data source.
The runtime makes the following guarantees regarding the caching of data in array_view
objects:
All well-synchronized accesses to an
array
object and anarray_view
object on it in program order obey a serial happens-before relationship.All well-synchronized accesses to overlapping
array_view
objects on the same accelerator on a singlearray
object are aliased through thearray
object. They induce a total occurs-before relationship which obeys program order. There is no caching. If thearray_view
objects are executing on different accelerators, the order of access is undefined, creating a race condition.
When you create an array_view
object using a pointer in system memory, you must change the view array_view
object only through the array_view
pointer. Alternatively, you must call refresh()
on one of the array_view
objects that are attached to the system pointer, if the underlying native memory is changed directly, instead of through the array_view
object.
Either action notifies the array_view
object that the underlying native memory is changed and that any copies that are located on an accelerator are outdated. If you follow these guidelines, the pointer-based views are identical to those provided to views of data-parallel arrays.
Inheritance Hierarchy
_Array_view_shape
_Array_view_base
array_view
Requirements
Header: amp.h
Namespace: Concurrency
~array_view
Destroys the array_view
object.
~array_view()restrict(amp,cpu);
array_view
Initializes a new instance of the array_view
class.
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);
Parameters
_Arr_type
The element type of a C-style array from which data is supplied.
_Container
A template argument that must specify a linear container that supports data()
and size()
members.
_E0
The most significant component of the extent of this section.
_E1
The next-to-most-significant component of the extent of this section.
_E2
The least significant component of the extent of this section.
_Extent
The extent in each dimension of this array_view
.
_Other
An object of type array_view<T,N>
from which to initialize the new array_view
.
_Size
The size of a C-style array from which data is supplied.
_Src
A pointer to the source data that will be copied into the new array.
copy_to
Copies the contents of the array_view
object to the specified destination object by calling copy(*this, dest)
.
void copy_to(
array<value_type, _Rank>& _Dest) const;
void copy_to(
array_view<value_type, _Rank>& _Dest) const;
Parameters
_Dest
The object to copy to.
data
Returns a pointer to the raw data of the array_view
.
value_type* data() const restrict(amp,
cpu);
const value_type* data() const restrict(amp,
cpu);
Return Value
A pointer to the raw data of the array_view
.
discard_data
Discards the current data underlying this view. This is an optimization hint to the runtime used to avoid copying the current contents of the view to a target accelerator_view
that it is accessed on, and its use is recommended if the existing content is not needed. This method is a no-op when used in a restrict(amp) context
void discard_data() const restrict(cpu);
extent
Gets the extent
object that defines the shape of the array_view
object.
__declspec(property(get= get_extent)) Concurrency::extent<_Rank> extent;
get_extent
Returns the extent object of the array_view
object.
Concurrency::extent<_Rank> get_extent() const restrict(cpu, amp);
Return Value
The extent
object of the array_view
object
get_ref
Get a reference to the element indexed by _Index. Unlike the other indexing operators for accessing the array_view on the CPU, this method does not implicitly synchronize this array_view's contents to the CPU. After accessing the array_view on a remote location or performing a copy operation involving this array_view users are responsible to explicitly synchronize the array_view to the CPU before calling this method. Failure to do so results in undefined behavior.
value_type& get_ref(
const index<_Rank>& _Index) const restrict(amp, cpu);
Parameters
_Index
The index.
Return Value
Reference to the element indexed by _Index
get_source_accelerator_view
Returns the accelerator_view where the data source of the array_view is located. If the array_view does not have a data source, this API throws a runtime_exception
accelerator_view get_source_accelerator_view() const;
Return Value
operator()
Returns the value of the element that is specified by the parameter or parameters.
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);
Parameters
_Index
The location of the element.
_I0
The index in the first dimension.
_I1
The index in the second dimension.
_I2
The index in the third dimension.
_I
The location of the element.
Return Value
The value of the element that is specified by the parameter or parameters.
operator[]
Returns the element that is specified by the parameters.
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);
Parameters
_Index
The index.
_I
The index.
Return Value
The value of the element at the index, or an array_view
projected on the most-significant dimension.
operator=
Copies the contents of the specified array_view
object to this one.
array_view& operator= (
const array_view& _Other) restrict(amp,cpu);
array_view& operator= (
const array_view<value_type, _Rank>& _Other) restrict(amp,cpu);
Parameters
_Other
The array_view
object to copy from.
Return Value
A reference to this array_view
object.
rank
Stores the rank of the array_view
object.
static const int rank = _Rank;
refresh
Notifies the array_view
object that its bound memory has been modified outside the array_view
interface. A call to this method renders all cached information stale.
void refresh() const restrict(cpu);
reinterpret_as
Reinterprets the array_view through a one-dimensional array_view, which as an option can have a different value type than the source array_view.
Syntax
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);
Parameters
_Value_type2
The data type of the new array_view
object.
Return Value
An array_view
object or a const array_view
object that is based on this array_view
, with the element type converted from T
to _Value_type2
, and the rank reduced from N to 1.
Remarks
Sometimes it is convenient to view a multi-dimensional array as a linear, one-dimensional array, which may have a different value type than the source array. You can achieve this on an array_view
by using this method.
Warning Reinterpreting an array_view object by using a different value type is a potentially unsafe operation. This functionality should be used with care.
Here's an example:
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
Returns a subsection of the array_view
object that's at the specified origin and, optionally, that has the specified extent.
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);
Parameters
_E0
The most significant component of the extent of this section.
_E1
The next-to-most-significant component of the extent of this section.
_E2
The least significant component of the extent of this section.
_Ext
The extent object that specifies the extent of the section. The origin is 0.
_Idx
The index object that specifies the location of the origin. The subsection is the rest of the extent.
_I0
The most significant component of the origin of this section.
_I1
The next-to-most-significant component of the origin of this section.
_I2
The least significant component of the origin of this section.
_Rank
The rank of the section.
_Section_extent
The extent object that specifies the extent of the section.
_Section_origin
The index object that specifies the location of the origin.
Return Value
A subsection of the array_view
object that's at the specified origin and, optionally, that has the specified extent. When only the index
object is specified, the subsection contains all elements in the associated extent that have indexes that are larger than the indexes of the elements in the index
object.
source_accelerator_view
Gets the source accelerator_view that this array_view is associated with.
__declspec(property(get= get_source_accelerator_view)) accelerator_view source_accelerator_view;
synchronize
Synchronizes any modifications made to the array_view
object back to its source data.
void synchronize(access_type _Access_type = access_type_read) const restrict(cpu);
void synchronize() const restrict(cpu);
Parameters
_Access_type
The intended access_type on the target accelerator_view. This parameter has a default value of access_type_read
.
synchronize_async
Asynchronously synchronizes any modifications made to the array_view
object back to its source data.
concurrency::completion_future synchronize_async(access_type _Access_type = access_type_read) const restrict(cpu);
concurrency::completion_future synchronize_async() const restrict(cpu);
Parameters
_Access_type
The intended access_type on the target accelerator_view. This parameter has a default value of access_type_read
.
Return Value
A future upon which to wait for the operation to complete.
synchronize_to
Synchronizes any modifications made to this array_view to the specified 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);
Parameters
_Accl_view
The target accelerator_view to synchronize to.
_Access_type
The desired access_type on the target accelerator_view. This parameter has a default value of access_type_read.
synchronize_to_async
Asynchronously synchronizes any modifications made to this array_view to the specified 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);
Parameters
_Accl_view
The target accelerator_view to synchronize to.
_Access_type
The desired access_type on the target accelerator_view. This parameter has a default value of access_type_read.
Return Value
A future upon which to wait for the operation to complete.
value_type
The value type of the array_view and the bound array.
typedef typenamevalue_type value_type;
view_as
Reinterprets this array_view
as an array_view
of a different rank.
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);
Parameters
_New_rank
The rank of the new array_view
object.
_View_extent
The reshaping extent
.
value_type
The data type of the elements in both the original array object and the returned array_view
object.
Return Value
The array_view
object that is constructed.