Update Kokkos library to r2.6.00
This commit is contained in:
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -64,8 +64,8 @@ struct InitViewFunctor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_inview(i,j,k) = i/2 -j*j + k/3;
|
||||
}
|
||||
}
|
||||
@ -84,8 +84,8 @@ struct InitViewFunctor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_outview(i) += _inview(i,j,k) ;
|
||||
}
|
||||
}
|
||||
@ -104,8 +104,8 @@ struct InitStrideViewFunctor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_inview(i,j,k) = i/2 -j*j + k/3;
|
||||
}
|
||||
}
|
||||
@ -123,8 +123,8 @@ struct InitViewRank7Functor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_inview(i,j,k,0,0,0,0) = i/2 -j*j + k/3;
|
||||
}
|
||||
}
|
||||
@ -143,8 +143,8 @@ struct InitDynRankViewFunctor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_inview(i,j,k) = i/2 -j*j + k/3;
|
||||
}
|
||||
}
|
||||
@ -163,8 +163,8 @@ struct InitDynRankViewFunctor {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(const int i) const {
|
||||
for (unsigned j = 0; j < _inview.dimension(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.dimension(2); ++k) {
|
||||
for (unsigned j = 0; j < _inview.extent(1); ++j) {
|
||||
for (unsigned k = 0; k < _inview.extent(2); ++k) {
|
||||
_outview(i) += _inview(i,j,k) ;
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -76,7 +76,7 @@ struct generate_ids
|
||||
generate_ids( local_id_view & ids)
|
||||
: local_2_global(ids)
|
||||
{
|
||||
Kokkos::parallel_for(local_2_global.dimension_0(), *this);
|
||||
Kokkos::parallel_for(local_2_global.extent(0), *this);
|
||||
}
|
||||
|
||||
|
||||
@ -116,7 +116,7 @@ struct fill_map
|
||||
fill_map( global_id_view gIds, local_id_view lIds)
|
||||
: global_2_local(gIds) , local_2_global(lIds)
|
||||
{
|
||||
Kokkos::parallel_for(local_2_global.dimension_0(), *this);
|
||||
Kokkos::parallel_for(local_2_global.extent(0), *this);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
@ -143,7 +143,7 @@ struct find_test
|
||||
find_test( global_id_view gIds, local_id_view lIds, value_type & num_errors)
|
||||
: global_2_local(gIds) , local_2_global(lIds)
|
||||
{
|
||||
Kokkos::parallel_reduce(local_2_global.dimension_0(), *this, num_errors);
|
||||
Kokkos::parallel_reduce(local_2_global.extent(0), *this, num_errors);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -147,7 +147,7 @@ public:
|
||||
if (m_last_block_mask) {
|
||||
//clear the unused bits in the last block
|
||||
typedef Kokkos::Impl::DeepCopy< typename execution_space::memory_space, Kokkos::HostSpace > raw_deep_copy;
|
||||
raw_deep_copy( m_blocks.ptr_on_device() + (m_blocks.dimension_0() -1u), &m_last_block_mask, sizeof(unsigned));
|
||||
raw_deep_copy( m_blocks.data() + (m_blocks.extent(0) -1u), &m_last_block_mask, sizeof(unsigned));
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,7 +212,7 @@ public:
|
||||
KOKKOS_FORCEINLINE_FUNCTION
|
||||
unsigned max_hint() const
|
||||
{
|
||||
return m_blocks.dimension_0();
|
||||
return m_blocks.extent(0);
|
||||
}
|
||||
|
||||
/// find a bit set to 1 near the hint
|
||||
@ -221,10 +221,10 @@ public:
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
Kokkos::pair<bool, unsigned> find_any_set_near( unsigned hint , unsigned scan_direction = BIT_SCAN_FORWARD_MOVE_HINT_FORWARD ) const
|
||||
{
|
||||
const unsigned block_idx = (hint >> block_shift) < m_blocks.dimension_0() ? (hint >> block_shift) : 0;
|
||||
const unsigned block_idx = (hint >> block_shift) < m_blocks.extent(0) ? (hint >> block_shift) : 0;
|
||||
const unsigned offset = hint & block_mask;
|
||||
unsigned block = volatile_load(&m_blocks[ block_idx ]);
|
||||
block = !m_last_block_mask || (block_idx < (m_blocks.dimension_0()-1)) ? block : block & m_last_block_mask ;
|
||||
block = !m_last_block_mask || (block_idx < (m_blocks.extent(0)-1)) ? block : block & m_last_block_mask ;
|
||||
|
||||
return find_any_helper(block_idx, offset, block, scan_direction);
|
||||
}
|
||||
@ -238,7 +238,7 @@ public:
|
||||
const unsigned block_idx = hint >> block_shift;
|
||||
const unsigned offset = hint & block_mask;
|
||||
unsigned block = volatile_load(&m_blocks[ block_idx ]);
|
||||
block = !m_last_block_mask || (block_idx < (m_blocks.dimension_0()-1) ) ? ~block : ~block & m_last_block_mask ;
|
||||
block = !m_last_block_mask || (block_idx < (m_blocks.extent(0)-1) ) ? ~block : ~block & m_last_block_mask ;
|
||||
|
||||
return find_any_helper(block_idx, offset, block, scan_direction);
|
||||
}
|
||||
@ -281,8 +281,8 @@ private:
|
||||
unsigned update_hint( long long block_idx, unsigned offset, unsigned scan_direction ) const
|
||||
{
|
||||
block_idx += scan_direction & MOVE_HINT_BACKWARD ? -1 : 1;
|
||||
block_idx = block_idx >= 0 ? block_idx : m_blocks.dimension_0() - 1;
|
||||
block_idx = block_idx < static_cast<long long>(m_blocks.dimension_0()) ? block_idx : 0;
|
||||
block_idx = block_idx >= 0 ? block_idx : m_blocks.extent(0) - 1;
|
||||
block_idx = block_idx < static_cast<long long>(m_blocks.extent(0)) ? block_idx : 0;
|
||||
|
||||
return static_cast<unsigned>(block_idx)*block_size + offset;
|
||||
}
|
||||
@ -407,7 +407,7 @@ void deep_copy( Bitset<DstDevice> & dst, Bitset<SrcDevice> const& src)
|
||||
}
|
||||
|
||||
typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy;
|
||||
raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0());
|
||||
raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0));
|
||||
}
|
||||
|
||||
template <typename DstDevice, typename SrcDevice>
|
||||
@ -418,7 +418,7 @@ void deep_copy( Bitset<DstDevice> & dst, ConstBitset<SrcDevice> const& src)
|
||||
}
|
||||
|
||||
typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy;
|
||||
raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0());
|
||||
raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0));
|
||||
}
|
||||
|
||||
template <typename DstDevice, typename SrcDevice>
|
||||
@ -429,7 +429,7 @@ void deep_copy( ConstBitset<DstDevice> & dst, ConstBitset<SrcDevice> const& src)
|
||||
}
|
||||
|
||||
typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy;
|
||||
raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0());
|
||||
raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0));
|
||||
}
|
||||
|
||||
} // namespace Kokkos
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -262,14 +262,14 @@ public:
|
||||
modified_host (View<unsigned int,LayoutLeft,typename t_host::execution_space> ("DualView::modified_host"))
|
||||
{
|
||||
if ( int(d_view.rank) != int(h_view.rank) ||
|
||||
d_view.dimension_0() != h_view.dimension_0() ||
|
||||
d_view.dimension_1() != h_view.dimension_1() ||
|
||||
d_view.dimension_2() != h_view.dimension_2() ||
|
||||
d_view.dimension_3() != h_view.dimension_3() ||
|
||||
d_view.dimension_4() != h_view.dimension_4() ||
|
||||
d_view.dimension_5() != h_view.dimension_5() ||
|
||||
d_view.dimension_6() != h_view.dimension_6() ||
|
||||
d_view.dimension_7() != h_view.dimension_7() ||
|
||||
d_view.extent(0) != h_view.extent(0) ||
|
||||
d_view.extent(1) != h_view.extent(1) ||
|
||||
d_view.extent(2) != h_view.extent(2) ||
|
||||
d_view.extent(3) != h_view.extent(3) ||
|
||||
d_view.extent(4) != h_view.extent(4) ||
|
||||
d_view.extent(5) != h_view.extent(5) ||
|
||||
d_view.extent(6) != h_view.extent(6) ||
|
||||
d_view.extent(7) != h_view.extent(7) ||
|
||||
d_view.stride_0() != h_view.stride_0() ||
|
||||
d_view.stride_1() != h_view.stride_1() ||
|
||||
d_view.stride_2() != h_view.stride_2() ||
|
||||
@ -503,6 +503,18 @@ public:
|
||||
/* Realloc on Device */
|
||||
|
||||
::Kokkos::realloc(d_view,n0,n1,n2,n3,n4,n5,n6,n7);
|
||||
|
||||
const bool sizeMismatch = ( h_view.extent(0) != n0 ) ||
|
||||
( h_view.extent(1) != n1 ) ||
|
||||
( h_view.extent(2) != n2 ) ||
|
||||
( h_view.extent(3) != n3 ) ||
|
||||
( h_view.extent(4) != n4 ) ||
|
||||
( h_view.extent(5) != n5 ) ||
|
||||
( h_view.extent(6) != n6 ) ||
|
||||
( h_view.extent(7) != n7 );
|
||||
if ( sizeMismatch )
|
||||
::Kokkos::resize(h_view,n0,n1,n2,n3,n4,n5,n6,n7);
|
||||
|
||||
t_host temp_view = create_mirror_view( d_view );
|
||||
|
||||
/* Remap on Host */
|
||||
@ -510,6 +522,8 @@ public:
|
||||
|
||||
h_view = temp_view;
|
||||
|
||||
d_view = create_mirror_view( typename t_dev::execution_space(), h_view );
|
||||
|
||||
/* Mark Host copy as modified */
|
||||
modified_host() = modified_host()+1;
|
||||
}
|
||||
@ -530,22 +544,34 @@ public:
|
||||
d_view.stride(stride_);
|
||||
}
|
||||
|
||||
template< typename iType >
|
||||
KOKKOS_INLINE_FUNCTION constexpr
|
||||
typename std::enable_if< std::is_integral<iType>::value , size_t >::type
|
||||
extent( const iType & r ) const
|
||||
{ return d_view.extent(r); }
|
||||
|
||||
template< typename iType >
|
||||
KOKKOS_INLINE_FUNCTION constexpr
|
||||
typename std::enable_if< std::is_integral<iType>::value , int >::type
|
||||
extent_int( const iType & r ) const
|
||||
{ return static_cast<int>(d_view.extent(r)); }
|
||||
|
||||
/* \brief return size of dimension 0 */
|
||||
size_t dimension_0() const {return d_view.dimension_0();}
|
||||
size_t dimension_0() const {return d_view.extent(0);}
|
||||
/* \brief return size of dimension 1 */
|
||||
size_t dimension_1() const {return d_view.dimension_1();}
|
||||
size_t dimension_1() const {return d_view.extent(1);}
|
||||
/* \brief return size of dimension 2 */
|
||||
size_t dimension_2() const {return d_view.dimension_2();}
|
||||
size_t dimension_2() const {return d_view.extent(2);}
|
||||
/* \brief return size of dimension 3 */
|
||||
size_t dimension_3() const {return d_view.dimension_3();}
|
||||
size_t dimension_3() const {return d_view.extent(3);}
|
||||
/* \brief return size of dimension 4 */
|
||||
size_t dimension_4() const {return d_view.dimension_4();}
|
||||
size_t dimension_4() const {return d_view.extent(4);}
|
||||
/* \brief return size of dimension 5 */
|
||||
size_t dimension_5() const {return d_view.dimension_5();}
|
||||
size_t dimension_5() const {return d_view.extent(5);}
|
||||
/* \brief return size of dimension 6 */
|
||||
size_t dimension_6() const {return d_view.dimension_6();}
|
||||
size_t dimension_6() const {return d_view.extent(6);}
|
||||
/* \brief return size of dimension 7 */
|
||||
size_t dimension_7() const {return d_view.dimension_7();}
|
||||
size_t dimension_7() const {return d_view.extent(7);}
|
||||
|
||||
//@}
|
||||
};
|
||||
|
||||
@ -35,16 +35,16 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
*/
|
||||
|
||||
/// \file Kokkos_DynRankView.hpp
|
||||
/// \brief Declaration and definition of Kokkos::Experimental::DynRankView.
|
||||
/// \brief Declaration and definition of Kokkos::DynRankView.
|
||||
///
|
||||
/// This header file declares and defines Kokkos::Experimental::DynRankView and its
|
||||
/// This header file declares and defines Kokkos::DynRankView and its
|
||||
/// related nonmember functions.
|
||||
|
||||
#ifndef KOKKOS_DYNRANKVIEW_HPP
|
||||
@ -55,7 +55,6 @@
|
||||
#include <type_traits>
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
template< typename DataType , class ... Properties >
|
||||
class DynRankView; //forward declare
|
||||
@ -156,7 +155,7 @@ struct DynRankDimTraits {
|
||||
// Extra overload to match that for specialize types
|
||||
template <typename Traits, typename ... P>
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
static typename std::enable_if< (std::is_same<typename Traits::array_layout , Kokkos::LayoutRight>::value || std::is_same<typename Traits::array_layout , Kokkos::LayoutLeft>::value || std::is_same<typename Traits::array_layout , Kokkos::LayoutStride>::value) , typename Traits::array_layout >::type createLayout( const ViewCtorProp<P...>& prop, const typename Traits::array_layout& layout )
|
||||
static typename std::enable_if< (std::is_same<typename Traits::array_layout , Kokkos::LayoutRight>::value || std::is_same<typename Traits::array_layout , Kokkos::LayoutLeft>::value || std::is_same<typename Traits::array_layout , Kokkos::LayoutStride>::value) , typename Traits::array_layout >::type createLayout( const Kokkos::Impl::ViewCtorProp<P...>& prop, const typename Traits::array_layout& layout )
|
||||
{
|
||||
return createLayout( layout );
|
||||
}
|
||||
@ -318,7 +317,6 @@ void dyn_rank_view_verify_operator_bounds
|
||||
struct ViewToDynRankViewTag {};
|
||||
|
||||
} // namespace Impl
|
||||
} // namespace Experimental
|
||||
|
||||
namespace Impl {
|
||||
|
||||
@ -348,7 +346,7 @@ class ViewMapping< DstTraits , SrcTraits ,
|
||||
)
|
||||
)
|
||||
)
|
||||
) , Kokkos::Experimental::Impl::ViewToDynRankViewTag >::type >
|
||||
) , Kokkos::Impl::ViewToDynRankViewTag >::type >
|
||||
{
|
||||
private:
|
||||
|
||||
@ -375,7 +373,7 @@ public:
|
||||
|
||||
template < typename DT , typename ... DP , typename ST , typename ... SP >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
static void assign( Kokkos::Experimental::DynRankView< DT , DP...> & dst , const Kokkos::View< ST , SP... > & src )
|
||||
static void assign( Kokkos::DynRankView< DT , DP...> & dst , const Kokkos::View< ST , SP... > & src )
|
||||
{
|
||||
static_assert( is_assignable_value_type
|
||||
, "View assignment must have same value type or const = non-const" );
|
||||
@ -395,8 +393,6 @@ public:
|
||||
|
||||
} //end Impl
|
||||
|
||||
namespace Experimental {
|
||||
|
||||
/* \class DynRankView
|
||||
* \brief Container that creates a Kokkos view with rank determined at runtime.
|
||||
* Essentially this is a rank 7 view
|
||||
@ -415,7 +411,7 @@ namespace Experimental {
|
||||
template< class > struct is_dyn_rank_view : public std::false_type {};
|
||||
|
||||
template< class D, class ... P >
|
||||
struct is_dyn_rank_view< Kokkos::Experimental::DynRankView<D,P...> > : public std::true_type {};
|
||||
struct is_dyn_rank_view< Kokkos::DynRankView<D,P...> > : public std::true_type {};
|
||||
|
||||
|
||||
template< typename DataType , class ... Properties >
|
||||
@ -425,7 +421,7 @@ class DynRankView : public ViewTraits< DataType , Properties ... >
|
||||
|
||||
private:
|
||||
template < class , class ... > friend class DynRankView ;
|
||||
template < class , class ... > friend class Impl::ViewMapping ;
|
||||
template < class , class ... > friend class Kokkos::Impl::ViewMapping ;
|
||||
|
||||
public:
|
||||
typedef ViewTraits< DataType , Properties ... > drvtraits ;
|
||||
@ -437,7 +433,7 @@ public:
|
||||
|
||||
private:
|
||||
typedef Kokkos::Impl::ViewMapping< traits , void > map_type ;
|
||||
typedef Kokkos::Experimental::Impl::SharedAllocationTracker track_type ;
|
||||
typedef Kokkos::Impl::SharedAllocationTracker track_type ;
|
||||
|
||||
track_type m_track ;
|
||||
map_type m_map ;
|
||||
@ -601,7 +597,7 @@ private:
|
||||
// rank of the calling operator - included as first argument in ARG
|
||||
#define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( ARG ) \
|
||||
DynRankView::template verify_space< Kokkos::Impl::ActiveExecutionMemorySpace >::check(); \
|
||||
Kokkos::Experimental::Impl::dyn_rank_view_verify_operator_bounds< typename traits::memory_space > ARG ;
|
||||
Kokkos::Impl::dyn_rank_view_verify_operator_bounds< typename traits::memory_space > ARG ;
|
||||
|
||||
#else
|
||||
|
||||
@ -778,6 +774,140 @@ public:
|
||||
return m_map.reference(i0,i1,i2,i3,i4,i5,i6);
|
||||
}
|
||||
|
||||
// Rank 0
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
reference_type access() const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (0 , this->rank(), m_track, m_map) )
|
||||
return implementation_map().reference();
|
||||
//return m_map.reference(0,0,0,0,0,0,0);
|
||||
}
|
||||
|
||||
// Rank 1
|
||||
// Rank 1 parenthesis
|
||||
template< typename iType >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType>::value), reference_type>::type
|
||||
access(const iType & i0 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) )
|
||||
return m_map.reference(i0);
|
||||
}
|
||||
|
||||
template< typename iType >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename traits::specialize , void>::value && std::is_integral<iType>::value), reference_type>::type
|
||||
access(const iType & i0 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) )
|
||||
return m_map.reference(i0,0,0,0,0,0,0);
|
||||
}
|
||||
|
||||
// Rank 2
|
||||
template< typename iType0 , typename iType1 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType0>::value && std::is_integral<iType1>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) )
|
||||
return m_map.reference(i0,i1);
|
||||
}
|
||||
|
||||
template< typename iType0 , typename iType1 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename drvtraits::specialize , void>::value && std::is_integral<iType0>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) )
|
||||
return m_map.reference(i0,i1,0,0,0,0,0);
|
||||
}
|
||||
|
||||
// Rank 3
|
||||
template< typename iType0 , typename iType1 , typename iType2 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType0>::value && std::is_integral<iType1>::value && std::is_integral<iType2>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) )
|
||||
return m_map.reference(i0,i1,i2);
|
||||
}
|
||||
|
||||
template< typename iType0 , typename iType1 , typename iType2 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename drvtraits::specialize , void>::value && std::is_integral<iType0>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) )
|
||||
return m_map.reference(i0,i1,i2,0,0,0,0);
|
||||
}
|
||||
|
||||
// Rank 4
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType0>::value && std::is_integral<iType1>::value && std::is_integral<iType2>::value && std::is_integral<iType3>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) )
|
||||
return m_map.reference(i0,i1,i2,i3);
|
||||
}
|
||||
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename drvtraits::specialize , void>::value && std::is_integral<iType0>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) )
|
||||
return m_map.reference(i0,i1,i2,i3,0,0,0);
|
||||
}
|
||||
|
||||
// Rank 5
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType0>::value && std::is_integral<iType1>::value && std::is_integral<iType2>::value && std::is_integral<iType3>::value && std::is_integral<iType4>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) )
|
||||
return m_map.reference(i0,i1,i2,i3,i4);
|
||||
}
|
||||
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename drvtraits::specialize , void>::value && std::is_integral<iType0>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) )
|
||||
return m_map.reference(i0,i1,i2,i3,i4,0,0);
|
||||
}
|
||||
|
||||
// Rank 6
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_same<typename traits::specialize , void>::value && std::is_integral<iType0>::value && std::is_integral<iType1>::value && std::is_integral<iType2>::value && std::is_integral<iType3>::value && std::is_integral<iType4>::value && std::is_integral<iType5>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) )
|
||||
return m_map.reference(i0,i1,i2,i3,i4,i5);
|
||||
}
|
||||
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< !(std::is_same<typename drvtraits::specialize , void>::value && std::is_integral<iType0>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) )
|
||||
return m_map.reference(i0,i1,i2,i3,i4,i5,0);
|
||||
}
|
||||
|
||||
// Rank 7
|
||||
template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 , typename iType6 >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
typename std::enable_if< (std::is_integral<iType0>::value && std::is_integral<iType1>::value && std::is_integral<iType2>::value && std::is_integral<iType3>::value && std::is_integral<iType4>::value && std::is_integral<iType5>::value && std::is_integral<iType6>::value), reference_type>::type
|
||||
access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 , const iType6 & i6 ) const
|
||||
{
|
||||
KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (7 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5, i6) )
|
||||
return m_map.reference(i0,i1,i2,i3,i4,i5,i6);
|
||||
}
|
||||
|
||||
#undef KOKKOS_IMPL_VIEW_OPERATOR_VERIFY
|
||||
|
||||
//----------------------------------------
|
||||
@ -830,7 +960,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Experimental
|
||||
// Copy/Assign View to DynRankView
|
||||
template< class RT , class ... RP >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
@ -840,7 +969,7 @@ public:
|
||||
, m_rank( rhs.Rank )
|
||||
{
|
||||
typedef typename View<RT,RP...>::traits SrcTraits ;
|
||||
typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag > Mapping ;
|
||||
typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Impl::ViewToDynRankViewTag > Mapping ;
|
||||
static_assert( Mapping::is_assignable , "Incompatible DynRankView copy construction" );
|
||||
Mapping::assign( *this , rhs );
|
||||
}
|
||||
@ -850,7 +979,7 @@ public:
|
||||
DynRankView & operator = ( const View<RT,RP...> & rhs )
|
||||
{
|
||||
typedef typename View<RT,RP...>::traits SrcTraits ;
|
||||
typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag > Mapping ;
|
||||
typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Impl::ViewToDynRankViewTag > Mapping ;
|
||||
static_assert( Mapping::is_assignable , "Incompatible View to DynRankView copy assignment" );
|
||||
Mapping::assign( *this , rhs );
|
||||
return *this ;
|
||||
@ -872,8 +1001,8 @@ public:
|
||||
// unused arg_layout dimensions must be set to ~size_t(0) so that rank deduction can properly take place
|
||||
template< class ... P >
|
||||
explicit inline
|
||||
DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< ! Impl::ViewCtorProp< P... >::has_pointer
|
||||
DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< ! Kokkos::Impl::ViewCtorProp< P... >::has_pointer
|
||||
, typename traits::array_layout
|
||||
>::type const & arg_layout
|
||||
)
|
||||
@ -882,11 +1011,11 @@ public:
|
||||
, m_rank( Impl::DynRankDimTraits<typename traits::specialize>::template computeRank< typename traits::array_layout, P...>(arg_prop, arg_layout) )
|
||||
{
|
||||
// Append layout and spaces if not input
|
||||
typedef Impl::ViewCtorProp< P ... > alloc_prop_input ;
|
||||
typedef Kokkos::Impl::ViewCtorProp< P ... > alloc_prop_input ;
|
||||
|
||||
// use 'std::integral_constant<unsigned,I>' for non-types
|
||||
// to avoid duplicate class error.
|
||||
typedef Impl::ViewCtorProp
|
||||
typedef Kokkos::Impl::ViewCtorProp
|
||||
< P ...
|
||||
, typename std::conditional
|
||||
< alloc_prop_input::has_label
|
||||
@ -931,7 +1060,7 @@ public:
|
||||
#endif
|
||||
//------------------------------------------------------------
|
||||
|
||||
Kokkos::Experimental::Impl::SharedAllocationRecord<> *
|
||||
Kokkos::Impl::SharedAllocationRecord<> *
|
||||
record = m_map.allocate_shared( prop , Impl::DynRankDimTraits<typename traits::specialize>::template createLayout<traits, P...>(arg_prop, arg_layout) );
|
||||
|
||||
//------------------------------------------------------------
|
||||
@ -950,8 +1079,8 @@ public:
|
||||
// Wrappers
|
||||
template< class ... P >
|
||||
explicit KOKKOS_INLINE_FUNCTION
|
||||
DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< Impl::ViewCtorProp< P... >::has_pointer
|
||||
DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< Kokkos::Impl::ViewCtorProp< P... >::has_pointer
|
||||
, typename traits::array_layout
|
||||
>::type const & arg_layout
|
||||
)
|
||||
@ -972,8 +1101,8 @@ public:
|
||||
// Simple dimension-only layout
|
||||
template< class ... P >
|
||||
explicit inline
|
||||
DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< ! Impl::ViewCtorProp< P... >::has_pointer
|
||||
DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< ! Kokkos::Impl::ViewCtorProp< P... >::has_pointer
|
||||
, size_t
|
||||
>::type const arg_N0 = ~size_t(0)
|
||||
, const size_t arg_N1 = ~size_t(0)
|
||||
@ -992,8 +1121,8 @@ public:
|
||||
|
||||
template< class ... P >
|
||||
explicit KOKKOS_INLINE_FUNCTION
|
||||
DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< Impl::ViewCtorProp< P... >::has_pointer
|
||||
DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop
|
||||
, typename std::enable_if< Kokkos::Impl::ViewCtorProp< P... >::has_pointer
|
||||
, size_t
|
||||
>::type const arg_N0 = ~size_t(0)
|
||||
, const size_t arg_N1 = ~size_t(0)
|
||||
@ -1015,10 +1144,10 @@ public:
|
||||
explicit inline
|
||||
DynRankView( const Label & arg_label
|
||||
, typename std::enable_if<
|
||||
Kokkos::Experimental::Impl::is_view_label<Label>::value ,
|
||||
Kokkos::Impl::is_view_label<Label>::value ,
|
||||
typename traits::array_layout >::type const & arg_layout
|
||||
)
|
||||
: DynRankView( Impl::ViewCtorProp< std::string >( arg_label ) , arg_layout )
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp< std::string >( arg_label ) , arg_layout )
|
||||
{}
|
||||
|
||||
// Allocate label and layout, must disambiguate from subview constructor
|
||||
@ -1026,7 +1155,7 @@ public:
|
||||
explicit inline
|
||||
DynRankView( const Label & arg_label
|
||||
, typename std::enable_if<
|
||||
Kokkos::Experimental::Impl::is_view_label<Label>::value ,
|
||||
Kokkos::Impl::is_view_label<Label>::value ,
|
||||
const size_t >::type arg_N0 = ~size_t(0)
|
||||
, const size_t arg_N1 = ~size_t(0)
|
||||
, const size_t arg_N2 = ~size_t(0)
|
||||
@ -1036,7 +1165,7 @@ public:
|
||||
, const size_t arg_N6 = ~size_t(0)
|
||||
, const size_t arg_N7 = ~size_t(0)
|
||||
)
|
||||
: DynRankView( Impl::ViewCtorProp< std::string >( arg_label )
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp< std::string >( arg_label )
|
||||
, typename traits::array_layout
|
||||
( arg_N0 , arg_N1 , arg_N2 , arg_N3 , arg_N4 , arg_N5 , arg_N6 , arg_N7 )
|
||||
)
|
||||
@ -1048,7 +1177,8 @@ public:
|
||||
DynRankView( const ViewAllocateWithoutInitializing & arg_prop
|
||||
, const typename traits::array_layout & arg_layout
|
||||
)
|
||||
: DynRankView( Impl::ViewCtorProp< std::string , Kokkos::Experimental::Impl::WithoutInitializing_t >( arg_prop.label , Kokkos::Experimental::WithoutInitializing )
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp< std::string , Kokkos::Impl::WithoutInitializing_t >( arg_prop.label , Kokkos::WithoutInitializing )
|
||||
|
||||
, Impl::DynRankDimTraits<typename traits::specialize>::createLayout(arg_layout)
|
||||
)
|
||||
{}
|
||||
@ -1064,7 +1194,7 @@ public:
|
||||
, const size_t arg_N6 = ~size_t(0)
|
||||
, const size_t arg_N7 = ~size_t(0)
|
||||
)
|
||||
: DynRankView(Impl::ViewCtorProp< std::string , Kokkos::Experimental::Impl::WithoutInitializing_t >( arg_prop.label , Kokkos::Experimental::WithoutInitializing ), arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7 )
|
||||
: DynRankView(Kokkos::Impl::ViewCtorProp< std::string , Kokkos::Impl::WithoutInitializing_t >( arg_prop.label , Kokkos::WithoutInitializing ), arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7 )
|
||||
{}
|
||||
|
||||
//----------------------------------------
|
||||
@ -1097,14 +1227,14 @@ public:
|
||||
, const size_t arg_N6 = ~size_t(0)
|
||||
, const size_t arg_N7 = ~size_t(0)
|
||||
)
|
||||
: DynRankView( Impl::ViewCtorProp<pointer_type>(arg_ptr) , arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7 )
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp<pointer_type>(arg_ptr) , arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7 )
|
||||
{}
|
||||
|
||||
explicit KOKKOS_INLINE_FUNCTION
|
||||
DynRankView( pointer_type arg_ptr
|
||||
, typename traits::array_layout & arg_layout
|
||||
)
|
||||
: DynRankView( Impl::ViewCtorProp<pointer_type>(arg_ptr) , arg_layout )
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp<pointer_type>(arg_ptr) , arg_layout )
|
||||
{}
|
||||
|
||||
|
||||
@ -1140,7 +1270,7 @@ public:
|
||||
explicit KOKKOS_INLINE_FUNCTION
|
||||
DynRankView( const typename traits::execution_space::scratch_memory_space & arg_space
|
||||
, const typename traits::array_layout & arg_layout )
|
||||
: DynRankView( Impl::ViewCtorProp<pointer_type>(
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp<pointer_type>(
|
||||
reinterpret_cast<pointer_type>(
|
||||
arg_space.get_shmem( map_type::memory_span(
|
||||
Impl::DynRankDimTraits<typename traits::specialize>::createLayout( arg_layout ) //is this correct?
|
||||
@ -1159,7 +1289,7 @@ public:
|
||||
, const size_t arg_N6 = ~size_t(0)
|
||||
, const size_t arg_N7 = ~size_t(0) )
|
||||
|
||||
: DynRankView( Impl::ViewCtorProp<pointer_type>(
|
||||
: DynRankView( Kokkos::Impl::ViewCtorProp<pointer_type>(
|
||||
reinterpret_cast<pointer_type>(
|
||||
arg_space.get_shmem(
|
||||
map_type::memory_span(
|
||||
@ -1190,7 +1320,6 @@ namespace Impl {
|
||||
struct DynRankSubviewTag {};
|
||||
|
||||
} // namespace Impl
|
||||
} // namespace Experimental
|
||||
|
||||
namespace Impl {
|
||||
|
||||
@ -1207,7 +1336,7 @@ struct ViewMapping
|
||||
std::is_same< typename SrcTraits::array_layout
|
||||
, Kokkos::LayoutStride >::value
|
||||
)
|
||||
), Kokkos::Experimental::Impl::DynRankSubviewTag >::type
|
||||
), Kokkos::Impl::DynRankSubviewTag >::type
|
||||
, SrcTraits
|
||||
, Args ... >
|
||||
{
|
||||
@ -1279,11 +1408,11 @@ public:
|
||||
};
|
||||
|
||||
|
||||
typedef Kokkos::Experimental::DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits > ret_type;
|
||||
typedef Kokkos::DynRankView< value_type , array_layout , typename SrcTraits::device_type , typename SrcTraits::memory_traits > ret_type;
|
||||
|
||||
template < typename T , class ... P >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
static ret_type subview( const unsigned src_rank , Kokkos::Experimental::DynRankView< T , P...> const & src
|
||||
static ret_type subview( const unsigned src_rank , Kokkos::DynRankView< T , P...> const & src
|
||||
, Args ... args )
|
||||
{
|
||||
|
||||
@ -1351,20 +1480,19 @@ public:
|
||||
|
||||
} // end Impl
|
||||
|
||||
namespace Experimental {
|
||||
|
||||
template< class V , class ... Args >
|
||||
using Subdynrankview = typename Kokkos::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , V , Args... >::ret_type ;
|
||||
using Subdynrankview = typename Kokkos::Impl::ViewMapping< Kokkos::Impl::DynRankSubviewTag , V , Args... >::ret_type ;
|
||||
|
||||
template< class D , class ... P , class ...Args >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
Subdynrankview< ViewTraits<D******* , P...> , Args... >
|
||||
subdynrankview( const Kokkos::Experimental::DynRankView< D , P... > &src , Args...args)
|
||||
subdynrankview( const Kokkos::DynRankView< D , P... > &src , Args...args)
|
||||
{
|
||||
if ( src.rank() > sizeof...(Args) ) //allow sizeof...(Args) >= src.rank(), ignore the remaining args
|
||||
{ Kokkos::abort("subdynrankview: num of args must be >= rank of the source DynRankView"); }
|
||||
|
||||
typedef Kokkos::Impl::ViewMapping< Kokkos::Experimental::Impl::DynRankSubviewTag , Kokkos::ViewTraits< D*******, P... > , Args... > metafcn ;
|
||||
typedef Kokkos::Impl::ViewMapping< Kokkos::Impl::DynRankSubviewTag , Kokkos::ViewTraits< D*******, P... > , Args... > metafcn ;
|
||||
|
||||
return metafcn::subview( src.rank() , src , args... );
|
||||
}
|
||||
@ -1373,16 +1501,14 @@ subdynrankview( const Kokkos::Experimental::DynRankView< D , P... > &src , Args.
|
||||
template< class D , class ... P , class ...Args >
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
Subdynrankview< ViewTraits<D******* , P...> , Args... >
|
||||
subview( const Kokkos::Experimental::DynRankView< D , P... > &src , Args...args)
|
||||
subview( const Kokkos::DynRankView< D , P... > &src , Args...args)
|
||||
{
|
||||
return subdynrankview( src , args... );
|
||||
}
|
||||
|
||||
} // namespace Experimental
|
||||
} // namespace Kokkos
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
// overload == and !=
|
||||
template< class LT , class ... LP , class RT , class ... RP >
|
||||
@ -1422,13 +1548,11 @@ bool operator != ( const DynRankView<LT,LP...> & lhs ,
|
||||
return ! ( operator==(lhs,rhs) );
|
||||
}
|
||||
|
||||
} //end Experimental
|
||||
} //end Kokkos
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
namespace Impl {
|
||||
|
||||
template< class OutputView , typename Enable = void >
|
||||
@ -1455,7 +1579,7 @@ struct DynRankViewFill {
|
||||
for ( size_t i4 = 0 ; i4 < n4 ; ++i4 ) {
|
||||
for ( size_t i5 = 0 ; i5 < n5 ; ++i5 ) {
|
||||
for ( size_t i6 = 0 ; i6 < n6 ; ++i6 ) {
|
||||
output(i0,i1,i2,i3,i4,i5,i6) = input ;
|
||||
output.access(i0,i1,i2,i3,i4,i5,i6) = input ;
|
||||
}}}}}}
|
||||
}
|
||||
|
||||
@ -1498,14 +1622,14 @@ struct DynRankViewRemap {
|
||||
|
||||
DynRankViewRemap( const OutputView & arg_out , const InputView & arg_in )
|
||||
: output( arg_out ), input( arg_in )
|
||||
, n0( std::min( (size_t)arg_out.dimension_0() , (size_t)arg_in.dimension_0() ) )
|
||||
, n1( std::min( (size_t)arg_out.dimension_1() , (size_t)arg_in.dimension_1() ) )
|
||||
, n2( std::min( (size_t)arg_out.dimension_2() , (size_t)arg_in.dimension_2() ) )
|
||||
, n3( std::min( (size_t)arg_out.dimension_3() , (size_t)arg_in.dimension_3() ) )
|
||||
, n4( std::min( (size_t)arg_out.dimension_4() , (size_t)arg_in.dimension_4() ) )
|
||||
, n5( std::min( (size_t)arg_out.dimension_5() , (size_t)arg_in.dimension_5() ) )
|
||||
, n6( std::min( (size_t)arg_out.dimension_6() , (size_t)arg_in.dimension_6() ) )
|
||||
, n7( std::min( (size_t)arg_out.dimension_7() , (size_t)arg_in.dimension_7() ) )
|
||||
, n0( std::min( (size_t)arg_out.extent(0) , (size_t)arg_in.extent(0) ) )
|
||||
, n1( std::min( (size_t)arg_out.extent(1) , (size_t)arg_in.extent(1) ) )
|
||||
, n2( std::min( (size_t)arg_out.extent(2) , (size_t)arg_in.extent(2) ) )
|
||||
, n3( std::min( (size_t)arg_out.extent(3) , (size_t)arg_in.extent(3) ) )
|
||||
, n4( std::min( (size_t)arg_out.extent(4) , (size_t)arg_in.extent(4) ) )
|
||||
, n5( std::min( (size_t)arg_out.extent(5) , (size_t)arg_in.extent(5) ) )
|
||||
, n6( std::min( (size_t)arg_out.extent(6) , (size_t)arg_in.extent(6) ) )
|
||||
, n7( std::min( (size_t)arg_out.extent(7) , (size_t)arg_in.extent(7) ) )
|
||||
{
|
||||
typedef Kokkos::RangePolicy< ExecSpace > Policy ;
|
||||
const Kokkos::Impl::ParallelFor< DynRankViewRemap , Policy > closure( *this , Policy( 0 , n0 ) );
|
||||
@ -1521,18 +1645,16 @@ struct DynRankViewRemap {
|
||||
for ( size_t i4 = 0 ; i4 < n4 ; ++i4 ) {
|
||||
for ( size_t i5 = 0 ; i5 < n5 ; ++i5 ) {
|
||||
for ( size_t i6 = 0 ; i6 < n6 ; ++i6 ) {
|
||||
output(i0,i1,i2,i3,i4,i5,i6) = input(i0,i1,i2,i3,i4,i5,i6);
|
||||
output.access(i0,i1,i2,i3,i4,i5,i6) = input.access(i0,i1,i2,i3,i4,i5,i6);
|
||||
}}}}}}
|
||||
}
|
||||
};
|
||||
|
||||
} /* namespace Impl */
|
||||
} /* namespace Experimental */
|
||||
} /* namespace Kokkos */
|
||||
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
/** \brief Deep copy a value from Host memory into a view. */
|
||||
template< class DT , class ... DP >
|
||||
@ -1549,7 +1671,7 @@ void deep_copy
|
||||
typename ViewTraits<DT,DP...>::value_type >::value
|
||||
, "deep_copy requires non-const type" );
|
||||
|
||||
Kokkos::Experimental::Impl::DynRankViewFill< DynRankView<DT,DP...> >( dst , value );
|
||||
Kokkos::Impl::DynRankViewFill< DynRankView<DT,DP...> >( dst , value );
|
||||
}
|
||||
|
||||
/** \brief Deep copy into a value in Host memory from a view. */
|
||||
@ -1585,7 +1707,7 @@ void deep_copy
|
||||
std::is_same< typename DstType::traits::specialize , void >::value &&
|
||||
std::is_same< typename SrcType::traits::specialize , void >::value
|
||||
&&
|
||||
( Kokkos::Experimental::is_dyn_rank_view<DstType>::value || Kokkos::Experimental::is_dyn_rank_view<SrcType>::value)
|
||||
( Kokkos::is_dyn_rank_view<DstType>::value || Kokkos::is_dyn_rank_view<SrcType>::value)
|
||||
)>::type * = 0 )
|
||||
{
|
||||
static_assert(
|
||||
@ -1641,14 +1763,15 @@ void deep_copy
|
||||
dst.span_is_contiguous() &&
|
||||
src.span_is_contiguous() &&
|
||||
dst.span() == src.span() &&
|
||||
dst.dimension_0() == src.dimension_0() &&
|
||||
dst.dimension_1() == src.dimension_1() &&
|
||||
dst.dimension_2() == src.dimension_2() &&
|
||||
dst.dimension_3() == src.dimension_3() &&
|
||||
dst.dimension_4() == src.dimension_4() &&
|
||||
dst.dimension_5() == src.dimension_5() &&
|
||||
dst.dimension_6() == src.dimension_6() &&
|
||||
dst.dimension_7() == src.dimension_7() ) {
|
||||
dst.extent(0) == src.extent(0) &&
|
||||
|
||||
dst.extent(1) == src.extent(1) &&
|
||||
dst.extent(2) == src.extent(2) &&
|
||||
dst.extent(3) == src.extent(3) &&
|
||||
dst.extent(4) == src.extent(4) &&
|
||||
dst.extent(5) == src.extent(5) &&
|
||||
dst.extent(6) == src.extent(6) &&
|
||||
dst.extent(7) == src.extent(7) ) {
|
||||
|
||||
const size_t nbytes = sizeof(typename dst_type::value_type) * dst.span();
|
||||
|
||||
@ -1673,14 +1796,14 @@ void deep_copy
|
||||
dst.span_is_contiguous() &&
|
||||
src.span_is_contiguous() &&
|
||||
dst.span() == src.span() &&
|
||||
dst.dimension_0() == src.dimension_0() &&
|
||||
dst.dimension_1() == src.dimension_1() &&
|
||||
dst.dimension_2() == src.dimension_2() &&
|
||||
dst.dimension_3() == src.dimension_3() &&
|
||||
dst.dimension_4() == src.dimension_4() &&
|
||||
dst.dimension_5() == src.dimension_5() &&
|
||||
dst.dimension_6() == src.dimension_6() &&
|
||||
dst.dimension_7() == src.dimension_7() &&
|
||||
dst.extent(0) == src.extent(0) &&
|
||||
dst.extent(1) == src.extent(1) &&
|
||||
dst.extent(2) == src.extent(2) &&
|
||||
dst.extent(3) == src.extent(3) &&
|
||||
dst.extent(4) == src.extent(4) &&
|
||||
dst.extent(5) == src.extent(5) &&
|
||||
dst.extent(6) == src.extent(6) &&
|
||||
dst.extent(7) == src.extent(7) &&
|
||||
dst.stride_0() == src.stride_0() &&
|
||||
dst.stride_1() == src.stride_1() &&
|
||||
dst.stride_2() == src.stride_2() &&
|
||||
@ -1697,11 +1820,11 @@ void deep_copy
|
||||
}
|
||||
else if ( DstExecCanAccessSrc ) {
|
||||
// Copying data between views in accessible memory spaces and either non-contiguous or incompatible shape.
|
||||
Kokkos::Experimental::Impl::DynRankViewRemap< dst_type , src_type >( dst , src );
|
||||
Kokkos::Impl::DynRankViewRemap< dst_type , src_type >( dst , src );
|
||||
}
|
||||
else if ( SrcExecCanAccessDst ) {
|
||||
// Copying data between views in accessible memory spaces and either non-contiguous or incompatible shape.
|
||||
Kokkos::Experimental::Impl::DynRankViewRemap< dst_type , src_type , src_execution_space >( dst , src );
|
||||
Kokkos::Impl::DynRankViewRemap< dst_type , src_type , src_execution_space >( dst , src );
|
||||
}
|
||||
else {
|
||||
Kokkos::Impl::throw_runtime_exception("deep_copy given views that would require a temporary allocation");
|
||||
@ -1709,7 +1832,6 @@ void deep_copy
|
||||
}
|
||||
}
|
||||
|
||||
} //end Experimental
|
||||
} //end Kokkos
|
||||
|
||||
|
||||
@ -1717,8 +1839,6 @@ void deep_copy
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
namespace Impl {
|
||||
|
||||
|
||||
@ -1726,7 +1846,7 @@ namespace Impl {
|
||||
template<class Space, class T, class ... P>
|
||||
struct MirrorDRViewType {
|
||||
// The incoming view_type
|
||||
typedef typename Kokkos::Experimental::DynRankView<T,P...> src_view_type;
|
||||
typedef typename Kokkos::DynRankView<T,P...> src_view_type;
|
||||
// The memory space for the mirror view
|
||||
typedef typename Space::memory_space memory_space;
|
||||
// Check whether it is the same memory space
|
||||
@ -1736,7 +1856,7 @@ struct MirrorDRViewType {
|
||||
// The data type (we probably want it non-const since otherwise we can't even deep_copy to it.
|
||||
typedef typename src_view_type::non_const_data_type data_type;
|
||||
// The destination view type if it is not the same memory space
|
||||
typedef Kokkos::Experimental::DynRankView<data_type,array_layout,Space> dest_view_type;
|
||||
typedef Kokkos::DynRankView<data_type,array_layout,Space> dest_view_type;
|
||||
// If it is the same memory_space return the existsing view_type
|
||||
// This will also keep the unmanaged trait if necessary
|
||||
typedef typename std::conditional<is_same_memspace,src_view_type,dest_view_type>::type view_type;
|
||||
@ -1745,7 +1865,7 @@ struct MirrorDRViewType {
|
||||
template<class Space, class T, class ... P>
|
||||
struct MirrorDRVType {
|
||||
// The incoming view_type
|
||||
typedef typename Kokkos::Experimental::DynRankView<T,P...> src_view_type;
|
||||
typedef typename Kokkos::DynRankView<T,P...> src_view_type;
|
||||
// The memory space for the mirror view
|
||||
typedef typename Space::memory_space memory_space;
|
||||
// Check whether it is the same memory space
|
||||
@ -1755,12 +1875,11 @@ struct MirrorDRVType {
|
||||
// The data type (we probably want it non-const since otherwise we can't even deep_copy to it.
|
||||
typedef typename src_view_type::non_const_data_type data_type;
|
||||
// The destination view type if it is not the same memory space
|
||||
typedef Kokkos::Experimental::DynRankView<data_type,array_layout,Space> view_type;
|
||||
typedef Kokkos::DynRankView<data_type,array_layout,Space> view_type;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
template< class T , class ... P >
|
||||
inline
|
||||
typename DynRankView<T,P...>::HostMirror
|
||||
@ -1799,7 +1918,7 @@ create_mirror( const DynRankView<T,P...> & src
|
||||
|
||||
// Create a mirror in a new space (specialization for different space)
|
||||
template<class Space, class T, class ... P>
|
||||
typename Impl::MirrorDRVType<Space,T,P ...>::view_type create_mirror(const Space& , const Kokkos::Experimental::DynRankView<T,P...> & src) {
|
||||
typename Impl::MirrorDRVType<Space,T,P ...>::view_type create_mirror(const Space& , const Kokkos::DynRankView<T,P...> & src) {
|
||||
return typename Impl::MirrorDRVType<Space,T,P ...>::view_type(src.label(), Impl::reconstructLayout(src.layout(), src.rank()) );
|
||||
}
|
||||
|
||||
@ -1836,13 +1955,13 @@ create_mirror_view( const DynRankView<T,P...> & src
|
||||
)>::type * = 0
|
||||
)
|
||||
{
|
||||
return Kokkos::Experimental::create_mirror( src );
|
||||
return Kokkos::create_mirror( src );
|
||||
}
|
||||
|
||||
// Create a mirror view in a new space (specialization for same space)
|
||||
template<class Space, class T, class ... P>
|
||||
typename Impl::MirrorDRViewType<Space,T,P ...>::view_type
|
||||
create_mirror_view(const Space& , const Kokkos::Experimental::DynRankView<T,P...> & src
|
||||
create_mirror_view(const Space& , const Kokkos::DynRankView<T,P...> & src
|
||||
, typename std::enable_if<Impl::MirrorDRViewType<Space,T,P ...>::is_same_memspace>::type* = 0 ) {
|
||||
return src;
|
||||
}
|
||||
@ -1850,12 +1969,11 @@ create_mirror_view(const Space& , const Kokkos::Experimental::DynRankView<T,P...
|
||||
// Create a mirror view in a new space (specialization for different space)
|
||||
template<class Space, class T, class ... P>
|
||||
typename Impl::MirrorDRViewType<Space,T,P ...>::view_type
|
||||
create_mirror_view(const Space& , const Kokkos::Experimental::DynRankView<T,P...> & src
|
||||
create_mirror_view(const Space& , const Kokkos::DynRankView<T,P...> & src
|
||||
, typename std::enable_if<!Impl::MirrorDRViewType<Space,T,P ...>::is_same_memspace>::type* = 0 ) {
|
||||
return typename Impl::MirrorDRViewType<Space,T,P ...>::view_type(src.label(), Impl::reconstructLayout(src.layout(), src.rank()) );
|
||||
}
|
||||
|
||||
} //end Experimental
|
||||
} //end Kokkos
|
||||
|
||||
|
||||
@ -1863,7 +1981,6 @@ create_mirror_view(const Space& , const Kokkos::Experimental::DynRankView<T,P...
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
/** \brief Resize a view with copying old data to new data at the corresponding indices. */
|
||||
template< class T , class ... P >
|
||||
inline
|
||||
@ -1877,13 +1994,13 @@ void resize( DynRankView<T,P...> & v ,
|
||||
const size_t n6 = ~size_t(0) ,
|
||||
const size_t n7 = ~size_t(0) )
|
||||
{
|
||||
typedef DynRankView<T,P...> drview_type ;
|
||||
typedef DynRankView<T,P...> drview_type ;
|
||||
|
||||
static_assert( Kokkos::ViewTraits<T,P...>::is_managed , "Can only resize managed views" );
|
||||
|
||||
drview_type v_resized( v.label(), n0, n1, n2, n3, n4, n5, n6 );
|
||||
|
||||
Kokkos::Experimental::Impl::DynRankViewRemap< drview_type , drview_type >( v_resized, v );
|
||||
Kokkos::Impl::DynRankViewRemap< drview_type , drview_type >( v_resized, v );
|
||||
|
||||
v = v_resized ;
|
||||
}
|
||||
@ -1911,25 +2028,7 @@ void realloc( DynRankView<T,P...> & v ,
|
||||
v = drview_type( label, n0, n1, n2, n3, n4, n5, n6 );
|
||||
}
|
||||
|
||||
} //end Experimental
|
||||
|
||||
} //end Kokkos
|
||||
|
||||
using Kokkos::Experimental::is_dyn_rank_view ;
|
||||
|
||||
namespace Kokkos {
|
||||
|
||||
template< typename D , class ... P >
|
||||
using DynRankView = Kokkos::Experimental::DynRankView< D , P... > ;
|
||||
|
||||
using Kokkos::Experimental::deep_copy ;
|
||||
using Kokkos::Experimental::create_mirror ;
|
||||
using Kokkos::Experimental::create_mirror_view ;
|
||||
using Kokkos::Experimental::subdynrankview ;
|
||||
using Kokkos::Experimental::subview ;
|
||||
using Kokkos::Experimental::resize ;
|
||||
using Kokkos::Experimental::realloc ;
|
||||
|
||||
} //end Kokkos
|
||||
#endif
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -52,7 +52,33 @@
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
// Simple metafunction for choosing memory space
|
||||
// In the current implementation, if memory_space == CudaSpace,
|
||||
// use CudaUVMSpace for the chunk 'array' allocation, which
|
||||
// contains will contain pointers to chunks of memory allocated
|
||||
// in CudaSpace
|
||||
namespace Impl {
|
||||
template < class MemSpace >
|
||||
struct ChunkArraySpace {
|
||||
using memory_space = MemSpace;
|
||||
};
|
||||
|
||||
#ifdef KOKKOS_ENABLE_CUDA
|
||||
template <>
|
||||
struct ChunkArraySpace< Kokkos::CudaSpace > {
|
||||
using memory_space = typename Kokkos::CudaUVMSpace;
|
||||
};
|
||||
#endif
|
||||
#ifdef KOKKOS_ENABLE_ROCM
|
||||
template <>
|
||||
struct ChunkArraySpace< Kokkos::Experimental::ROCmSpace > {
|
||||
using memory_space = typename Kokkos::Experimental::ROCmHostPinnedSpace;
|
||||
};
|
||||
#endif
|
||||
} // end namespace Impl
|
||||
|
||||
/** \brief Dynamic views are restricted to rank-one and no layout.
|
||||
* Resize only occurs on host outside of parallel_regions.
|
||||
* Subviews are not allowed.
|
||||
*/
|
||||
template< typename DataType , typename ... P >
|
||||
@ -66,7 +92,7 @@ private:
|
||||
|
||||
template< class , class ... > friend class DynamicView ;
|
||||
|
||||
typedef Kokkos::Experimental::Impl::SharedAllocationTracker track_type ;
|
||||
typedef Kokkos::Impl::SharedAllocationTracker track_type ;
|
||||
|
||||
static_assert( traits::rank == 1 && traits::rank_dynamic == 1
|
||||
, "DynamicView must be rank-one" );
|
||||
@ -86,18 +112,14 @@ private:
|
||||
{ Kokkos::abort("Kokkos::DynamicView ERROR: attempt to access inaccessible memory space"); };
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
typedef Kokkos::MemoryPool< typename traits::device_type > memory_pool ;
|
||||
|
||||
private:
|
||||
|
||||
memory_pool m_pool ;
|
||||
track_type m_track ;
|
||||
typename traits::value_type ** m_chunks ;
|
||||
unsigned m_chunk_shift ;
|
||||
unsigned m_chunk_mask ;
|
||||
unsigned m_chunk_max ;
|
||||
typename traits::value_type ** m_chunks ; // array of pointers to 'chunks' of memory
|
||||
unsigned m_chunk_shift ; // ceil(log2(m_chunk_size))
|
||||
unsigned m_chunk_mask ; // m_chunk_size - 1
|
||||
unsigned m_chunk_max ; // number of entries in the chunk array - each pointing to a chunk of extent == m_chunk_size entries
|
||||
unsigned m_chunk_size ; // 2 << (m_chunk_shift - 1)
|
||||
|
||||
public:
|
||||
|
||||
@ -125,28 +147,24 @@ public:
|
||||
|
||||
enum { Rank = 1 };
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_t allocation_extent() const noexcept
|
||||
{
|
||||
uintptr_t n = *reinterpret_cast<const uintptr_t*>( m_chunks + m_chunk_max );
|
||||
return (n << m_chunk_shift);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_t chunk_size() const noexcept
|
||||
{
|
||||
return m_chunk_size;
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_t size() const noexcept
|
||||
{
|
||||
uintptr_t n = 0 ;
|
||||
|
||||
if ( Kokkos::Impl::MemorySpaceAccess
|
||||
< Kokkos::Impl::ActiveExecutionMemorySpace
|
||||
, typename traits::memory_space
|
||||
>::accessible ) {
|
||||
n = *reinterpret_cast<const uintptr_t*>( m_chunks + m_chunk_max );
|
||||
}
|
||||
#if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST )
|
||||
else {
|
||||
Kokkos::Impl::DeepCopy< Kokkos::HostSpace
|
||||
, typename traits::memory_space
|
||||
, Kokkos::HostSpace::execution_space >
|
||||
( & n
|
||||
, reinterpret_cast<const uintptr_t*>( m_chunks + m_chunk_max )
|
||||
, sizeof(uintptr_t) );
|
||||
}
|
||||
#endif
|
||||
return n << m_chunk_shift ;
|
||||
size_t extent_0 = *reinterpret_cast<const size_t*>( m_chunks + m_chunk_max +1 );
|
||||
return extent_0;
|
||||
}
|
||||
|
||||
template< typename iType >
|
||||
@ -159,6 +177,7 @@ public:
|
||||
size_t extent_int( const iType & r ) const
|
||||
{ return r == 0 ? size() : 1 ; }
|
||||
|
||||
#ifdef KOKKOS_ENABLE_DEPRECATED_CODE
|
||||
KOKKOS_INLINE_FUNCTION size_t dimension_0() const { return size(); }
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t dimension_1() const { return 1 ; }
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t dimension_2() const { return 1 ; }
|
||||
@ -167,6 +186,7 @@ public:
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t dimension_5() const { return 1 ; }
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t dimension_6() const { return 1 ; }
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t dimension_7() const { return 1 ; }
|
||||
#endif
|
||||
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t stride_0() const { return 0 ; }
|
||||
KOKKOS_INLINE_FUNCTION constexpr size_t stride_1() const { return 0 ; }
|
||||
@ -180,6 +200,17 @@ public:
|
||||
template< typename iType >
|
||||
KOKKOS_INLINE_FUNCTION void stride( iType * const s ) const { *s = 0 ; }
|
||||
|
||||
//----------------------------------------
|
||||
// Allocation tracking properties
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
int use_count() const
|
||||
{ return m_track.use_count(); }
|
||||
|
||||
inline
|
||||
const std::string label() const
|
||||
{ return m_track.template get_label< typename traits::memory_space >(); }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Range span is the span which contains all members.
|
||||
|
||||
@ -234,65 +265,15 @@ public:
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
/** \brief Resizing in parallel only increases the array size,
|
||||
* never decrease.
|
||||
*/
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void resize_parallel( size_t n ) const
|
||||
{
|
||||
typedef typename traits::value_type value_type ;
|
||||
|
||||
DynamicView::template verify_space< Kokkos::Impl::ActiveExecutionMemorySpace >::check();
|
||||
|
||||
const uintptr_t NC = ( n + m_chunk_mask ) >> m_chunk_shift ;
|
||||
|
||||
if ( m_chunk_max < NC ) {
|
||||
#if defined( KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK )
|
||||
printf("DynamicView::resize_parallel(%lu) m_chunk_max(%u) NC(%lu)\n"
|
||||
, n , m_chunk_max , NC );
|
||||
#endif
|
||||
Kokkos::abort("DynamicView::resize_parallel exceeded maximum size");
|
||||
}
|
||||
|
||||
typename traits::value_type * volatile * const ch = m_chunks ;
|
||||
|
||||
// The allocated chunk counter is m_chunks[ m_chunk_max ]
|
||||
uintptr_t volatile * const pc =
|
||||
reinterpret_cast<uintptr_t volatile*>( m_chunks + m_chunk_max );
|
||||
|
||||
// Potentially concurrent iteration of allocation to the required size.
|
||||
|
||||
for ( uintptr_t jc = *pc ; jc < NC ; ) {
|
||||
|
||||
// Claim the 'jc' chunk to-be-allocated index
|
||||
|
||||
const uintptr_t jc_try = jc ;
|
||||
|
||||
// Jump iteration to the chunk counter.
|
||||
|
||||
jc = atomic_compare_exchange( pc , jc_try , jc_try + 1 );
|
||||
|
||||
if ( jc_try == jc ) {
|
||||
|
||||
ch[jc_try] = reinterpret_cast<value_type*>(
|
||||
m_pool.allocate( sizeof(value_type) << m_chunk_shift ));
|
||||
|
||||
if ( 0 == ch[jc_try] ) {
|
||||
Kokkos::abort("DynamicView::resize_parallel exhausted memory pool");
|
||||
}
|
||||
|
||||
Kokkos::memory_fence();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Resizing in serial can grow or shrink the array size, */
|
||||
/** \brief Resizing in serial can grow or shrink the array size
|
||||
* up to the maximum number of chunks
|
||||
* */
|
||||
template< typename IntType >
|
||||
inline
|
||||
typename std::enable_if
|
||||
< std::is_integral<IntType>::value &&
|
||||
Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace
|
||||
, typename traits::memory_space
|
||||
, typename Impl::ChunkArraySpace< typename traits::memory_space >::memory_space
|
||||
>::accessible
|
||||
>::type
|
||||
resize_serial( IntType const & n )
|
||||
@ -300,108 +281,35 @@ public:
|
||||
typedef typename traits::value_type value_type ;
|
||||
typedef value_type * pointer_type ;
|
||||
|
||||
const uintptr_t NC = ( n + m_chunk_mask ) >> m_chunk_shift ;
|
||||
const uintptr_t NC = ( n + m_chunk_mask ) >> m_chunk_shift ; // New total number of chunks needed for resize
|
||||
|
||||
if ( m_chunk_max < NC ) {
|
||||
Kokkos::abort("DynamicView::resize_serial exceeded maximum size");
|
||||
}
|
||||
|
||||
// *m_chunks[m_chunk_max] stores the current number of chunks being used
|
||||
uintptr_t * const pc =
|
||||
reinterpret_cast<uintptr_t*>( m_chunks + m_chunk_max );
|
||||
|
||||
if ( *pc < NC ) {
|
||||
while ( *pc < NC ) {
|
||||
m_chunks[*pc] = reinterpret_cast<pointer_type>
|
||||
( m_pool.allocate( sizeof(value_type) << m_chunk_shift ) );
|
||||
(
|
||||
typename traits::memory_space().allocate( sizeof(value_type) << m_chunk_shift )
|
||||
);
|
||||
++*pc ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
while ( NC + 1 <= *pc ) {
|
||||
--*pc ;
|
||||
m_pool.deallocate( m_chunks[*pc]
|
||||
, sizeof(value_type) << m_chunk_shift );
|
||||
typename traits::memory_space().deallocate( m_chunks[*pc]
|
||||
, sizeof(value_type) << m_chunk_shift );
|
||||
m_chunks[*pc] = 0 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
struct ResizeSerial {
|
||||
memory_pool m_pool ;
|
||||
typename traits::value_type ** m_chunks ;
|
||||
uintptr_t * m_pc ;
|
||||
uintptr_t m_nc ;
|
||||
unsigned m_chunk_shift ;
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()( int ) const
|
||||
{
|
||||
typedef typename traits::value_type value_type ;
|
||||
typedef value_type * pointer_type ;
|
||||
|
||||
if ( *m_pc < m_nc ) {
|
||||
while ( *m_pc < m_nc ) {
|
||||
m_chunks[*m_pc] = reinterpret_cast<pointer_type>
|
||||
( m_pool.allocate( sizeof(value_type) << m_chunk_shift ) );
|
||||
++*m_pc ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
while ( m_nc + 1 <= *m_pc ) {
|
||||
--*m_pc ;
|
||||
m_pool.deallocate( m_chunks[*m_pc]
|
||||
, sizeof(value_type) << m_chunk_shift );
|
||||
m_chunks[*m_pc] = 0 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ResizeSerial( memory_pool const & arg_pool
|
||||
, typename traits::value_type ** arg_chunks
|
||||
, uintptr_t * arg_pc
|
||||
, uintptr_t arg_nc
|
||||
, unsigned arg_chunk_shift
|
||||
)
|
||||
: m_pool( arg_pool )
|
||||
, m_chunks( arg_chunks )
|
||||
, m_pc( arg_pc )
|
||||
, m_nc( arg_nc )
|
||||
, m_chunk_shift( arg_chunk_shift )
|
||||
{}
|
||||
};
|
||||
|
||||
template< typename IntType >
|
||||
inline
|
||||
typename std::enable_if
|
||||
< std::is_integral<IntType>::value &&
|
||||
! Kokkos::Impl::MemorySpaceAccess< Kokkos::HostSpace
|
||||
, typename traits::memory_space
|
||||
>::accessible
|
||||
>::type
|
||||
resize_serial( IntType const & n )
|
||||
{
|
||||
const uintptr_t NC = ( n + m_chunk_mask ) >> m_chunk_shift ;
|
||||
|
||||
if ( m_chunk_max < NC ) {
|
||||
Kokkos::abort("DynamicView::resize_serial exceeded maximum size");
|
||||
}
|
||||
|
||||
// Must dispatch kernel
|
||||
|
||||
typedef Kokkos::RangePolicy< typename traits::execution_space > Range ;
|
||||
|
||||
uintptr_t * const pc =
|
||||
reinterpret_cast<uintptr_t*>( m_chunks + m_chunk_max );
|
||||
|
||||
Kokkos::Impl::ParallelFor<ResizeSerial,Range>
|
||||
closure( ResizeSerial( m_pool, m_chunks, pc, NC, m_chunk_shift )
|
||||
, Range(0,1) );
|
||||
|
||||
closure.execute();
|
||||
|
||||
traits::execution_space::fence();
|
||||
// *m_chunks[m_chunk_max+1] stores the 'extent' requested by resize
|
||||
*(pc+1) = n;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
@ -415,12 +323,12 @@ public:
|
||||
|
||||
template< class RT , class ... RP >
|
||||
DynamicView( const DynamicView<RT,RP...> & rhs )
|
||||
: m_pool( rhs.m_pool )
|
||||
, m_track( rhs.m_track )
|
||||
: m_track( rhs.m_track )
|
||||
, m_chunks( (typename traits::value_type **) rhs.m_chunks )
|
||||
, m_chunk_shift( rhs.m_chunk_shift )
|
||||
, m_chunk_mask( rhs.m_chunk_mask )
|
||||
, m_chunk_max( rhs.m_chunk_max )
|
||||
, m_chunk_size( rhs.m_chunk_size )
|
||||
{
|
||||
typedef typename DynamicView<RT,RP...>::traits SrcTraits ;
|
||||
typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , void > Mapping ;
|
||||
@ -430,35 +338,36 @@ public:
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
struct Destroy {
|
||||
memory_pool m_pool ;
|
||||
typename traits::value_type ** m_chunks ;
|
||||
unsigned m_chunk_max ;
|
||||
bool m_destroy ;
|
||||
unsigned m_chunk_size ;
|
||||
|
||||
// Initialize or destroy array of chunk pointers.
|
||||
// Two entries beyond the max chunks are allocation counters.
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
inline
|
||||
void operator()( unsigned i ) const
|
||||
{
|
||||
if ( m_destroy && i < m_chunk_max && 0 != m_chunks[i] ) {
|
||||
m_pool.deallocate( m_chunks[i] , m_pool.min_block_size() );
|
||||
typename traits::memory_space().deallocate( m_chunks[i], m_chunk_size );
|
||||
}
|
||||
m_chunks[i] = 0 ;
|
||||
}
|
||||
|
||||
void execute( bool arg_destroy )
|
||||
{
|
||||
typedef Kokkos::RangePolicy< typename traits::execution_space > Range ;
|
||||
typedef Kokkos::RangePolicy< typename HostSpace::execution_space > Range ;
|
||||
//typedef Kokkos::RangePolicy< typename Impl::ChunkArraySpace< typename traits::memory_space >::memory_space::execution_space > Range ;
|
||||
|
||||
m_destroy = arg_destroy ;
|
||||
|
||||
Kokkos::Impl::ParallelFor<Destroy,Range>
|
||||
closure( *this , Range(0, m_chunk_max + 1) );
|
||||
closure( *this , Range(0, m_chunk_max + 2) ); // Add 2 to 'destroy' extra slots storing num_chunks and extent; previously + 1
|
||||
|
||||
closure.execute();
|
||||
|
||||
traits::execution_space::fence();
|
||||
//Impl::ChunkArraySpace< typename traits::memory_space >::memory_space::execution_space::fence();
|
||||
}
|
||||
|
||||
void construct_shared_allocation()
|
||||
@ -473,66 +382,64 @@ public:
|
||||
Destroy & operator = ( Destroy && ) = default ;
|
||||
Destroy & operator = ( const Destroy & ) = default ;
|
||||
|
||||
Destroy( const memory_pool & arg_pool
|
||||
, typename traits::value_type ** arg_chunk
|
||||
, const unsigned arg_chunk_max )
|
||||
: m_pool( arg_pool )
|
||||
, m_chunks( arg_chunk )
|
||||
Destroy( typename traits::value_type ** arg_chunk
|
||||
, const unsigned arg_chunk_max
|
||||
, const unsigned arg_chunk_size )
|
||||
: m_chunks( arg_chunk )
|
||||
, m_chunk_max( arg_chunk_max )
|
||||
, m_destroy( false )
|
||||
, m_chunk_size( arg_chunk_size )
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
/**\brief Allocation constructor
|
||||
*
|
||||
* Memory is allocated in chunks from the memory pool.
|
||||
* The chunk size conforms to the memory pool's chunk size.
|
||||
* Memory is allocated in chunks
|
||||
* A maximum size is required in order to allocate a
|
||||
* chunk-pointer array.
|
||||
*/
|
||||
explicit inline
|
||||
DynamicView( const std::string & arg_label
|
||||
, const memory_pool & arg_pool
|
||||
, const size_t arg_size_max )
|
||||
: m_pool( arg_pool )
|
||||
, m_track()
|
||||
, const unsigned min_chunk_size
|
||||
, const unsigned max_extent )
|
||||
: m_track()
|
||||
, m_chunks(0)
|
||||
// The memory pool chunk is guaranteed to be a power of two
|
||||
// The chunk size is guaranteed to be a power of two
|
||||
, m_chunk_shift(
|
||||
Kokkos::Impl::integral_power_of_two(
|
||||
m_pool.min_block_size()/sizeof(typename traits::value_type)) )
|
||||
, m_chunk_mask( ( 1 << m_chunk_shift ) - 1 )
|
||||
, m_chunk_max( ( arg_size_max + m_chunk_mask ) >> m_chunk_shift )
|
||||
Kokkos::Impl::integral_power_of_two_that_contains( min_chunk_size ) ) // div ceil(log2(min_chunk_size))
|
||||
, m_chunk_mask( ( 1 << m_chunk_shift ) - 1 ) // mod
|
||||
, m_chunk_max( ( max_extent + m_chunk_mask ) >> m_chunk_shift ) // max num pointers-to-chunks in array
|
||||
, m_chunk_size ( 2 << (m_chunk_shift - 1) )
|
||||
{
|
||||
typedef typename Impl::ChunkArraySpace< typename traits::memory_space >::memory_space chunk_array_memory_space;
|
||||
// A functor to deallocate all of the chunks upon final destruction
|
||||
|
||||
typedef typename traits::memory_space memory_space ;
|
||||
typedef Kokkos::Experimental::Impl::SharedAllocationRecord< memory_space , Destroy > record_type ;
|
||||
typedef Kokkos::Impl::SharedAllocationRecord< chunk_array_memory_space , Destroy > record_type ;
|
||||
|
||||
// Allocate chunk pointers and allocation counter
|
||||
record_type * const record =
|
||||
record_type::allocate( memory_space()
|
||||
record_type::allocate( chunk_array_memory_space()
|
||||
, arg_label
|
||||
, ( sizeof(pointer_type) * ( m_chunk_max + 1 ) ) );
|
||||
, ( sizeof(pointer_type) * ( m_chunk_max + 2 ) ) );
|
||||
// Allocate + 2 extra slots so that *m_chunk[m_chunk_max] == num_chunks_alloc and *m_chunk[m_chunk_max+1] == extent
|
||||
// This must match in Destroy's execute(...) method
|
||||
|
||||
m_chunks = reinterpret_cast<pointer_type*>( record->data() );
|
||||
|
||||
record->m_destroy = Destroy( m_pool , m_chunks , m_chunk_max );
|
||||
record->m_destroy = Destroy( m_chunks , m_chunk_max, m_chunk_size );
|
||||
|
||||
// Initialize to zero
|
||||
|
||||
record->m_destroy.construct_shared_allocation();
|
||||
|
||||
m_track.assign_allocated_record_to_uninitialized( record );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // namespace Experimental
|
||||
} // namespace Kokkos
|
||||
|
||||
namespace Kokkos {
|
||||
namespace Experimental {
|
||||
|
||||
template< class T , class ... P >
|
||||
inline
|
||||
@ -545,11 +452,11 @@ create_mirror_view( const Kokkos::Experimental::DynamicView<T,P...> & src )
|
||||
template< class T , class ... DP , class ... SP >
|
||||
inline
|
||||
void deep_copy( const View<T,DP...> & dst
|
||||
, const DynamicView<T,SP...> & src
|
||||
, const Kokkos::Experimental::DynamicView<T,SP...> & src
|
||||
)
|
||||
{
|
||||
typedef View<T,DP...> dst_type ;
|
||||
typedef DynamicView<T,SP...> src_type ;
|
||||
typedef Kokkos::Experimental::DynamicView<T,SP...> src_type ;
|
||||
|
||||
typedef typename ViewTraits<T,DP...>::execution_space dst_execution_space ;
|
||||
typedef typename ViewTraits<T,SP...>::memory_space src_memory_space ;
|
||||
@ -568,11 +475,11 @@ void deep_copy( const View<T,DP...> & dst
|
||||
|
||||
template< class T , class ... DP , class ... SP >
|
||||
inline
|
||||
void deep_copy( const DynamicView<T,DP...> & dst
|
||||
void deep_copy( const Kokkos::Experimental::DynamicView<T,DP...> & dst
|
||||
, const View<T,SP...> & src
|
||||
)
|
||||
{
|
||||
typedef DynamicView<T,SP...> dst_type ;
|
||||
typedef Kokkos::Experimental::DynamicView<T,SP...> dst_type ;
|
||||
typedef View<T,DP...> src_type ;
|
||||
|
||||
typedef typename ViewTraits<T,DP...>::execution_space dst_execution_space ;
|
||||
@ -590,7 +497,81 @@ void deep_copy( const DynamicView<T,DP...> & dst
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Experimental
|
||||
namespace Impl {
|
||||
template<class Arg0, class ... DP , class ... SP>
|
||||
struct CommonSubview<Kokkos::Experimental::DynamicView<DP...>,Kokkos::Experimental::DynamicView<SP...>,1,Arg0> {
|
||||
typedef Kokkos::Experimental::DynamicView<DP...> DstType;
|
||||
typedef Kokkos::Experimental::DynamicView<SP...> SrcType;
|
||||
typedef DstType dst_subview_type;
|
||||
typedef SrcType src_subview_type;
|
||||
dst_subview_type dst_sub;
|
||||
src_subview_type src_sub;
|
||||
CommonSubview(const DstType& dst, const SrcType& src, const Arg0& arg0):
|
||||
dst_sub(dst),src_sub(src) {}
|
||||
};
|
||||
|
||||
template<class ...DP, class SrcType, class Arg0>
|
||||
struct CommonSubview<Kokkos::Experimental::DynamicView<DP...>,SrcType,1,Arg0> {
|
||||
typedef Kokkos::Experimental::DynamicView<DP...> DstType;
|
||||
typedef DstType dst_subview_type;
|
||||
typedef typename Kokkos::Subview<SrcType,Arg0> src_subview_type;
|
||||
dst_subview_type dst_sub;
|
||||
src_subview_type src_sub;
|
||||
CommonSubview(const DstType& dst, const SrcType& src, const Arg0& arg0):
|
||||
dst_sub(dst),src_sub(src,arg0) {}
|
||||
};
|
||||
|
||||
template<class DstType, class ...SP, class Arg0>
|
||||
struct CommonSubview<DstType,Kokkos::Experimental::DynamicView<SP...>,1,Arg0> {
|
||||
typedef Kokkos::Experimental::DynamicView<SP...> SrcType;
|
||||
typedef typename Kokkos::Subview<DstType,Arg0> dst_subview_type;
|
||||
typedef SrcType src_subview_type;
|
||||
dst_subview_type dst_sub;
|
||||
src_subview_type src_sub;
|
||||
CommonSubview(const DstType& dst, const SrcType& src, const Arg0& arg0):
|
||||
dst_sub(dst,arg0),src_sub(src) {}
|
||||
};
|
||||
|
||||
template<class ...DP,class ViewTypeB, class Layout, class ExecSpace,typename iType>
|
||||
struct ViewCopy<Kokkos::Experimental::DynamicView<DP...>,ViewTypeB,Layout,ExecSpace,1,iType> {
|
||||
Kokkos::Experimental::DynamicView<DP...> a;
|
||||
ViewTypeB b;
|
||||
|
||||
typedef Kokkos::RangePolicy<ExecSpace,Kokkos::IndexType<iType>> policy_type;
|
||||
|
||||
ViewCopy(const Kokkos::Experimental::DynamicView<DP...>& a_, const ViewTypeB& b_):a(a_),b(b_) {
|
||||
Kokkos::parallel_for("Kokkos::ViewCopy-2D",
|
||||
policy_type(0,b.extent(0)),*this);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() (const iType& i0) const {
|
||||
a(i0) = b(i0);
|
||||
};
|
||||
};
|
||||
|
||||
template<class ...DP,class ...SP, class Layout, class ExecSpace,typename iType>
|
||||
struct ViewCopy<Kokkos::Experimental::DynamicView<DP...>,
|
||||
Kokkos::Experimental::DynamicView<SP...>,Layout,ExecSpace,1,iType> {
|
||||
Kokkos::Experimental::DynamicView<DP...> a;
|
||||
Kokkos::Experimental::DynamicView<SP...> b;
|
||||
|
||||
typedef Kokkos::RangePolicy<ExecSpace,Kokkos::IndexType<iType>> policy_type;
|
||||
|
||||
ViewCopy(const Kokkos::Experimental::DynamicView<DP...>& a_,
|
||||
const Kokkos::Experimental::DynamicView<SP...>& b_):a(a_),b(b_) {
|
||||
const iType n = std::min(a.extent(0),b.extent(0));
|
||||
Kokkos::parallel_for("Kokkos::ViewCopy-2D",
|
||||
policy_type(0,n),*this);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() (const iType& i0) const {
|
||||
a(i0) = b(i0);
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace Impl
|
||||
} // namespace Kokkos
|
||||
|
||||
#endif /* #ifndef KOKKOS_DYNAMIC_VIEW_HPP */
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -69,7 +69,7 @@ public:
|
||||
clear();
|
||||
}
|
||||
|
||||
int getCapacity() const { return m_reports.h_view.dimension_0(); }
|
||||
int getCapacity() const { return m_reports.h_view.extent(0); }
|
||||
|
||||
int getNumReports();
|
||||
|
||||
@ -90,7 +90,7 @@ public:
|
||||
{
|
||||
int idx = Kokkos::atomic_fetch_add(&m_numReportsAttempted(), 1);
|
||||
|
||||
if (idx >= 0 && (idx < static_cast<int>(m_reports.d_view.dimension_0()))) {
|
||||
if (idx >= 0 && (idx < static_cast<int>(m_reports.d_view.extent(0)))) {
|
||||
m_reporters.d_view(idx) = reporter_id;
|
||||
m_reports.d_view(idx) = report;
|
||||
return true;
|
||||
@ -118,8 +118,8 @@ inline int ErrorReporter<ReportType, DeviceType>::getNumReports()
|
||||
{
|
||||
int num_reports = 0;
|
||||
Kokkos::deep_copy(num_reports,m_numReportsAttempted);
|
||||
if (num_reports > static_cast<int>(m_reports.h_view.dimension_0())) {
|
||||
num_reports = m_reports.h_view.dimension_0();
|
||||
if (num_reports > static_cast<int>(m_reports.h_view.extent(0))) {
|
||||
num_reports = m_reports.h_view.extent(0);
|
||||
}
|
||||
return num_reports;
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -623,14 +623,12 @@ public:
|
||||
typename ExecSpace::memory_space,
|
||||
typename dest_type::memory_space>::value,
|
||||
"ScatterView deep_copy destination memory space not accessible");
|
||||
size_t strides[8];
|
||||
internal_view.stride(strides);
|
||||
bool is_equal = (dest.data() == internal_view.data());
|
||||
size_t start = is_equal ? 1 : 0;
|
||||
Kokkos::Impl::Experimental::ReduceDuplicates<ExecSpace, original_value_type, Op>(
|
||||
internal_view.data(),
|
||||
dest.data(),
|
||||
strides[0],
|
||||
internal_view.stride(0),
|
||||
start,
|
||||
internal_view.extent(0),
|
||||
internal_view.label());
|
||||
@ -772,9 +770,6 @@ public:
|
||||
typename ExecSpace::memory_space,
|
||||
typename dest_type::memory_space>::value,
|
||||
"ScatterView deep_copy destination memory space not accessible");
|
||||
size_t strides[8];
|
||||
internal_view.stride(strides);
|
||||
size_t stride = strides[internal_view_type::rank - 1];
|
||||
auto extent = internal_view.extent(
|
||||
internal_view_type::rank - 1);
|
||||
bool is_equal = (dest.data() == internal_view.data());
|
||||
@ -782,7 +777,7 @@ public:
|
||||
Kokkos::Impl::Experimental::ReduceDuplicates<ExecSpace, original_value_type, Op>(
|
||||
internal_view.data(),
|
||||
dest.data(),
|
||||
stride,
|
||||
internal_view.stride(internal_view_type::rank - 1),
|
||||
start,
|
||||
extent,
|
||||
internal_view.label());
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -70,7 +70,7 @@ namespace Impl {
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() (const int_type& iRow) const {
|
||||
const int_type num_rows = row_offsets.dimension_0()-1;
|
||||
const int_type num_rows = row_offsets.extent(0)-1;
|
||||
const int_type num_entries = row_offsets(num_rows);
|
||||
const int_type total_cost = num_entries + num_rows*cost_per_row;
|
||||
|
||||
@ -105,7 +105,7 @@ namespace Impl {
|
||||
}
|
||||
} else {
|
||||
if((count >= (current_block + 1) * cost_per_workset) ||
|
||||
(iRow+2 == row_offsets.dimension_0())) {
|
||||
(iRow+2 == row_offsets.extent(0))) {
|
||||
if(end_block>current_block+1) {
|
||||
int_type num_block = end_block-current_block;
|
||||
row_block_offsets(current_block+1) = iRow;
|
||||
@ -330,8 +330,8 @@ public:
|
||||
*/
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_type numRows() const {
|
||||
return (row_map.dimension_0 () != 0) ?
|
||||
row_map.dimension_0 () - static_cast<size_type> (1) :
|
||||
return (row_map.extent(0) != 0) ?
|
||||
row_map.extent(0) - static_cast<size_type> (1) :
|
||||
static_cast<size_type> (0);
|
||||
}
|
||||
|
||||
@ -458,7 +458,7 @@ DataType maximum_entry( const StaticCrsGraph< DataType , Arg1Type , Arg2Type , S
|
||||
typedef Impl::StaticCrsGraphMaximumEntry< GraphType > FunctorType ;
|
||||
|
||||
DataType result = 0 ;
|
||||
Kokkos::parallel_reduce( graph.entries.dimension_0(),
|
||||
Kokkos::parallel_reduce( graph.entries.extent(0),
|
||||
FunctorType(graph), result );
|
||||
return result ;
|
||||
}
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -477,7 +477,7 @@ public:
|
||||
/// kernel.
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_type hash_capacity() const
|
||||
{ return m_hash_lists.dimension_0(); }
|
||||
{ return m_hash_lists.extent(0); }
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------------
|
||||
@ -507,13 +507,13 @@ public:
|
||||
int volatile & failed_insert_ref = m_scalars((int)failed_insert_idx) ;
|
||||
|
||||
const size_type hash_value = m_hasher(k);
|
||||
const size_type hash_list = hash_value % m_hash_lists.dimension_0();
|
||||
const size_type hash_list = hash_value % m_hash_lists.extent(0);
|
||||
|
||||
size_type * curr_ptr = & m_hash_lists[ hash_list ];
|
||||
size_type new_index = invalid_index ;
|
||||
|
||||
// Force integer multiply to long
|
||||
size_type index_hint = static_cast<size_type>( (static_cast<double>(hash_list) * capacity()) / m_hash_lists.dimension_0());
|
||||
size_type index_hint = static_cast<size_type>( (static_cast<double>(hash_list) * capacity()) / m_hash_lists.extent(0));
|
||||
|
||||
size_type find_attempts = 0;
|
||||
|
||||
@ -645,7 +645,7 @@ public:
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
size_type find( const key_type & k) const
|
||||
{
|
||||
size_type curr = 0u < capacity() ? m_hash_lists( m_hasher(k) % m_hash_lists.dimension_0() ) : invalid_index ;
|
||||
size_type curr = 0u < capacity() ? m_hash_lists( m_hasher(k) % m_hash_lists.extent(0) ) : invalid_index ;
|
||||
|
||||
KOKKOS_NONTEMPORAL_PREFETCH_LOAD(&m_keys[curr != invalid_index ? curr : 0]);
|
||||
while (curr != invalid_index && !m_equal_to( m_keys[curr], k) ) {
|
||||
@ -741,7 +741,7 @@ public:
|
||||
>::type
|
||||
create_copy_view( UnorderedMap<SKey, SValue, SDevice, Hasher,EqualTo> const& src)
|
||||
{
|
||||
if (m_hash_lists.ptr_on_device() != src.m_hash_lists.ptr_on_device()) {
|
||||
if (m_hash_lists.data() != src.m_hash_lists.data()) {
|
||||
|
||||
insertable_map_type tmp;
|
||||
|
||||
@ -750,23 +750,23 @@ public:
|
||||
tmp.m_equal_to = src.m_equal_to;
|
||||
tmp.m_size = src.size();
|
||||
tmp.m_available_indexes = bitset_type( src.capacity() );
|
||||
tmp.m_hash_lists = size_type_view( ViewAllocateWithoutInitializing("UnorderedMap hash list"), src.m_hash_lists.dimension_0() );
|
||||
tmp.m_next_index = size_type_view( ViewAllocateWithoutInitializing("UnorderedMap next index"), src.m_next_index.dimension_0() );
|
||||
tmp.m_keys = key_type_view( ViewAllocateWithoutInitializing("UnorderedMap keys"), src.m_keys.dimension_0() );
|
||||
tmp.m_values = value_type_view( ViewAllocateWithoutInitializing("UnorderedMap values"), src.m_values.dimension_0() );
|
||||
tmp.m_hash_lists = size_type_view( ViewAllocateWithoutInitializing("UnorderedMap hash list"), src.m_hash_lists.extent(0) );
|
||||
tmp.m_next_index = size_type_view( ViewAllocateWithoutInitializing("UnorderedMap next index"), src.m_next_index.extent(0) );
|
||||
tmp.m_keys = key_type_view( ViewAllocateWithoutInitializing("UnorderedMap keys"), src.m_keys.extent(0) );
|
||||
tmp.m_values = value_type_view( ViewAllocateWithoutInitializing("UnorderedMap values"), src.m_values.extent(0) );
|
||||
tmp.m_scalars = scalars_view("UnorderedMap scalars");
|
||||
|
||||
Kokkos::deep_copy(tmp.m_available_indexes, src.m_available_indexes);
|
||||
|
||||
typedef Kokkos::Impl::DeepCopy< typename device_type::memory_space, typename SDevice::memory_space > raw_deep_copy;
|
||||
|
||||
raw_deep_copy(tmp.m_hash_lists.ptr_on_device(), src.m_hash_lists.ptr_on_device(), sizeof(size_type)*src.m_hash_lists.dimension_0());
|
||||
raw_deep_copy(tmp.m_next_index.ptr_on_device(), src.m_next_index.ptr_on_device(), sizeof(size_type)*src.m_next_index.dimension_0());
|
||||
raw_deep_copy(tmp.m_keys.ptr_on_device(), src.m_keys.ptr_on_device(), sizeof(key_type)*src.m_keys.dimension_0());
|
||||
raw_deep_copy(tmp.m_hash_lists.data(), src.m_hash_lists.data(), sizeof(size_type)*src.m_hash_lists.extent(0));
|
||||
raw_deep_copy(tmp.m_next_index.data(), src.m_next_index.data(), sizeof(size_type)*src.m_next_index.extent(0));
|
||||
raw_deep_copy(tmp.m_keys.data(), src.m_keys.data(), sizeof(key_type)*src.m_keys.extent(0));
|
||||
if (!is_set) {
|
||||
raw_deep_copy(tmp.m_values.ptr_on_device(), src.m_values.ptr_on_device(), sizeof(impl_value_type)*src.m_values.dimension_0());
|
||||
raw_deep_copy(tmp.m_values.data(), src.m_values.data(), sizeof(impl_value_type)*src.m_values.extent(0));
|
||||
}
|
||||
raw_deep_copy(tmp.m_scalars.ptr_on_device(), src.m_scalars.ptr_on_device(), sizeof(int)*num_scalars );
|
||||
raw_deep_copy(tmp.m_scalars.data(), src.m_scalars.data(), sizeof(int)*num_scalars );
|
||||
|
||||
*this = tmp;
|
||||
}
|
||||
@ -784,21 +784,21 @@ private: // private member functions
|
||||
{
|
||||
typedef Kokkos::Impl::DeepCopy< typename device_type::memory_space, Kokkos::HostSpace > raw_deep_copy;
|
||||
const int true_ = true;
|
||||
raw_deep_copy(m_scalars.ptr_on_device() + flag, &true_, sizeof(int));
|
||||
raw_deep_copy(m_scalars.data() + flag, &true_, sizeof(int));
|
||||
}
|
||||
|
||||
void reset_flag(int flag) const
|
||||
{
|
||||
typedef Kokkos::Impl::DeepCopy< typename device_type::memory_space, Kokkos::HostSpace > raw_deep_copy;
|
||||
const int false_ = false;
|
||||
raw_deep_copy(m_scalars.ptr_on_device() + flag, &false_, sizeof(int));
|
||||
raw_deep_copy(m_scalars.data() + flag, &false_, sizeof(int));
|
||||
}
|
||||
|
||||
bool get_flag(int flag) const
|
||||
{
|
||||
typedef Kokkos::Impl::DeepCopy< Kokkos::HostSpace, typename device_type::memory_space > raw_deep_copy;
|
||||
int result = false;
|
||||
raw_deep_copy(&result, m_scalars.ptr_on_device() + flag, sizeof(int));
|
||||
raw_deep_copy(&result, m_scalars.data() + flag, sizeof(int));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -80,7 +80,7 @@ struct BitsetCount
|
||||
size_type apply() const
|
||||
{
|
||||
size_type count = 0u;
|
||||
parallel_reduce( m_bitset.m_blocks.dimension_0(), *this, count );
|
||||
parallel_reduce( m_bitset.m_blocks.extent(0), *this, count );
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -102,7 +102,7 @@ struct UnorderedMapErase
|
||||
|
||||
void apply() const
|
||||
{
|
||||
parallel_for(m_map.m_hash_lists.dimension_0(), *this);
|
||||
parallel_for(m_map.m_hash_lists.extent(0), *this);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
@ -170,7 +170,7 @@ struct UnorderedMapHistogram
|
||||
|
||||
void calculate()
|
||||
{
|
||||
parallel_for(m_map.m_hash_lists.dimension_0(), *this);
|
||||
parallel_for(m_map.m_hash_lists.extent(0), *this);
|
||||
}
|
||||
|
||||
void clear()
|
||||
@ -185,7 +185,7 @@ struct UnorderedMapHistogram
|
||||
host_histogram_view host_copy = create_mirror_view(m_length);
|
||||
Kokkos::deep_copy(host_copy, m_length);
|
||||
|
||||
for (int i=0, size = host_copy.dimension_0(); i<size; ++i)
|
||||
for (int i=0, size = host_copy.extent(0); i<size; ++i)
|
||||
{
|
||||
out << host_copy[i] << " , ";
|
||||
}
|
||||
@ -197,7 +197,7 @@ struct UnorderedMapHistogram
|
||||
host_histogram_view host_copy = create_mirror_view(m_distance);
|
||||
Kokkos::deep_copy(host_copy, m_distance);
|
||||
|
||||
for (int i=0, size = host_copy.dimension_0(); i<size; ++i)
|
||||
for (int i=0, size = host_copy.extent(0); i<size; ++i)
|
||||
{
|
||||
out << host_copy[i] << " , ";
|
||||
}
|
||||
@ -209,7 +209,7 @@ struct UnorderedMapHistogram
|
||||
host_histogram_view host_copy = create_mirror_view(m_block_distance);
|
||||
Kokkos::deep_copy(host_copy, m_block_distance);
|
||||
|
||||
for (int i=0, size = host_copy.dimension_0(); i<size; ++i)
|
||||
for (int i=0, size = host_copy.extent(0); i<size; ++i)
|
||||
{
|
||||
out << host_copy[i] << " , ";
|
||||
}
|
||||
@ -261,7 +261,7 @@ struct UnorderedMapPrint
|
||||
|
||||
void apply()
|
||||
{
|
||||
parallel_for(m_map.m_hash_lists.dimension_0(), *this);
|
||||
parallel_for(m_map.m_hash_lists.extent(0), *this);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -83,13 +83,9 @@ protected:
|
||||
static void SetUpTestCase()
|
||||
{
|
||||
std::cout << std::setprecision(5) << std::scientific;
|
||||
Kokkos::HostSpace::execution_space::initialize();
|
||||
Kokkos::Cuda::initialize( Kokkos::Cuda::SelectDevice(0) );
|
||||
}
|
||||
static void TearDownTestCase()
|
||||
{
|
||||
Kokkos::Cuda::finalize();
|
||||
Kokkos::HostSpace::execution_space::finalize();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -88,10 +88,10 @@ namespace Impl {
|
||||
|
||||
a.template sync<typename ViewType::host_mirror_space>();
|
||||
Scalar count = 0;
|
||||
for(unsigned int i = 0; i<a.d_view.dimension_0(); i++)
|
||||
for(unsigned int j = 0; j<a.d_view.dimension_1(); j++)
|
||||
for(unsigned int i = 0; i<a.d_view.extent(0); i++)
|
||||
for(unsigned int j = 0; j<a.d_view.extent(1); j++)
|
||||
count += a.h_view(i,j);
|
||||
return count - a.d_view.dimension_0()*a.d_view.dimension_1()-2-4-3*2;
|
||||
return count - a.d_view.extent(0)*a.d_view.extent(1)-2-4-3*2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -61,114 +61,181 @@ struct TestDynamicView
|
||||
typedef typename Space::execution_space execution_space ;
|
||||
typedef typename Space::memory_space memory_space ;
|
||||
|
||||
typedef Kokkos::MemoryPool<typename Space::device_type> memory_pool_type;
|
||||
|
||||
typedef Kokkos::Experimental::DynamicView<Scalar*,Space> view_type;
|
||||
typedef typename view_type::const_type const_view_type ;
|
||||
|
||||
typedef typename Kokkos::TeamPolicy<execution_space>::member_type member_type ;
|
||||
typedef double value_type;
|
||||
|
||||
struct TEST {};
|
||||
struct VERIFY {};
|
||||
|
||||
view_type a;
|
||||
const unsigned total_size ;
|
||||
|
||||
TestDynamicView( const view_type & arg_a , const unsigned arg_total )
|
||||
: a(arg_a), total_size( arg_total ) {}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() ( const TEST , member_type team_member, double& value) const
|
||||
{
|
||||
const unsigned int team_idx = team_member.league_rank() * team_member.team_size();
|
||||
|
||||
if ( team_member.team_rank() == 0 ) {
|
||||
unsigned n = team_idx + team_member.team_size();
|
||||
|
||||
if ( total_size < n ) n = total_size ;
|
||||
|
||||
a.resize_parallel( n );
|
||||
|
||||
if ( a.extent(0) < n ) {
|
||||
Kokkos::abort("GrowTest TEST failed resize_parallel");
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure resize is done for all team members:
|
||||
team_member.team_barrier();
|
||||
|
||||
const unsigned int val = team_idx + team_member.team_rank();
|
||||
|
||||
if ( val < total_size ) {
|
||||
value += val ;
|
||||
|
||||
a( val ) = val ;
|
||||
}
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() ( const VERIFY , member_type team_member, double& value) const
|
||||
{
|
||||
const unsigned int val =
|
||||
team_member.team_rank() +
|
||||
team_member.league_rank() * team_member.team_size();
|
||||
|
||||
if ( val < total_size ) {
|
||||
|
||||
if ( val != a(val) ) {
|
||||
Kokkos::abort("GrowTest VERIFY failed resize_parallel");
|
||||
}
|
||||
|
||||
value += a(val);
|
||||
}
|
||||
}
|
||||
|
||||
static void run( unsigned arg_total_size )
|
||||
{
|
||||
typedef Kokkos::TeamPolicy<execution_space,TEST> TestPolicy ;
|
||||
typedef Kokkos::TeamPolicy<execution_space,VERIFY> VerifyPolicy ;
|
||||
// Test: Create DynamicView, initialize size (via resize), run through parallel_for to set values, check values (via parallel_reduce); resize values and repeat
|
||||
// Case 1: min_chunk_size is a power of 2
|
||||
{
|
||||
view_type da("da", 1024, arg_total_size );
|
||||
ASSERT_EQ( da.size(), 0 );
|
||||
// Init
|
||||
unsigned da_size = arg_total_size / 8;
|
||||
da.resize_serial(da_size);
|
||||
ASSERT_EQ( da.size(), da_size );
|
||||
|
||||
// printf("TestDynamicView::run(%d) construct memory pool\n",arg_total_size);
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
const size_t total_alloc_size = arg_total_size * sizeof(Scalar) * 1.2 ;
|
||||
const size_t superblock = std::min( total_alloc_size , size_t(1000000) );
|
||||
value_type result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, result_sum
|
||||
);
|
||||
|
||||
memory_pool_type pool( memory_space()
|
||||
, total_alloc_size
|
||||
, 500 /* min block size in bytes */
|
||||
, 30000 /* max block size in bytes */
|
||||
, superblock
|
||||
);
|
||||
ASSERT_EQ(result_sum, (value_type)( da_size * (da_size - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// printf("TestDynamicView::run(%d) construct dynamic view\n",arg_total_size);
|
||||
// add 3x more entries i.e. 4x larger than previous size
|
||||
// the first 1/4 should remain the same
|
||||
unsigned da_resize = arg_total_size / 2;
|
||||
da.resize_serial(da_resize);
|
||||
ASSERT_EQ( da.size(), da_resize );
|
||||
|
||||
view_type da("A",pool,arg_total_size);
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(da_size, da_resize), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
const_view_type ca(da);
|
||||
value_type new_result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(da_size, da_resize), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, new_result_sum
|
||||
);
|
||||
|
||||
// printf("TestDynamicView::run(%d) construct test functor\n",arg_total_size);
|
||||
ASSERT_EQ(new_result_sum+result_sum, (value_type)( da_resize * (da_resize - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
} // end scope
|
||||
|
||||
TestDynamicView functor(da,arg_total_size);
|
||||
// Test: Create DynamicView, initialize size (via resize), run through parallel_for to set values, check values (via parallel_reduce); resize values and repeat
|
||||
// Case 2: min_chunk_size is NOT a power of 2
|
||||
{
|
||||
view_type da("da", 1023, arg_total_size );
|
||||
ASSERT_EQ( da.size(), 0 );
|
||||
// Init
|
||||
unsigned da_size = arg_total_size / 8;
|
||||
da.resize_serial(da_size);
|
||||
ASSERT_EQ( da.size(), da_size );
|
||||
|
||||
const unsigned team_size = TestPolicy::team_size_recommended(functor);
|
||||
const unsigned league_size = ( arg_total_size + team_size - 1 ) / team_size ;
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
double reference = 0;
|
||||
double result = 0;
|
||||
value_type result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, result_sum
|
||||
);
|
||||
|
||||
// printf("TestDynamicView::run(%d) run functor test\n",arg_total_size);
|
||||
ASSERT_EQ(result_sum, (value_type)( da_size * (da_size - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Kokkos::parallel_reduce( TestPolicy(league_size,team_size) , functor , reference);
|
||||
execution_space::fence();
|
||||
// add 3x more entries i.e. 4x larger than previous size
|
||||
// the first 1/4 should remain the same
|
||||
unsigned da_resize = arg_total_size / 2;
|
||||
da.resize_serial(da_resize);
|
||||
ASSERT_EQ( da.size(), da_resize );
|
||||
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(da_size, da_resize), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
// printf("TestDynamicView::run(%d) run functor verify\n",arg_total_size);
|
||||
value_type new_result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(da_size, da_resize), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, new_result_sum
|
||||
);
|
||||
|
||||
Kokkos::parallel_reduce( VerifyPolicy(league_size,team_size) , functor , result );
|
||||
execution_space::fence();
|
||||
ASSERT_EQ(new_result_sum+result_sum, (value_type)( da_resize * (da_resize - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
} // end scope
|
||||
|
||||
// printf("TestDynamicView::run(%d) done\n",arg_total_size);
|
||||
// Test: Create DynamicView, initialize size (via resize), run through parallel_for to set values, check values (via parallel_reduce); resize values and repeat
|
||||
// Case 3: resize reduces the size
|
||||
{
|
||||
view_type da("da", 1023, arg_total_size );
|
||||
ASSERT_EQ( da.size(), 0 );
|
||||
// Init
|
||||
unsigned da_size = arg_total_size / 2;
|
||||
da.resize_serial(da_size);
|
||||
ASSERT_EQ( da.size(), da_size );
|
||||
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
value_type result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(0, da_size), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, result_sum
|
||||
);
|
||||
|
||||
ASSERT_EQ(result_sum, (value_type)( da_size * (da_size - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// remove the final 3/4 entries i.e. first 1/4 remain
|
||||
unsigned da_resize = arg_total_size / 8;
|
||||
da.resize_serial(da_resize);
|
||||
ASSERT_EQ( da.size(), da_resize );
|
||||
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
#if !defined(KOKKOS_ENABLE_CUDA) || ( 8000 <= CUDA_VERSION )
|
||||
Kokkos::parallel_for( Kokkos::RangePolicy<execution_space>(0, da_resize), KOKKOS_LAMBDA ( const int i )
|
||||
{
|
||||
da(i) = Scalar(i);
|
||||
}
|
||||
);
|
||||
|
||||
value_type new_result_sum = 0.0;
|
||||
Kokkos::parallel_reduce( Kokkos::RangePolicy<execution_space>(0, da_resize), KOKKOS_LAMBDA ( const int i, value_type& partial_sum )
|
||||
{
|
||||
partial_sum += (value_type)da(i);
|
||||
}
|
||||
, new_result_sum
|
||||
);
|
||||
|
||||
ASSERT_EQ(new_result_sum, (value_type)( da_resize * (da_resize - 1) / 2 ) );
|
||||
#endif
|
||||
#endif
|
||||
} // end scope
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -79,13 +79,10 @@ protected:
|
||||
static void SetUpTestCase()
|
||||
{
|
||||
std::cout << std::setprecision(5) << std::scientific;
|
||||
|
||||
Kokkos::OpenMP::initialize();
|
||||
}
|
||||
|
||||
static void TearDownTestCase()
|
||||
{
|
||||
Kokkos::OpenMP::finalize();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -81,7 +81,7 @@ void test_scatter_view_config(int n)
|
||||
}
|
||||
#if defined( KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA )
|
||||
auto host_view = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), original_view);
|
||||
for (typename decltype(host_view)::size_type i = 0; i < host_view.dimension_0(); ++i) {
|
||||
for (typename decltype(host_view)::size_type i = 0; i < host_view.extent(0); ++i) {
|
||||
auto val0 = host_view(i, 0);
|
||||
auto val1 = host_view(i, 1);
|
||||
auto val2 = host_view(i, 2);
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -76,11 +76,9 @@ class serial : public ::testing::Test {
|
||||
protected:
|
||||
static void SetUpTestCase () {
|
||||
std::cout << std::setprecision(5) << std::scientific;
|
||||
Kokkos::Serial::initialize ();
|
||||
}
|
||||
|
||||
static void TearDownTestCase () {
|
||||
Kokkos::Serial::finalize ();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -73,7 +73,7 @@ void run_test_graph()
|
||||
dx = Kokkos::create_staticcrsgraph<dView>( "dx" , graph );
|
||||
hx = Kokkos::create_mirror( dx );
|
||||
|
||||
ASSERT_EQ( hx.row_map.dimension_0() - 1 , LENGTH );
|
||||
ASSERT_EQ( hx.row_map.extent(0) - 1 , LENGTH );
|
||||
|
||||
for ( size_t i = 0 ; i < LENGTH ; ++i ) {
|
||||
const size_t begin = hx.row_map[i];
|
||||
@ -115,17 +115,17 @@ void run_test_graph2()
|
||||
hView hx = Kokkos::create_mirror( dx );
|
||||
hView mx = Kokkos::create_mirror( dx );
|
||||
|
||||
ASSERT_EQ( (size_t) dx.row_map.dimension_0() , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( (size_t) hx.row_map.dimension_0() , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( (size_t) mx.row_map.dimension_0() , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( (size_t) dx.row_map.extent(0) , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( (size_t) hx.row_map.extent(0) , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( (size_t) mx.row_map.extent(0) , (size_t) LENGTH + 1 );
|
||||
|
||||
ASSERT_EQ( (size_t) dx.entries.dimension_0() , (size_t) total_length );
|
||||
ASSERT_EQ( (size_t) hx.entries.dimension_0() , (size_t) total_length );
|
||||
ASSERT_EQ( (size_t) mx.entries.dimension_0() , (size_t) total_length );
|
||||
ASSERT_EQ( (size_t) dx.entries.extent(0) , (size_t) total_length );
|
||||
ASSERT_EQ( (size_t) hx.entries.extent(0) , (size_t) total_length );
|
||||
ASSERT_EQ( (size_t) mx.entries.extent(0) , (size_t) total_length );
|
||||
|
||||
ASSERT_EQ( (size_t) dx.entries.dimension_1() , (size_t) 3 );
|
||||
ASSERT_EQ( (size_t) hx.entries.dimension_1() , (size_t) 3 );
|
||||
ASSERT_EQ( (size_t) mx.entries.dimension_1() , (size_t) 3 );
|
||||
ASSERT_EQ( (size_t) dx.entries.extent(1) , (size_t) 3 );
|
||||
ASSERT_EQ( (size_t) hx.entries.extent(1) , (size_t) 3 );
|
||||
ASSERT_EQ( (size_t) mx.entries.extent(1) , (size_t) 3 );
|
||||
|
||||
for ( size_t i = 0 ; i < LENGTH ; ++i ) {
|
||||
const size_t entry_begin = hx.row_map[i];
|
||||
@ -140,7 +140,7 @@ void run_test_graph2()
|
||||
Kokkos::deep_copy( dx.entries , hx.entries );
|
||||
Kokkos::deep_copy( mx.entries , dx.entries );
|
||||
|
||||
ASSERT_EQ( mx.row_map.dimension_0() , (size_t) LENGTH + 1 );
|
||||
ASSERT_EQ( mx.row_map.extent(0) , (size_t) LENGTH + 1 );
|
||||
|
||||
for ( size_t i = 0 ; i < LENGTH ; ++i ) {
|
||||
const size_t entry_begin = mx.row_map[i];
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -79,25 +79,10 @@ protected:
|
||||
static void SetUpTestCase()
|
||||
{
|
||||
std::cout << std::setprecision(5) << std::scientific;
|
||||
|
||||
unsigned num_threads = 4;
|
||||
|
||||
if (Kokkos::hwloc::available()) {
|
||||
num_threads = Kokkos::hwloc::get_available_numa_count()
|
||||
* Kokkos::hwloc::get_available_cores_per_numa()
|
||||
// * Kokkos::hwloc::get_available_threads_per_core()
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
std::cout << "Threads: " << num_threads << std::endl;
|
||||
|
||||
Kokkos::Threads::initialize( num_threads );
|
||||
}
|
||||
|
||||
static void TearDownTestCase()
|
||||
{
|
||||
Kokkos::Threads::finalize();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
|
||||
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
|
||||
//
|
||||
// ************************************************************************
|
||||
//@HEADER
|
||||
@ -43,10 +43,13 @@
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <cstdlib>
|
||||
#include <Kokkos_Macros.hpp>
|
||||
#include <Kokkos_Core.hpp>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
Kokkos::initialize(argc,argv);
|
||||
::testing::InitGoogleTest(&argc,argv);
|
||||
return RUN_ALL_TESTS();
|
||||
int result = RUN_ALL_TESTS();
|
||||
Kokkos::finalize();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user