Newer
Older
/***************************************************************************
SegmentsTest.hpp - description
-------------------
begin : Dec 6, 2019
copyright : (C) 2019 by Tomas Oberhuber et al.
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
#include <TNL/Containers/Vector.h>
#include <TNL/Containers/VectorView.h>
#include <TNL/Math.h>
#include <iostream>
#ifdef HAVE_GTEST
#include <gtest/gtest.h>
template< typename Segments >
void test_SetSegmentsSizes_EqualSizes()
{
using DeviceType = typename Segments::DeviceType;
using IndexType = typename Segments::IndexType;
const IndexType segmentsCount = 20;
const IndexType segmentSize = 5;
TNL::Containers::Vector< IndexType, DeviceType, IndexType > segmentsSizes( segmentsCount );
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Segments segments( segmentsSizes );
EXPECT_EQ( segments.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments.getSize(), segments.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments.getSegmentSize( i ), segmentSize );
Segments segments2( segments );
EXPECT_EQ( segments2.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments2.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments2.getSize(), segments2.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments2.getSegmentSize( i ), segmentSize );
Segments segments3;
segments3.setSegmentsSizes( segmentsSizes );
EXPECT_EQ( segments3.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments3.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments3.getSize(), segments3.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments3.getSegmentSize( i ), segmentSize );
}
template< typename Segments >
void test_SetSegmentsSizes_EqualSizes_EllpackOnly()
{
using DeviceType = typename Segments::DeviceType;
using IndexType = typename Segments::IndexType;
const IndexType segmentsCount = 20;
const IndexType segmentSize = 5;
Segments segments( segmentsCount, segmentSize );
EXPECT_EQ( segments.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments.getSize(), segments.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments.getSegmentSize( i ), segmentSize );
Segments segments2( segments );
EXPECT_EQ( segments2.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments2.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments2.getSize(), segments2.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments2.getSegmentSize( i ), segmentSize );
Segments segments3;
segments3.setSegmentsSizes( segmentsCount, segmentSize );
EXPECT_EQ( segments3.getSegmentsCount(), segmentsCount );
EXPECT_EQ( segments3.getSize(), segmentsCount * segmentSize );
EXPECT_LE( segments3.getSize(), segments3.getStorageSize() );
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( segments3.getSegmentSize( i ), segmentSize );
}
void test_AllReduction_MaximumInSegments()
{
using DeviceType = typename Segments::DeviceType;
using IndexType = typename Segments::IndexType;
const IndexType segmentsCount = 20;
const IndexType segmentSize = 5;
const IndexType size = segmentsCount * segmentSize;
TNL::Containers::Vector< IndexType, DeviceType, IndexType > segmentsSizes( segmentsCount );
segmentsSizes = segmentSize;
Segments segments( segmentsSizes );
TNL::Containers::Vector< IndexType, DeviceType, IndexType > v( segments.getStorageSize() );
IndexType k( 1 );
for( IndexType i = 0; i < segmentsCount; i++ )
for( IndexType j = 0; j < segmentSize; j++ )
v.setElement( segments.getGlobalIndex( i, j ), k++ );
TNL::Containers::Vector< IndexType, DeviceType, IndexType >result( segmentsCount );
const auto v_view = v.getConstView();
auto result_view = result.getView();
auto fetch = [=] __cuda_callable__ ( IndexType segmentIdx, IndexType globalIdx ) -> IndexType {
return v_view[ globalIdx ];
};
auto reduce = [] __cuda_callable__ ( IndexType& a, const IndexType b ) {
a = TNL::max( a, b );
};
auto keep = [=] __cuda_callable__ ( const IndexType i, const IndexType a ) mutable {
};
segments.allReduction( fetch, reduce, keep, std::numeric_limits< IndexType >::min() );
std::cerr << result << std::endl;
for( IndexType i = 0; i < segmentsCount; i++ )
EXPECT_EQ( result.getElement( i ), ( i + 1 ) * segmentSize );