Skip to content
Snippets Groups Projects
Commit 6ca4d125 authored by Tomáš Oberhuber's avatar Tomáš Oberhuber Committed by Jakub Klinkovský
Browse files

Writting documentation on CSR format.

parent 1cd28889
No related branches found
No related tags found
1 merge request!105TO/matrices-adaptive-csr
......@@ -5,6 +5,7 @@ set( COMMON_EXAMPLES
SegmentsExample_CSR_getSerializationType
SegmentsExample_CSR_getSegmentsType
SegmentsExample_CSR_setSegmentsSizes
SegmentsExample_CSR_getSegmentView
)
if( BUILD_CUDA )
......
#include <iostream>
#include <functional>
#include <TNL/Containers/Vector.h>
#include <TNL/Algorithms/Segments/CSR.h>
#include <TNL/Algorithms/SequentialFor.h>
#include <TNL/Devices/Host.h>
#include <TNL/Devices/Cuda.h>
template< typename Device >
void SegmentsExample()
{
using SegmentsType = typename TNL::Algorithms::Segments::CSR< Device, int >;
using SegmentView = typename SegmentsType::SegmentViewType;
/***
* Create segments with given segments sizes.
*/
const int size( 5 );
SegmentsType segments{ 1, 2, 3, 4, 5 };
auto view = segments.getView();
/***
* Print the elemets mapping using segment view.
*/
std::cout << "Mapping of local indexes to global indexes:" << std::endl;
auto f = [=] __cuda_callable__ ( int segmentIdx ) {
printf( "Segment idx. %d: ", segmentIdx ); // printf works even in GPU kernels
auto segment = view.getSegmentView( segmentIdx );
for( auto element : segment )
printf( "%d -> %d \t", element.localIndex(), element.globalIndex() );
printf( "\n" );
};
TNL::Algorithms::SequentialFor< Device >::exec( 0, size, f );
}
int main( int argc, char* argv[] )
{
std::cout << "Example of CSR segments on host: " << std::endl;
SegmentsExample< TNL::Devices::Host >();
#ifdef HAVE_CUDA
std::cout << "Example of CSR segments on CUDA GPU: " << std::endl;
SegmentsExample< TNL::Devices::Cuda >();
#endif
return EXIT_SUCCESS;
}
SegmentsExample_CSR_getSegmentView.cpp
\ No newline at end of file
SegmentsExample_CSR_getSegmentsType.cpp
\ No newline at end of file
#include <iostream>
#include <functional>
#include <TNL/Containers/Vector.h>
#include <TNL/Algorithms/Segments/CSR.h>
#include <TNL/Devices/Host.h>
#include <TNL/Devices/Cuda.h>
template< typename Device >
void SegmentsExample()
{
using SegmentsType = typename TNL::Algorithms::Segments::CSR< Device, int >;
using SegmentViewType = typename SegmentsType::SegmentView;
/***
* Create segments with given segments sizes.
*/
SegmentsType segments{ 1, 2, 3, 4, 5 };
std::cout << "Segments sizes are: " << segments << std::endl;
/***
* Print the elemets mapping using segment view.
*/
std::cout << "Elements mapping:" << std::endl;
segments.sequentialForAllSegments( [] __cuda_callable__ ( const SegmentView segment ) {
printf( "Segment idx. %d: \n", segments.getSegmentIndex() ); // printf works even in GPU kernels
for( auto element : segment )
printf( "%d -> %d ", element.localIndex(), element.globalIndex() );
} );
}
int main( int argc, char* argv[] )
{
std::cout << "Example of CSR segments on host: " << std::endl;
SegmentsExample< TNL::Devices::Host >();
#ifdef HAVE_CUDA
std::cout << "Example of CSR segments on CUDA GPU: " << std::endl;
SegmentsExample< TNL::Devices::Cuda >();
#endif
return EXIT_SUCCESS;
}
......@@ -270,12 +270,27 @@ class CSR
*
* \param segmentIdx is index of the request segment.
* \return segment view of given segment.
*
* \par Example
* \include Algorithms/Segments/SegmentsExample_CSR_getSegmentView.cpp
* \par Output
* \include SegmentsExample_CSR_getSegmentView.out
*/
__cuda_callable__
SegmentViewType getSegmentView( const IndexType segmentIdx ) const;
/**
* \brief Returns reference on constant vector with row offsets used in the CSR format.
*
* \return reference on constant vector with row offsets used in the CSR format.
*/
const OffsetsContainer& getOffsets() const;
/**
* \brief Returns reference on vector with row offsets used in the CSR format.
*
* \return reference on vector with row offsets used in the CSR format.
*/
OffsetsContainer& getOffsets();
/***
......@@ -296,6 +311,13 @@ class CSR
template< typename Function >
void forAllSegments( Function&& f ) const;
template< typename Function >
void sequentialForSegments( IndexType begin, IndexType end, Function&& f ) const;
template< typename Function >
void sequentialForAllSegments( Function&& f ) const;
/***
* \brief Go over all segments and perform a reduction in each of them.
*/
......
......@@ -283,6 +283,30 @@ forAllSegments( Function&& f ) const
this->getConstView().forAllSegments( f );
}
template< typename Device,
typename Index,
typename Kernel,
typename IndexAllocator >
template< typename Function >
void
CSR< Device, Index, Kernel, IndexAllocator >::
sequentialForSegments( IndexType begin, IndexType end, Function&& f ) const
{
this->getConstView().sequentialForSegments( begin, end, f );
}
template< typename Device,
typename Index,
typename Kernel,
typename IndexAllocator >
template< typename Function >
void
CSR< Device, Index, Kernel, IndexAllocator >::
sequentialForAllSegments( Function&& f ) const
{
this->getConstView().sequentialForAllSegments( f );
}
template< typename Device,
typename Index,
typename Kernel,
......
......@@ -118,6 +118,12 @@ class CSRView
template< typename Function >
void forAllSegments( Function&& f ) const;
template< typename Function >
void sequentialForSegments( IndexType begin, IndexType end, Function&& f ) const;
template< typename Function >
void sequentialForAllSegments( Function&& f ) const;
/***
* \brief Go over all segments and perform a reduction in each of them.
*/
......
......@@ -238,6 +238,29 @@ forAllSegments( Function&& f ) const
this->forSegments( 0, this->getSegmentsCount(), f );
}
template< typename Device,
typename Index,
typename Kernel >
template< typename Function >
void
CSRView< Device, Index, Kernel >::
sequentialForSegments( IndexType begin, IndexType end, Function&& function ) const
{
for( IndexType i = begin; i < end; i++ )
forSegments( i, i + 1, function );
}
template< typename Device,
typename Index,
typename Kernel >
template< typename Function >
void
CSRView< Device, Index, Kernel >::
sequentialForAllSegments( Function&& f ) const
{
this->sequentialForSegments( 0, this->getSegmentsCount(), f );
}
template< typename Device,
typename Index,
typename Kernel >
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment