133 template<
typename T >
144 "Can only broadcast arithmetic types." );
158 template<
typename T >
168 "Can only broadcast arithmetic types." );
201 template <
typename T >
203 allreduce(
const T * aSend, T * aRecv,
const int aCount )
207 static_assert( std::is_arithmetic< T >::value,
208 "allreduce: MAX-reduction is defined for arithmetic types only" );
210 BELFEM_ASSERT( aCount >= 0,
"allreduce: negative count %d", aCount );
222 if ( aSend != aRecv )
224 for (
int i = 0; i < aCount; ++i )
226 aRecv[ i ] = aSend[ i ];
243 template <
typename T >
247 static_assert( std::is_arithmetic< T >::value,
248 "allreduce_min: MIN-reduction is defined for arithmetic types only" );
250 BELFEM_ASSERT( aCount >= 0,
"allreduce_min: negative count %d", aCount );
261 if ( aSend != aRecv )
263 for (
int i = 0; i < aCount; ++i )
265 aRecv[ i ] = aSend[ i ];
282 template<
typename T >
289 if( aTarget <
comm_size() && tMyRank != aTarget )
292 MPI_Request tRequest;
302 comm_check( MPI_Wait( &tRequest, &tStatus ) );
313 template<
typename T >
322 if( aSource < tCommSize && tMyRank != aSource )
325 MPI_Request tRequest;
335 comm_check( MPI_Wait( &tRequest, &tStatus ) );
346 template<
typename T >
355 if ( aTarget < tCommSize && aTarget != tMyRank )
357 MPI_Status tSizeStatus;
358 MPI_Request tSizeRequest;
360 int tCommTag =
comm_tag( tMyRank, aTarget );
370 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
372 if ( aLength == 0 ) return ;
376 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
377 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
385 for (
index_t c : tChunkSizes )
394 & tRequest[ tCount++] ) );
399 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
411 template<
typename T >
421 if ( aSource < tCommSize && aSource != tMyRank )
423 MPI_Status tSizeStatus;
424 MPI_Request tSizeRequest;
426 int tCommTag =
comm_tag( aSource, tMyRank );
438 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
440 BELFEM_ERROR( tSize <= aLength,
"Datastream too large ( length %u but expect <=%u ).",
441 (
unsigned int ) tSize, (
unsigned int ) aLength );
445 if ( aLength == 0 ) return ;
449 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
450 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
458 for (
index_t c : tChunkSizes )
467 & tRequest[ tCount++] ) );
472 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
485 template<
typename T >
492 if ( tMyRank == aTarget ) return ;
496 MPI_Status tSizeStatus;
497 MPI_Request tSizeRequest;
499 int tCommTag =
comm_tag( tMyRank, aTarget );
509 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
511 if ( tSize == 0 ) return ;
519 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
520 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
524 const T * tData = aData.
data();
526 for (
index_t c : tChunkSizes )
534 &tRequest[ tCount++ ] ) );
539 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
550 template<
typename T >
558 if ( tMyRank == aSource ) return ;
565 if ( tSize == 0 ) return ;
573 int tCommTag =
comm_tag( aSource, tMyRank ) + 1 ;
575 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
576 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
580 T * tData = aData.
data();
582 for (
index_t c : tChunkSizes )
591 &tRequest[ tCount++ ] ) );
596 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
606 template<
typename T >
614 index_t tSize = tMyRank == aRoot ? aData.
size() : 0 ;
616 MPI_Request tSizeRequest ;
625 MPI_Status tSizeStatus ;
626 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
628 if ( tMyRank != aRoot ) aData.
set_size( tSize );
630 if ( tSize == 0 ) return ;
632 MPI_Request tDataRequest ;
641 MPI_Status tDataStatus ;
642 comm_check( MPI_Wait( &tDataRequest, &tDataStatus ) );
655 template<
typename T >
665 "Length of cell does not match ( is %u, expect commsize %u ).",
666 (
unsigned int ) aData.
size(), (
unsigned int ) tCommSize );
668 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
669 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
671 for(
proc_t p=0; p<tCommSize; ++p )
675 tRequest[ p ] = MPI_REQUEST_NULL;
689 comm_check( MPI_Waitall( tCommSize, tRequest, tStatus ) );
700 template<
typename T >
711 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
712 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
714 for(
proc_t p=0; p<tCommSize; ++p )
718 tRequest[ p ] = MPI_REQUEST_NULL;
719 aData( p ) = aMyValue ;
732 comm_check( MPI_Waitall( tCommSize, tRequest, tStatus ) );
744 template<
typename T >
751 if ( tMyRank == aTarget ) return ;
755 MPI_Status tSizeStatus;
756 MPI_Request tSizeRequest;
758 int tCommTag =
comm_tag( tMyRank, aTarget );
768 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
770 if ( tSize == 0 ) return ;
778 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
779 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
783 const T * tData = aData.
data();
785 for (
index_t c : tChunkSizes )
793 &tRequest[ tCount++ ] ) );
798 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
809 template<
typename T >
817 if ( tMyRank == aSource ) return ;
824 if ( tSize == 0 ) return ;
832 int tCommTag =
comm_tag( aSource, tMyRank ) + 1 ;
834 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
835 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
839 T * tData = aData.
data();
841 for (
index_t c : tChunkSizes )
850 &tRequest[ tCount++ ] ) );
855 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
865 template<
typename T >
875 MPI_Request tSizeRequest ;
884 MPI_Status tSizeStatus ;
885 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
887 if ( tMyRank != aRoot ) aData.
set_size( tSize );
889 if ( tSize == 0 ) return ;
891 MPI_Request tDataRequest ;
900 MPI_Status tDataStatus ;
901 comm_check( MPI_Wait( &tDataRequest, &tDataStatus ) );
909 template<
typename T >
919 "Length of vector does not match ( is %u, expect commsize %u ).",
920 (
unsigned int ) aData.
length(), (
unsigned int ) tCommSize );
922 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
923 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
925 for(
proc_t p=0; p<tCommSize; ++p )
929 tRequest[ p ] = MPI_REQUEST_NULL;
943 comm_check( MPI_Waitall( tCommSize, tRequest, tStatus ) );
954 template<
typename T >
965 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
966 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
968 for(
proc_t p=0; p<tCommSize; ++p )
972 tRequest[ p ] = MPI_REQUEST_NULL;
973 aData( p ) = aMyValue ;
986 comm_check( MPI_Waitall( tCommSize, tRequest, tStatus ) );
996 template<
typename T >
1007 "Length of data container does not match ( is %u, expect commsize %u ).",
1008 (
unsigned int ) aData.size(), (
unsigned int ) tCommSize );
1011 for (
proc_t p=0; p<tCommSize; ++p )
1013 tSizes( p ) = aData( p ).
length();
1019 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1020 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1026 for(
proc_t p=0; p<tCommSize; ++p )
1028 if ( p == tMyRank || aData( p ).length() == 0 ) continue ;
1030 const T * tData = aData( p ).data();
1036 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1038 for (
index_t c : tChunkSizes )
1046 &tRequest[ tCount++ ] ) );
1052 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1061 template<
typename T >
1072 "Length of data container does not match ( is %u, expect commsize %u ).",
1073 (
unsigned int ) aData.size(), (
unsigned int ) tCommSize );
1076 for (
proc_t p=0; p<tCommSize; ++p )
1078 tSizes( p ) = aData( p ).size();
1084 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1085 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1091 for(
proc_t p=0; p<tCommSize; ++p )
1093 if ( p == tMyRank || aData( p ).size() == 0 ) continue ;
1095 const T * tData = aData( p ).data();
1101 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1103 for (
index_t c : tChunkSizes )
1111 &tRequest[ tCount++ ] ) );
1117 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1130 template<
typename T,
typename U >
1141 "Length of offset container does not match ( is %u, expect commsize %u ).",
1142 (
unsigned int ) aOffsets.
length(), (
unsigned int ) tCommSize + 1 );
1146 for (
proc_t p=0; p<tCommSize; ++p )
1148 tSizes( p ) = aOffsets( p+1 ) - aOffsets( p );
1154 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1155 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1161 for(
proc_t p=0; p<tCommSize; ++p )
1163 if ( p == tMyRank || tSizes( p ) == 0 ) continue ;
1167 index_t tOffset = aOffsets( p ) ;
1169 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1171 for (
index_t c : tChunkSizes )
1179 &tRequest[ tCount++ ] ) );
1185 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1195 template<
typename T,
typename U >
1208 tSizes( 0 ) = aOffsets( 0 );
1212 for (
proc_t p=1; p<tCommSize; ++p )
1217 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCount );
1218 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCount );
1224 for(
proc_t p=1; p<tCommSize; ++p )
1228 if ( tSize == 0 )
continue;
1232 index_t tOffset = aOffsets( p ) ;
1234 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1236 for (
index_t c : tChunkSizes )
1244 &tRequest[ tCount++ ] ) );
1250 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1260 template<
typename T >
1270 aData.set_size( tCommSize, {} );
1276 for (
proc_t p=0;
p<tCommSize; ++
p )
1280 if( aMyData.length() > 0 )
1282 aData( p ).vector_data() = std::move( aMyData.vector_data() ) ;
1287 aData( p ).set_size( tSizes( p ), 0 );
1292 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCount );
1293 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCount );
1299 for(
proc_t p=0;
p<tCommSize; ++
p )
1303 if ( p == tMyRank || tSize == 0 )
continue;
1305 T * tData = aData( p ).data() ;
1311 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1313 for (
index_t c : tChunkSizes )
1321 &tRequest[ tCount++ ] ) );
1327 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1342 template<
typename T >
1353 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * ( tCommSize-1 ) );
1354 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * ( tCommSize-1 ) );
1362 for (
proc_t p=0; p<tCommSize; ++p )
1364 if ( p == tMyRank )
continue;
1366 int tCommTag =
comm_tag( tMyRank, p );
1374 &tRequest[ tCount ++ ] ) );
1377 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1384 tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1385 tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1387 if ( aData.
length() > 0 )
1390 for(
proc_t p=0; p<tCommSize; ++p )
1392 if ( p == tMyRank ) continue ;
1394 const T * tData = aData.
data();
1400 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1402 for (
index_t c : tChunkSizes )
1410 &tRequest[ tCount++ ] ) );
1416 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1427 template<
typename T >
1438 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * ( tCommSize-1 ) );
1439 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * ( tCommSize-1 ) );
1447 for (
proc_t p=0; p<tCommSize; ++p )
1449 if ( p == tMyRank )
continue;
1451 int tCommTag =
comm_tag( tMyRank, p );
1459 &tRequest[ tCount ++ ] ) );
1462 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1469 tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1470 tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1472 if ( aData.
size() > 0 )
1475 for(
proc_t p=0; p<tCommSize; ++p )
1477 if ( p == tMyRank ) continue ;
1479 const T * tData = aData.
data();
1485 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1487 for (
index_t c : tChunkSizes )
1495 &tRequest[ tCount++ ] ) );
1501 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1514 template<
typename T >
1532 tSize[ 0 ] = aData.
n_rows();
1533 tSize[ 1 ] = aData.
n_cols();
1536 MPI_Request tSizeRequest ;
1545 MPI_Status tSizeStatus ;
1546 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
1548 if ( tMyRank != aRoot ) aData.
set_size( tSize[ 0 ], tSize[ 1 ] );
1550 if( tSize[ 0 ] == 0 || tSize[ 1 ] == 0 ) return ;
1553 "broadcast( Matrix ) : transfer length %lu exceeds local buffer capacity %lu",
1554 (
long unsigned int ) tSize[ 2 ],
1555 (
long unsigned int ) aData.
capacity() );
1559 "broadcast( Matrix ) : matrix too large for unchunked broadcast, use send/receive" );
1561 MPI_Request tDataRequest ;
1570 MPI_Status tDataStatus ;
1571 comm_check( MPI_Wait( &tDataRequest, &tDataStatus ) );
1577 template<
typename T >
1585 if ( tMyRank == aTarget ) return ;
1591 tSize[ 0 ] = aData.
n_rows();
1592 tSize[ 1 ] = aData.
n_cols();
1595 MPI_Status tSizeStatus;
1596 MPI_Request tSizeRequest;
1598 int tCommTag =
comm_tag( tMyRank, aTarget );
1608 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
1610 if( tSize[ 0 ] == 0 || tSize[ 1 ] == 0 ) return ;
1618 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
1619 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
1623 const T * tData = aData.
data();
1625 for (
index_t c : tChunkSizes )
1633 &tRequest[ tCount++ ] ) );
1638 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1650 template<
typename T >
1658 if ( tMyRank == aSource ) return ;
1660 MPI_Status tSizeStatus;
1661 MPI_Request tSizeRequest;
1663 int tCommTag =
comm_tag( tMyRank, aSource );
1681 comm_check( MPI_Wait( &tSizeRequest, &tSizeStatus ) );
1683 aData.
set_size( tSize[ 0 ], tSize[ 1 ] );
1685 if ( tSize[ 0 ] == 0 || tSize[ 1 ] == 0 ) return ;
1688 "receive( Matrix ) : transfer length %lu exceeds local buffer capacity %lu",
1689 (
long unsigned int ) tSize[ 2 ],
1690 (
long unsigned int ) aData.
capacity() );
1698 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tChunkSizes.
size() );
1699 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tChunkSizes.
size() );
1703 T * tData = aData.
data();
1705 for (
index_t c : tChunkSizes )
1713 &tRequest[ tCount++ ] ) );
1718 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1728 template<
typename T >
1739 "Length of data container does not match ( is %u, expect commsize %u ).",
1740 (
unsigned int ) aData.size(), (
unsigned int ) tCommSize );
1744 for (
proc_t p=0; p<tCommSize; ++p )
1746 tSizes[ tCount++ ] = aData( p ).n_rows();
1747 tSizes[ tCount++ ] = aData( p ).n_cols();
1751 tSizes[ tCount++ ] = aData( p ).spacing() * aData( p ).n_cols();
1754 MPI_Request* tSizeRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
1755 MPI_Status* tSizeStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
1758 for (
proc_t p=0; p<tCommSize; ++p )
1762 tSizeRequest[ p ] = MPI_REQUEST_NULL;
1773 &tSizeRequest[ p ] ) );
1778 comm_check( MPI_Waitall( tCommSize, tSizeRequest, tSizeStatus ) );
1779 free( tSizeRequest );
1780 free( tSizeStatus );
1784 for (
proc_t p=0; p<tCommSize; ++p )
1786 if ( p == tMyRank || aData( p ).n_rows() == 0 || aData( p ).n_cols() == 0 )
1791 tCount +=
comm_split( tSizes[ tOffset ] ).size();
1797 MPI_Status* tStatus = ( MPI_Status * ) malloc(
sizeof( MPI_Status ) * tCount );
1798 MPI_Request* tRequest = ( MPI_Request * ) malloc(
sizeof( MPI_Request ) * tCount );
1804 for(
proc_t p=0; p<tCommSize; ++p )
1806 if ( p == tMyRank || aData( p ).n_rows() == 0 || aData( p ).n_cols() == 0 )
1811 const T * tData = aData( p ).data();
1818 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1820 for (
index_t c : tChunkSizes )
1823 &tData[ tDataOffset ],
1829 &tRequest[ tCount++ ] ) );
1835 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1847 template<
typename T >
1857 aData.set_size( tCommSize, {} );
1861 MPI_Request* tSizeRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCommSize );
1862 MPI_Status* tSizeStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCommSize );
1866 for (
proc_t p=0; p<tCommSize; ++p )
1870 tSizeRequest[ p ] = MPI_REQUEST_NULL;
1871 tSizes[ tOffset++ ] = 0 ;
1872 tSizes[ tOffset++ ] = 0 ;
1873 tSizes[ tOffset++ ] = 0 ;
1883 &tSizeRequest[ p ] ) );
1888 comm_check( MPI_Waitall( tCommSize, tSizeRequest, tSizeStatus ) );
1890 free( tSizeStatus );
1891 free( tSizeRequest );
1896 for (
proc_t p=0; p<tCommSize; ++p )
1904 aData( p ).set_size( tSizes[ tOffset ], tSizes[ tOffset+1 ] );
1906 if ( tSizes[ tOffset ] == 0 || tSizes[ tOffset+1 ] == 0 )
1912 tCount +=
comm_split( tSizes[ tOffset + 2 ] ).size();
1916 MPI_Status* tStatus = ( MPI_Status* ) malloc(
sizeof( MPI_Status ) * tCount );
1917 MPI_Request* tRequest = ( MPI_Request* ) malloc(
sizeof( MPI_Request ) * tCount );
1925 for(
proc_t p=0; p<tCommSize; ++p )
1932 if ( aData( p ).n_rows() == 0 || aData( p ).n_cols() == 0 )
1938 BELFEM_ERROR( aData( p ).capacity() >= tSizes[ tOffset + 2 ],
1939 "collect( Matrix ) : transfer length %lu from proc %u exceeds local buffer capacity %lu",
1940 (
long unsigned int ) tSizes[ tOffset + 2 ],
1942 (
long unsigned int ) aData( p ).capacity() );
1946 T * tData = aData( p ).data() ;
1950 int tCommTag =
comm_tag( tMyRank, p ) + 1 ;
1952 for (
index_t c : tChunkSizes )
1954 comm_check( MPI_Irecv( &tData[ tDataOffset ],
1960 &tRequest[ tCount++ ] ) );
1968 comm_check( MPI_Waitall( tCount, tRequest, tStatus ) );
1987 send(
const string & aMessage,
const proc_t aTarget=0 );
#define BELFEM_ERROR(aCheck,...)
Definition assert.hpp:264
#define BELFEM_ASSERT(aCheck,...)
Definition assert.hpp:244
belfem::Communicator gComm
Definition belfem.cpp:35
A bounds-checked wrapper around std::vector.
Definition cl_Cell.hpp:45
void set_size(const size_t aSize)
New elements are value-initialized ( zero for arithmetic T, nullptr for pointers ).
Definition cl_Cell.hpp:199
size_t size() const
Definition cl_Cell.hpp:189
T * data()
Returns a borrowed pointer into contiguous storage, possibly nullptr when the Cell is empty ( test si...
Definition cl_Cell.hpp:129
Global MPI communicator manager.
Definition cl_Communicator.hpp:60
COMM_TYPE & world()
Definition cl_Communicator.cpp:251
proc_t rank() const
Definition cl_Communicator.hpp:192
proc_t size() const
Definition cl_Communicator.hpp:200
Dense column-major matrix.
Definition cl_BZ_Matrix.hpp:28
size_t spacing() const
inter-column stride of the data container ( the leading dimension in BLAS terms; here always n_rows )
Definition cl_AR_Matrix.hpp:214
size_t capacity() const
The logical element count n_rows() * n_cols() ( Armadillo's n_elem ).
Definition cl_AR_Matrix.hpp:202
void set_size(const size_t aNumRows, const size_t aNumCols)
Definition cl_AR_Matrix.hpp:164
size_t n_rows() const
Definition cl_AR_Matrix.hpp:183
size_t n_cols() const
Definition cl_AR_Matrix.hpp:191
T * data()
Returns a borrowed raw buffer under the layout contract stated in cl_Matrix.hpp; may be nullptr when ...
Definition cl_AR_Matrix.hpp:116
Column vector.
Definition cl_BZ_Vector.hpp:41
T * data()
Returns a borrowed raw buffer under the layout contract stated in cl_Vector.hpp; may be nullptr when ...
Definition cl_AR_Vector.hpp:163
void set_size(const size_t aNumRows)
change the size of the vector
Definition cl_AR_Vector.hpp:215
size_t length() const
get the length of the vector
Definition cl_AR_Vector.hpp:235
const real c
speed of light in m/s ( exact ) http://physics.nist.gov/cgi-bin/cuu/Value?c
Definition constants.hpp:65
USER GUIDES:
Definition cl_Capacitor.cpp:16
proc_t comm_rank()
Definition commtools.cpp:30
comm_t comm_type()
returns the MPI datatype handle for T
Definition commtypes.hpp:37
void share(Vector< T > &aData)
Sends only; it is not collective.
Definition commtools.hpp:1344
void collect(Cell< T > &aData, const T aMyValue=0)
Receives only, one slot per rank.
Definition commtools.hpp:702
@ T
Definition cl_Material.hpp:125
void receive(string &aMessage, const proc_t aSource)
Same contract as receive( T& ).
Definition commtools.cpp:348
void comm_barrier()
Collective: every rank must reach it before any rank passes it.
Definition commtools.cpp:57
int comm_t
Definition commtypes.hpp:27
void comm_drain_check(const char *aLabel)
Debug-build tripwire for the two-tags-per-pair ordering contract of the point-to-point fabric ( see c...
Definition commtools.cpp:117
void broadcast(Cell< string > &aData, const proc_t aRoot)
Collective: every rank calls it, and aRoot's data lands on all ranks.
Definition commtools.cpp:276
int proc_t
Definition commtypes.hpp:29
index_t comm_splitcount(const Vector< index_t > &aLengths, const proc_t aRoot)
Local, it does not communicate despite aRoot: the number of chunk messages comm_split() would produce...
Definition commtools.cpp:228
void distribute(Cell< T > &aData)
Sends only, not collective: aData has one entry per rank ( asserted ) and entry p goes to rank p; its...
Definition commtools.hpp:657
void allreduce(const T *aSend, T *aRecv, const int aCount)
Collective MAX-reduction visible on every rank.
Definition commtools.hpp:203
int comm_tag(const proc_t aSource, const proc_t aTarget)
The base tag of an unordered rank pair.
Definition commtools.cpp:102
constexpr int gMaxCommChunkLength
Definition commtools.hpp:31
Cell< int > comm_split(const index_t aLength)
Local, it does not communicate: splits aLength into chunks of at most gMaxCommChunkLength.
Definition commtools.cpp:207
uint32_t index_t
Definition typedefs.hpp:52
void allreduce_min(const T *aSend, T *aRecv, const int aCount)
Collective MIN-reduction visible on every rank.
Definition commtools.hpp:245
void comm_check(const int aErrorCode)
Any code other than MPI_SUCCESS aborts through BELFEM_ERROR ( release too ), which ends the whole run...
Definition commtools.cpp:38
void send(const string &aMessage, const proc_t aTarget)
Same contract as send( T ).
Definition commtools.cpp:340
proc_t comm_size()
Definition commtools.cpp:22
p
Definition test_curve_frame.py:73
Definition commtools.hpp:38