Newer
Older
/***************************************************************************
DistributedArrayView.h - description
-------------------
begin : Sep 20, 2018
copyright : (C) 2018 by Tomas Oberhuber et al.
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
// Implemented by: Jakub Klinkovský
#pragma once
Jakub Klinkovský
committed
#include <TNL/Containers/ArrayView.h>
#include <TNL/Communicators/MpiCommunicator.h>
#include <TNL/Containers/Subrange.h>
namespace TNL {
namespace Containers {
template< typename Value,
typename Device = Devices::Host,
typename Index = int,
typename Communicator = Communicators::MpiCommunicator >
class DistributedArrayView
{
using CommunicationGroup = typename Communicator::CommunicationGroup;
public:
using ValueType = Value;
using DeviceType = Device;
using CommunicatorType = Communicator;
using IndexType = Index;
using LocalRangeType = Subrange< Index >;
using LocalViewType = Containers::ArrayView< Value, Device, Index >;
using ConstLocalViewType = Containers::ArrayView< std::add_const_t< Value >, Device, Index >;
using HostType = DistributedArrayView< Value, Devices::Host, Index, Communicator >;
using CudaType = DistributedArrayView< Value, Devices::Cuda, Index, Communicator >;
Jakub Klinkovský
committed
using ViewType = DistributedArrayView< Value, Device, Index, Communicator >;
using ConstViewType = DistributedArrayView< std::add_const_t< Value >, Device, Index, Communicator >;
Jakub Klinkovský
committed
// Initialization by raw data
__cuda_callable__
DistributedArrayView( const LocalRangeType& localRange, IndexType globalSize, CommunicationGroup group, LocalViewType localData )
Jakub Klinkovský
committed
: localRange(localRange), globalSize(globalSize), group(group), localData(localData)
{}
__cuda_callable__
DistributedArrayView() = default;
// Copy-constructor does shallow copy, so views can be passed-by-value into
// CUDA kernels and they can be captured-by-value in __cuda_callable__
// lambda functions.
__cuda_callable__
DistributedArrayView( const DistributedArrayView& ) = default;
// "Templated copy-constructor" accepting any cv-qualification of Value
template< typename Value_ >
__cuda_callable__
DistributedArrayView( const DistributedArrayView< Value_, Device, Index, Communicator >& );
// default move-constructor
__cuda_callable__
DistributedArrayView( DistributedArrayView&& ) = default;
// method for rebinding (reinitialization)
// Note that you can also bind directly to Array and other types implicitly
// convertible to ArrayView.
__cuda_callable__
void bind( DistributedArrayView view );
// binding to local array via raw pointer
// (local range, global size and communication group are preserved)
template< typename Value_ >
void bind( Value_* data, IndexType localSize );
Jakub Klinkovský
committed
/**
* \brief Returns a modifiable view of the array view.
*/
__cuda_callable__
ViewType getView();
/**
* \brief Returns a non-modifiable view of the array view.
*/
__cuda_callable__
ConstViewType getConstView() const;
// Copy-assignment does deep copy, just like regular array, but the sizes
// must match (i.e. copy-assignment cannot resize).
DistributedArrayView& operator=( const DistributedArrayView& view );
template< typename Array >
DistributedArrayView& operator=( const Array& array );
const LocalRangeType& getLocalRange() const;
CommunicationGroup getCommunicationGroup() const;
LocalViewType getLocalView();
ConstLocalViewType getConstLocalView() const;
void copyFromGlobal( ConstLocalViewType globalArray );
static String getType();
/*
* Usual ArrayView methods follow below.
*/
// Resets the array view to the empty state.
void reset();
// Returns true if the current array view size is zero.
bool empty() const;
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// TODO: swap
// Returns the *global* size
IndexType getSize() const;
// Sets all elements of the array to the given value
void setValue( ValueType value );
// Safe device-independent element setter
void setElement( IndexType i, ValueType value );
// Safe device-independent element getter
ValueType getElement( IndexType i ) const;
// Unsafe element accessor usable only from the Device
__cuda_callable__
ValueType& operator[]( IndexType i );
// Unsafe element accessor usable only from the Device
__cuda_callable__
const ValueType& operator[]( IndexType i ) const;
// Comparison operators
template< typename Array >
bool operator==( const Array& array ) const;
template< typename Array >
bool operator!=( const Array& array ) const;
// Checks if there is an element with given value in this array
bool containsValue( ValueType value ) const;
// Checks if all elements in this array have the same given value
bool containsOnlyValue( ValueType value ) const;
protected:
LocalRangeType localRange;
IndexType globalSize = 0;
CommunicationGroup group = Communicator::NullGroup;
LocalViewType localData;
} // namespace Containers
} // namespace TNL
#include "DistributedArrayView.hpp"