Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_CommHelpers.hpp
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TEUCHOS_COMM_HELPERS_HPP
11#define TEUCHOS_COMM_HELPERS_HPP
12
13#include "Teuchos_Comm.hpp"
14#include "Teuchos_CommUtilities.hpp"
15#include "Teuchos_CompilerCodeTweakMacros.hpp"
16#include "Teuchos_SerializationTraitsHelpers.hpp"
17#include "Teuchos_ReductionOpHelpers.hpp"
18#include "Teuchos_SerializerHelpers.hpp"
21#include "Teuchos_Array.hpp"
23#include "Teuchos_Workspace.hpp"
24#include "Teuchos_as.hpp"
25
26#ifdef HAVE_TEUCHOS_MPI
28#endif // HAVE_TEUCHOS_MPI
29#include "Teuchos_DefaultSerialComm.hpp"
31
32namespace Teuchos {
33
34//
35// Teuchos::Comm Helper Functions
36//
37
38#ifdef HAVE_TEUCHOS_MPI
39namespace Details {
40
47std::string getMpiErrorString (const int errCode);
48
49} // namespace Details
50#endif // HAVE_TEUCHOS_MPI
51
56template<typename Ordinal>
58
63template<typename Ordinal>
65
70template<typename Ordinal>
72
77template<typename Ordinal, typename Packet>
79 const Comm<Ordinal>& comm,
80 const int rootRank,
81 const Ordinal count, Packet buffer[]
82 );
83
88template<typename Ordinal, typename Packet>
90 const Comm<Ordinal>& comm,
91 const int rootRank,
93 );
94
99template<typename Ordinal, typename Packet>
101 const Comm<Ordinal>& comm,
102 const int rootRank, Packet *object
103 );
104
109template<typename Ordinal, typename Packet>
111 const Comm<Ordinal>& comm,
112 const int rootRank, const Ptr<Packet> &object
113 );
114
119template<typename Ordinal, typename Packet>
122 const int rootRank, const Ordinal count, Packet*const buffer[]
123 );
124
129template<typename Ordinal, typename Packet>
132 const int rootRank, const ArrayView<const Ptr<Packet> > &buffer
133 );
134
140template<typename Ordinal, typename Packet, typename Serializer>
142 const Comm<Ordinal>& comm,
143 const Serializer& serializer,
144 const int rootRank,
145 const Ordinal count, Packet buffer[]
146 );
147
152template<typename Ordinal, typename Packet>
153void
155 const Ordinal sendCount,
156 Packet recvBuf[],
157 const Ordinal recvCount,
158 const int root,
159 const Comm<Ordinal>& comm);
160
165template<typename Ordinal, typename Packet>
166void
168 const Ordinal sendCount,
169 Packet recvBuf[],
170 const Ordinal recvCounts[],
171 const Ordinal displs[],
172 const int root,
173 const Comm<Ordinal>& comm);
174
180template<typename Ordinal, typename Packet>
182 const Comm<Ordinal>& comm,
183 const Ordinal sendCount, const Packet sendBuffer[],
184 const Ordinal recvCount, Packet recvBuffer[]
185 );
186
192template<typename Ordinal, typename Packet>
195 const Ordinal sendCount, const Packet*const sendBuffer[],
196 const Ordinal recvCount, Packet*const recvBuffer[]
197 );
198
204template<typename Ordinal, typename Packet, typename Serializer>
206 const Comm<Ordinal>& comm,
207 const Serializer& serializer,
208 const Ordinal sendCount, const Packet sendBuffer[],
209 const Ordinal recvCount, Packet recvBuffer[]
210 );
211
238template<typename Ordinal, typename Packet>
239void
241 const Ordinal sendCount,
242 Packet recvBuf[],
243 const Ordinal recvCount,
244 const Ordinal root,
245 const Comm<Ordinal>& comm)
246{
247 // See Bug 6375; Tpetra does not actually need any specializations
248 // other than Ordinal = int and Packet = int. We may add them later
249 // if there is interest.
251 (true, std::logic_error, "Teuchos::scatter<" <<
253 << ">: Generic version is not yet implemented. This function currently "
254 "only has an implementtion for Ordinal = int and Packet = int. "
255 "See Bug 6375 and Bug 6336.");
256}
257
258template<typename Ordinal, typename Packet>
259void
260scatterv (const Packet sendBuf[],
261 const Ordinal sendCounts[],
262 const Ordinal displs[],
263 Packet recvBuf[],
264 const Ordinal recvCount,
265 const Ordinal root,
266 const Comm<Ordinal>& comm)
267{
268 // See Bug 6375; Tpetra does not actually need any specializations
269 // other than Ordinal = int and Packet = int. We may add them later
270 // if there is interest.
272 (true, std::logic_error, "Teuchos::scatterv<" <<
274 << ">: Generic version is not yet implemented. This function currently "
275 "only has an implementtion for Ordinal = int and Packet = int. "
276 "See Bug 6375 and Bug 6336.");
277}
278
306template<typename Ordinal, typename Packet>
307void
309 Packet recvBuf[],
310 const Ordinal count,
312 const Ordinal root,
313 const Comm<Ordinal>& comm);
314
337template<typename Ordinal, typename Packet>
340 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
341 );
342
348template<typename Ordinal, typename Packet>
351 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
352 );
353
359template<typename Ordinal, typename Packet>
362 const Packet &send, const Ptr<Packet> &globalReduct
363 );
364
370template<typename Ordinal, typename Packet>
374 const Ordinal count, const Packet*const sendBuffer[], Packet*const globalReducts[]
375 );
376
382template<typename Ordinal, typename Packet, typename Serializer>
384 const Comm<Ordinal>& comm,
385 const Serializer& serializer,
387 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
388 );
389
395template<typename Ordinal, typename Packet, typename Serializer>
397 const Comm<Ordinal>& comm,
398 const Serializer& serializer,
400 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
401 );
402
408template<typename Ordinal, typename Packet>
409void scan(
411 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
412 );
413
419template<typename Ordinal, typename Packet>
420void scan(
422 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
423 );
424
430template<typename Ordinal, typename Packet>
431void scan(
433 const Packet &send, const Ptr<Packet> &scanReduct
434 );
435
441template<typename Ordinal, typename Packet>
442void scan(
445 const Ordinal count, const Packet*const sendBuffer[], Packet*const scanReducts[]
446 );
447
453template<typename Ordinal, typename Packet, typename Serializer>
454void scan(
455 const Comm<Ordinal>& comm,
456 const Serializer& serializer,
458 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
459 );
460
466template<typename Ordinal, typename Packet, typename Serializer>
467void scan(
468 const Comm<Ordinal>& comm,
469 const Serializer& serializer,
471 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
472 );
473
478template<typename Ordinal, typename Packet>
479void send(
480 const Comm<Ordinal>& comm,
481 const Ordinal count, const Packet sendBuffer[], const int destRank
482 );
483
485template<typename Ordinal, typename Packet>
486void
487send (const Packet sendBuffer[],
488 const Ordinal count,
489 const int destRank,
490 const int tag,
491 const Comm<Ordinal>& comm);
492
497template<typename Ordinal, typename Packet>
498void ssend(
499 const Comm<Ordinal>& comm,
500 const Ordinal count, const Packet sendBuffer[], const int destRank
501 );
502
504template<typename Ordinal, typename Packet>
505void
506ssend (const Packet sendBuffer[],
507 const Ordinal count,
508 const int destRank,
509 const int tag,
510 const Comm<Ordinal>& comm);
511
516template<typename Ordinal, typename Packet>
517void send(
518 const Comm<Ordinal>& comm,
519 const Packet &send, const int destRank
520 );
521
526template<typename Ordinal, typename Packet>
527void ssend(
528 const Comm<Ordinal>& comm,
529 const Packet &send, const int destRank
530 );
531
538template<typename Ordinal, typename Packet>
539void send(
541 const Ordinal count, const Packet*const sendBuffer[], const int destRank
542 );
543
549template<typename Ordinal, typename Packet, typename Serializer>
550void send(
551 const Comm<Ordinal>& comm,
552 const Serializer& serializer,
553 const Ordinal count, const Packet sendBuffer[], const int destRank
554 );
555
560template<typename Ordinal, typename Packet>
562 const Comm<Ordinal>& comm,
563 const int sourceRank, const Ordinal count, Packet recvBuffer[]
564 );
565
570template<typename Ordinal, typename Packet>
572 const Comm<Ordinal>& comm,
573 const int sourceRank, Packet *recv
574 );
575
580template<typename Ordinal, typename Packet>
583 const int sourceRank, const Ordinal count, Packet*const recvBuffer[]
584 );
585
591template<typename Ordinal, typename Packet, typename Serializer>
593 const Comm<Ordinal>& comm,
594 const Serializer& serializer,
595 const int sourceRank, const Ordinal count, Packet recvBuffer[]
596 );
597
603template<typename Ordinal, typename Packet>
605 const Comm<Ordinal>& comm,
607 const int destRank
608 );
609
611template<typename Ordinal, typename Packet>
612void
614 const Ordinal count,
615 const int destRank,
616 const int tag,
617 const Comm<Ordinal>& comm);
618
623template<typename Ordinal, typename Packet>
625 const Comm<Ordinal>& comm,
626 const Packet &send,
627 const int destRank
628 );
629
635template<typename Ordinal, typename Packet, typename Serializer>
637 const Comm<Ordinal>& comm,
638 const Serializer& serializer,
640 const int destRank
641 );
642
647template<typename Ordinal, typename Packet>
649 const Comm<Ordinal>& comm,
651 const int destRank
652 );
653
655template<typename Ordinal, typename Packet>
658 const int destRank,
659 const int tag,
660 const Comm<Ordinal>& comm);
661
666template<typename Ordinal, typename Packet>
668 const Comm<Ordinal>& comm,
669 const RCP<const Packet> &send,
670 const int destRank
671 );
672
678template<typename Ordinal, typename Packet, typename Serializer>
680 const Comm<Ordinal>& comm,
681 const Serializer& serializer,
683 const int destRank
684 );
685
686
687// 2008/07/29: rabartl: ToDo: Add reference semantics version of isend!
688
689
699template<typename Ordinal, typename Packet>
701 const Comm<Ordinal>& comm,
703 const int sourceRank
704 );
705
707template<typename Ordinal, typename Packet>
710 const int sourceRank,
711 const int tag,
712 const Comm<Ordinal>& comm);
713
725template<typename Ordinal, typename Packet>
727 const Comm<Ordinal>& comm,
728 const RCP<Packet> &recv,
729 const int sourceRank
730 );
731
737template<typename Ordinal, typename Packet, typename Serializer>
739 const Comm<Ordinal>& comm,
740 const Serializer& serializer,
742 const int sourceRank
743 );
744
745
746// 2008/07/29: rabartl: ToDo: Add reference semantics version of ireceive!
747
748
756template<typename Ordinal>
758 const Comm<Ordinal>& comm,
760 );
761
791template<typename Ordinal>
792void
796
820template<typename Ordinal>
823
824//
825// Standard reduction subclasses for objects that use value semantics
826//
827
828
833template<typename Ordinal, typename Packet>
834class SumValueReductionOp : public ValueTypeReductionOp<Ordinal,Packet>
835{
836public:
838 void reduce(
839 const Ordinal count,
840 const Packet inBuffer[],
842 ) const;
843};
844
845
854template<typename Ordinal, typename Packet>
855class MinValueReductionOp : public ValueTypeReductionOp<Ordinal,Packet>
856{
857public:
859 void reduce(
860 const Ordinal count,
861 const Packet inBuffer[],
863 ) const;
864};
865
866
875template<typename Ordinal, typename Packet>
876class MaxValueReductionOp : public ValueTypeReductionOp<Ordinal,Packet>
877{
878public:
880 void reduce(
881 const Ordinal count,
882 const Packet inBuffer[],
884 ) const;
885};
886
887
892template<typename Ordinal, typename Packet>
893class ANDValueReductionOp : public ValueTypeReductionOp<Ordinal,Packet>
894{
895public:
897 void reduce(
898 const Ordinal count,
899 const Packet inBuffer[],
901 ) const;
902};
903
904
905// ////////////////////////////////////////////////////////////
906// Implementation details (not for geneal users to mess with)
907
908
909//
910// ReductionOp Utilities
911//
912
913
914namespace MixMaxUtilities {
915
916
917template<bool isComparable, typename Ordinal, typename Packet>
918class Min {};
919
920
921template<typename Ordinal, typename Packet>
922class Min<true,Ordinal,Packet> {
923public:
924 static void min(
925 const Ordinal count,
926 const Packet inBuffer[],
927 Packet inoutBuffer[]
928 )
929 {
930 for( int i = 0; i < count; ++i )
931 inoutBuffer[i] = TEUCHOS_MIN(inoutBuffer[i],inBuffer[i]);
932 }
933};
934
935
936template<typename Ordinal, typename Packet>
937class Min<false,Ordinal,Packet> {
938public:
939 static void min(
940 const Ordinal,
941 const Packet[],
942 Packet[]
943 )
944 {
946 true,std::logic_error,
947 "Error, the type "<<TypeNameTraits<Packet>::name()
948 <<" does not support comparison operations!"
949 );
950 }
951};
952
953
954template<bool isComparable, typename Ordinal, typename Packet>
955class Max {};
956
957
958template<typename Ordinal, typename Packet>
959class Max<true,Ordinal,Packet> {
960public:
961 static void max(
962 const Ordinal count,
963 const Packet inBuffer[],
964 Packet inoutBuffer[]
965 )
966 {
967 for( int i = 0; i < count; ++i )
968 inoutBuffer[i] = TEUCHOS_MAX(inoutBuffer[i],inBuffer[i]);
969 }
970};
971
972
973template<typename Ordinal, typename Packet>
974class Max<false,Ordinal,Packet> {
975public:
976 static void max(
977 const Ordinal,
978 const Packet[],
979 Packet[]
980 )
981 {
983 true,std::logic_error,
984 "Error, the type "<<TypeNameTraits<Packet>::name()
985 <<" does not support comparison operations!"
986 );
987 }
988};
989
990
991template<bool isComparable, typename Ordinal, typename Packet>
992class AND {};
993
994
995template<typename Ordinal, typename Packet>
996class AND<true,Ordinal,Packet> {
997public:
998 static void andOp(
999 const Ordinal count,
1000 const Packet inBuffer[],
1001 Packet inoutBuffer[]
1002 )
1003 {
1004 for( int i = 0; i < count; ++i )
1005 inoutBuffer[i] = inoutBuffer[i] && inBuffer[i];
1006 }
1007};
1008
1009
1010template<typename Ordinal, typename Packet>
1011class AND<false,Ordinal,Packet> {
1012public:
1013 static void andOp(
1014 const Ordinal,
1015 const Packet[],
1016 Packet[]
1017 )
1018 {
1020 true,std::logic_error,
1021 "Error, the type "<<TypeNameTraits<Packet>::name()
1022 <<" does not support logical AND operations!"
1023 );
1024 }
1025};
1026
1027
1028} // namespace MixMaxUtilities
1029
1030
1031template<typename Ordinal, typename Packet>
1033 const Ordinal count,
1034 const Packet inBuffer[],
1036 ) const
1037{
1038 for( int i = 0; i < count; ++i )
1039 inoutBuffer[i] += inBuffer[i];
1040}
1041
1042
1043template<typename Ordinal, typename Packet>
1045 const Ordinal count,
1046 const Packet inBuffer[],
1048 ) const
1049{
1050 typedef MixMaxUtilities::Min<ScalarTraits<Packet>::isComparable, Ordinal, Packet> min_type;
1051 min_type::min (count, inBuffer, inoutBuffer);
1052}
1053
1054
1055template<typename Ordinal, typename Packet>
1057 const Ordinal count,
1058 const Packet inBuffer[],
1060 ) const
1061{
1062 typedef MixMaxUtilities::Max<ScalarTraits<Packet>::isComparable, Ordinal, Packet> max_type;
1063 max_type::max (count,inBuffer,inoutBuffer);
1064}
1065
1066
1067template<typename Ordinal, typename Packet>
1069 const Ordinal count,
1070 const Packet inBuffer[],
1072 ) const
1073{
1074 typedef MixMaxUtilities::AND<ScalarTraits<Packet>::isComparable, Ordinal, Packet> and_type;
1075 and_type::andOp (count, inBuffer, inoutBuffer);
1076}
1077
1078
1079} // namespace Teuchos
1080
1081
1082// //////////////////////////
1083// Template implemenations
1084
1085
1086//
1087// ReductionOp utilities
1088//
1089
1090
1091namespace Teuchos {
1092
1093
1094// Not for the general user to use! I am returning a raw ReductionOp* pointer
1095// to avoid the overhead of using RCP. However, given the use case
1096// this is just fine since I can just use std::auto_ptr to make sure things
1097// are deleted correctly.
1098//
1099// NOTE (mfh 08 Feb 2015) std::auto_ptr has been deprecated in C++11.
1100// I could either replace it with std::unique_ptr, or just call 'new'
1101// and 'delete' manually. The former is less error prone, but
1102// requires checking a macro for whether C++11 is actually enabled.
1103// Thus, I've chosen (for now) to rewrite all the code that uses
1104// std::auto_ptr, so that it allocates and deletes manually.
1105template<typename Ordinal, typename Packet>
1106ValueTypeReductionOp<Ordinal,Packet>*
1107createOp (const EReductionType reductType)
1108{
1109 typedef ScalarTraits<Packet> ST;
1110 switch (reductType) {
1111 case REDUCE_SUM: {
1112 return new SumValueReductionOp<Ordinal,Packet> ();
1113 }
1114 case REDUCE_MIN: {
1115 if (ST::isComparable) {
1116 return new MinValueReductionOp<Ordinal,Packet> ();
1117 }
1118 else {
1120 (! ST::isComparable, std::invalid_argument, "Teuchos::createOp"
1121 "(EReductionType): The Packet type " << TypeNameTraits<Packet>::name ()
1122 << " is not less-than comparable, so it does not make sense to do a "
1123 "MIN reduction with it.");
1125 }
1126 }
1127 case REDUCE_MAX: {
1128 if (ST::isComparable) {
1129 return new MaxValueReductionOp<Ordinal,Packet> ();
1130 }
1131 else {
1133 (! ST::isComparable, std::invalid_argument, "Teuchos::createOp"
1134 "(EReductionType): The Packet type " << TypeNameTraits<Packet>::name ()
1135 << " is not less-than comparable, so it does not make sense to do a "
1136 "MAX reduction with it.");
1138 }
1139 }
1140 case REDUCE_AND: {
1141 return new ANDValueReductionOp<Ordinal, Packet> ();
1142 }
1143 default:
1145 true, std::invalid_argument, "Teuchos::createOp(EReductionType): "
1146 "Invalid EReductionType value " << reductType << ". Valid values "
1147 "include REDUCE_SUM, REDUCE_MIN, REDUCE_MAX, and REDUCE_AND.");
1148 }
1149}
1150
1151
1152} // namespace Teuchos
1153
1154
1155//
1156// Teuchos::Comm wrapper functions
1157//
1158
1159
1160template<typename Ordinal>
1161int Teuchos::rank(const Comm<Ordinal>& comm)
1162{
1163 return comm.getRank();
1164}
1165
1166
1167template<typename Ordinal>
1168int Teuchos::size(const Comm<Ordinal>& comm)
1169{
1170 return comm.getSize();
1171}
1172
1173
1174template<typename Ordinal>
1175void Teuchos::barrier(const Comm<Ordinal>& comm)
1176{
1177 TEUCHOS_COMM_TIME_MONITOR(
1178 "Teuchos::CommHelpers: barrier<"
1179 <<OrdinalTraits<Ordinal>::name()
1180 <<">()"
1181 );
1182 comm.barrier();
1183}
1184
1185
1186template<typename Ordinal, typename Packet>
1187void Teuchos::broadcast(
1188 const Comm<Ordinal>& comm,
1189 const int rootRank, const Ordinal count, Packet buffer[]
1190 )
1191{
1192 TEUCHOS_COMM_TIME_MONITOR(
1193 "Teuchos::CommHelpers: broadcast<"
1194 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1195 <<">( value type )"
1196 );
1197 ValueTypeSerializationBuffer<Ordinal,Packet>
1198 charBuffer(count,buffer);
1199 comm.broadcast(
1200 rootRank,charBuffer.getBytes(),charBuffer.getCharBuffer()
1201 );
1202}
1203
1204
1205template<typename Ordinal, typename Packet>
1206void Teuchos::broadcast(
1207 const Comm<Ordinal>& comm,
1208 const int rootRank,
1209 const ArrayView<Packet> &buffer
1210 )
1211{
1212 broadcast<Ordinal, Packet>(comm, rootRank, buffer.size(), buffer.getRawPtr() );
1213}
1214
1215
1216template<typename Ordinal, typename Packet>
1217void Teuchos::broadcast(
1218 const Comm<Ordinal>& comm,
1219 const int rootRank, Packet *object
1220 )
1221{
1222 broadcast<Ordinal,Packet>(comm,rootRank,1,object);
1223}
1224
1225
1226template<typename Ordinal, typename Packet>
1227void Teuchos::broadcast(
1228 const Comm<Ordinal>& comm,
1229 const int rootRank, const Ptr<Packet> &object
1230 )
1231{
1232 broadcast<Ordinal,Packet>(comm,rootRank,1,object.getRawPtr());
1233}
1234
1235
1236template<typename Ordinal, typename Packet>
1237void Teuchos::broadcast(
1238 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
1239 const int rootRank, const Ordinal count, Packet*const buffer[]
1240 )
1241{
1242 TEUCHOS_COMM_TIME_MONITOR(
1243 "Teuchos::CommHelpers: broadcast<"
1244 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1245 <<">( reference type )"
1246 );
1247 ReferenceTypeSerializationBuffer<Ordinal,Packet>
1248 charBuffer(serializer, count, buffer);
1249 comm.broadcast(
1250 rootRank,charBuffer.getBytes(),charBuffer.getCharBuffer()
1251 );
1252}
1253
1254
1255template<typename Ordinal, typename Packet>
1256void Teuchos::broadcast(
1257 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
1258 const int rootRank, const ArrayView<const Ptr<Packet> > &buffer
1259 )
1260{
1261 Array<Packet*> bufferPtrArray;
1262 for (int i = 0; i < buffer.size(); ++i) {
1263 bufferPtrArray.push_back(buffer[i].getRawPtr());
1264 }
1265 broadcast<Ordinal,Packet>(comm, serializer, rootRank,
1266 buffer.size(), bufferPtrArray.getRawPtr());
1267}
1268
1269template<typename Ordinal, typename Packet, typename Serializer>
1270void Teuchos::broadcast(
1271 const Comm<Ordinal>& comm,
1272 const Serializer& serializer,
1273 const int rootRank, const Ordinal count, Packet buffer[]
1274 )
1275{
1276 TEUCHOS_COMM_TIME_MONITOR(
1277 "Teuchos::CommHelpers: broadcast<"
1278 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1279 <<">( value type )"
1280 );
1281 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
1282 charBuffer(count,buffer,rcp(&serializer,false));
1283 comm.broadcast(
1284 rootRank,charBuffer.getBytes(),charBuffer.getCharBuffer()
1285 );
1286}
1287
1288
1289template<typename Ordinal, typename Packet>
1290void Teuchos::gatherAll(
1291 const Comm<Ordinal>& comm,
1292 const Ordinal sendCount, const Packet sendBuffer[],
1293 const Ordinal recvCount, Packet recvBuffer[]
1294 )
1295{
1296 TEUCHOS_COMM_TIME_MONITOR(
1297 "Teuchos::CommHelpers: gatherAll<"
1298 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1299 <<">( value type )"
1300 );
1301 ConstValueTypeSerializationBuffer<Ordinal,Packet>
1302 charSendBuffer(sendCount,sendBuffer);
1303 ValueTypeSerializationBuffer<Ordinal,Packet>
1304 charRecvBuffer(recvCount,recvBuffer);
1305 comm.gatherAll(
1306 charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
1307 ,charRecvBuffer.getBytes(),charRecvBuffer.getCharBuffer()
1308 );
1309}
1310
1311template<typename Ordinal, typename Packet>
1312void
1313Teuchos::gather (const Packet sendBuf[],
1314 const Ordinal sendCount,
1315 Packet recvBuf[],
1316 const Ordinal recvCount,
1317 const int root,
1318 const Comm<Ordinal>& comm)
1319{
1320 TEUCHOS_COMM_TIME_MONITOR(
1321 "Teuchos::CommHelpers: gather<"
1322 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1323 <<">( value type )"
1324 );
1325 ConstValueTypeSerializationBuffer<Ordinal,Packet>
1326 charSendBuffer (sendCount, sendBuf);
1327 ValueTypeSerializationBuffer<Ordinal,Packet>
1328 charRecvBuffer (recvCount, recvBuf);
1329 comm.gather (charSendBuffer.getBytes (),
1330 charSendBuffer.getCharBuffer (),
1331 charRecvBuffer.getBytes (),
1332 charRecvBuffer.getCharBuffer (),
1333 root);
1334}
1335
1336template<typename Ordinal, typename Packet>
1337void
1338Teuchos::gatherv (const Packet sendBuf[],
1339 const Ordinal sendCount,
1340 Packet recvBuf[],
1341 const Ordinal recvCounts[],
1342 const Ordinal displs[],
1343 const int root,
1344 const Comm<Ordinal>& comm)
1345{
1346 // Ordinal totalRecvCount = 0;
1347
1348 // // In order to get the right output buffer length, we have to sum
1349 // // the receive counts from all the processes in the communicator.
1350 // const Ordinal numProcs = as<Ordinal> (comm->getSize ());
1351 // for (Ordinal k = 0; k < as<Ordinal> (numProcs); ++k) {
1352 // totalRecvCount += recvCounts[k];
1353 // }
1354
1355 // // FIXME (mfh 16 Apr 2013) We also have to redo the displacements.
1356
1357 // ConstValueTypeSerializationBuffer<Ordinal,Packet>
1358 // charSendBuffer (sendCount, sendBuf);
1359 // ValueTypeSerializationBuffer<Ordinal,Packet>
1360 // charRecvBuffer (totalRecvCount, recvBuf);
1361 // comm.gatherv (charSendBuffer.getBytes (),
1362 // charSendBuffer.getCharBuffer (),
1363 // charRecvBuffer.getBytes (),
1364 // charRecvBuffer.getCharBuffer (),
1365 // root);
1366 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
1367 "Teuchos::gatherv: The general case is not implemented.");
1368}
1369
1370template<typename Ordinal, typename Packet>
1371void Teuchos::gatherAll(
1372 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
1373 const Ordinal sendCount, const Packet*const sendBuffer[],
1374 const Ordinal recvCount, Packet*const recvBuffer[]
1375 )
1376{
1377 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Implement and test when needed!
1378}
1379
1380template<typename Ordinal, typename Packet, typename Serializer>
1381void Teuchos::gatherAll(
1382 const Comm<Ordinal>& comm,
1383 const Serializer& serializer,
1384 const Ordinal sendCount, const Packet sendBuffer[],
1385 const Ordinal recvCount, Packet recvBuffer[]
1386 )
1387{
1388 TEUCHOS_COMM_TIME_MONITOR(
1389 "Teuchos::CommHelpers: gatherAll<"
1390 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1391 <<">( value type )"
1392 );
1393 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
1394 charSendBuffer(sendCount,sendBuffer,rcp(&serializer,false));
1395 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
1396 charRecvBuffer(recvCount,recvBuffer,rcp(&serializer,false));
1397 comm.gatherAll(
1398 charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
1399 ,charRecvBuffer.getBytes(),charRecvBuffer.getCharBuffer()
1400 );
1401}
1402
1403
1404template<typename Ordinal, typename Packet>
1405void
1406Teuchos::reduce (const Packet sendBuf[],
1407 Packet recvBuf[],
1408 const Ordinal count,
1409 const EReductionType reductType,
1410 const Ordinal root,
1411 const Comm<Ordinal>& comm)
1412{
1413 // See Bug 6375; Tpetra does not actually need any specializations
1414 // other than Ordinal = int and Packet = int. We may add them later
1415 // if there is interest.
1417 (true, std::logic_error, "Teuchos::reduce<" <<
1418 TypeNameTraits<Ordinal>::name () << "," << TypeNameTraits<Packet>::name ()
1419 << ">: Generic version not implemented. We only implement this function "
1420 "for Ordinal = int and Packet = specific types.");
1421}
1422
1423
1424template<typename Ordinal, typename Packet>
1425void Teuchos::reduceAll(
1426 const Comm<Ordinal>& comm, const ValueTypeReductionOp<Ordinal,Packet> &reductOp
1427 ,const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
1428 )
1429{
1430 TEUCHOS_COMM_TIME_MONITOR(
1431 "Teuchos::CommHelpers: reduceAll<"
1432 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1433 <<">( value type, user-defined op )"
1434 );
1435 ConstValueTypeSerializationBuffer<Ordinal,Packet>
1436 charSendBuffer(count,sendBuffer);
1437 ValueTypeSerializationBuffer<Ordinal,Packet>
1438 charGlobalReducts(count,globalReducts);
1439 CharToValueTypeReductionOp<Ordinal,Packet>
1440 charReductOp(rcp(&reductOp,false));
1441 comm.reduceAll(
1442 charReductOp,charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
1443 ,charGlobalReducts.getCharBuffer()
1444 );
1445}
1446
1447
1448template<typename Ordinal, typename Packet>
1449void Teuchos::reduceAll(
1450 const Comm<Ordinal>& comm, const EReductionType reductType,
1451 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
1452 )
1453{
1454 TEUCHOS_COMM_TIME_MONITOR(
1455 "Teuchos::CommHelpers: reduceAll<"
1456 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
1457 <<">( value type, "<<toString(reductType)<<" )"
1458 );
1459
1460 ValueTypeReductionOp<Ordinal,Packet>* reductOp =
1461 createOp<Ordinal, Packet> (reductType);
1462 try {
1463 reduceAll(comm,*reductOp,count,sendBuffer,globalReducts);
1464 }
1465 catch (std::exception& e) {
1466 delete reductOp;
1467 throw e;
1468 }
1469 delete reductOp;
1470}
1471
1472
1473namespace Teuchos {
1474
1475// amb 11 Nov 2014. I am disabling these specializations for
1476// now. MPI_C_DOUBLE_COMPLEX is causing a problem in some builds. This code was
1477// effectively turned on only yesterday (10 Nov 2014) when TEUCHOS_HAVE_COMPLEX
1478// was corrected to be HAVE_TEUCHOS_COMPLEX, so evidently there are no users of
1479// these specializations.
1480#if 0
1481#ifdef HAVE_TEUCHOS_COMPLEX
1482// Specialization for Ordinal=int and Packet=std::complex<double>.
1483template<>
1484TEUCHOSCOMM_LIB_DLL_EXPORT void
1485reduceAll<int, std::complex<double> > (const Comm<int>& comm,
1486 const EReductionType reductType,
1487 const int count,
1488 const std::complex<double> sendBuffer[],
1489 std::complex<double> globalReducts[]);
1490template<>
1491TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1492ireceive<int, std::complex<double> > (const Comm<int>& comm,
1493 const ArrayRCP<std::complex<double> >& recvBuffer,
1494 const int sourceRank);
1495template<>
1496TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1497ireceive<int, std::complex<double> > (const ArrayRCP<std::complex<double> > &recvBuffer,
1498 const int sourceRank,
1499 const int tag,
1500 const Comm<int>& comm);
1501template<>
1502TEUCHOSCOMM_LIB_DLL_EXPORT void
1503send<int, std::complex<double> > (const Comm<int>& comm,
1504 const int count,
1505 const std::complex<double> sendBuffer[],
1506 const int destRank);
1507template<>
1508TEUCHOSCOMM_LIB_DLL_EXPORT void
1509send<int, std::complex<double> > (const std::complex<double> sendBuffer[],
1510 const int count,
1511 const int destRank,
1512 const int tag,
1513 const Comm<int>& comm);
1514template<>
1515TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1516isend<int, std::complex<double> > (const ArrayRCP<const std::complex<double> >& sendBuffer,
1517 const int destRank,
1518 const int tag,
1519 const Comm<int>& comm);
1520
1521// Specialization for Ordinal=int and Packet=std::complex<float>.
1522template<>
1523TEUCHOSCOMM_LIB_DLL_EXPORT void
1524reduceAll<int, std::complex<float> > (const Comm<int>& comm,
1525 const EReductionType reductType,
1526 const int count,
1527 const std::complex<float> sendBuffer[],
1528 std::complex<float> globalReducts[]);
1529template<>
1530TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1531ireceive<int, std::complex<float> > (const Comm<int>& comm,
1532 const ArrayRCP<std::complex<float> >& recvBuffer,
1533 const int sourceRank);
1534template<>
1535TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1536ireceive<int, std::complex<float> > (const ArrayRCP<std::complex<float> > &recvBuffer,
1537 const int sourceRank,
1538 const int tag,
1539 const Comm<int>& comm);
1540template<>
1541TEUCHOSCOMM_LIB_DLL_EXPORT void
1542send<int, std::complex<float> > (const Comm<int>& comm,
1543 const int count,
1544 const std::complex<float> sendBuffer[],
1545 const int destRank);
1546template<>
1547TEUCHOSCOMM_LIB_DLL_EXPORT void
1548send<int, std::complex<float> > (const std::complex<float> sendBuffer[],
1549 const int count,
1550 const int destRank,
1551 const int tag,
1552 const Comm<int>& comm);
1553template<>
1554TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1555isend<int, std::complex<float> > (const ArrayRCP<const std::complex<float> >& sendBuffer,
1556 const int destRank,
1557 const int tag,
1558 const Comm<int>& comm);
1559#endif // HAVE_TEUCHOS_COMPLEX
1560#endif // if 0
1561
1562// Specialization for Ordinal=int and Packet=double.
1563template<>
1564TEUCHOSCOMM_LIB_DLL_EXPORT void
1565reduceAll<int, double> (const Comm<int>& comm,
1566 const EReductionType reductType,
1567 const int count,
1568 const double sendBuffer[],
1569 double globalReducts[]);
1570template<>
1571TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1572ireceive<int, double> (const Comm<int>& comm,
1573 const ArrayRCP<double>& recvBuffer,
1574 const int sourceRank);
1575template<>
1576TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1577ireceive<int, double> (const ArrayRCP<double> &recvBuffer,
1578 const int sourceRank,
1579 const int tag,
1580 const Comm<int>& comm);
1581template<>
1582TEUCHOSCOMM_LIB_DLL_EXPORT void
1583send<int, double> (const Comm<int>& comm,
1584 const int count,
1585 const double sendBuffer[],
1586 const int destRank);
1587template<>
1588TEUCHOSCOMM_LIB_DLL_EXPORT void
1589send<int, double> (const double sendBuffer[],
1590 const int count,
1591 const int destRank,
1592 const int tag,
1593 const Comm<int>& comm);
1594template<>
1595TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1596isend<int, double> (const ArrayRCP<const double>& sendBuffer,
1597 const int destRank,
1598 const int tag,
1599 const Comm<int>& comm);
1600
1601template<>
1602TEUCHOSCOMM_LIB_DLL_EXPORT void
1603gatherv<int, double> (const double sendBuf[],
1604 const int sendCount,
1605 double recvBuf[],
1606 const int recvCounts[],
1607 const int displs[],
1608 const int root,
1609 const Comm<int>& comm);
1610
1611// Specialization for Ordinal=int and Packet=float.
1612template<>
1613TEUCHOSCOMM_LIB_DLL_EXPORT void
1614reduceAll<int, float> (const Comm<int>& comm,
1615 const EReductionType reductType,
1616 const int count,
1617 const float sendBuffer[],
1618 float globalReducts[]);
1619template<>
1620TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1621ireceive<int, float> (const Comm<int>& comm,
1622 const ArrayRCP<float>& recvBuffer,
1623 const int sourceRank);
1624template<>
1625TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1626ireceive<int, float> (const ArrayRCP<float> &recvBuffer,
1627 const int sourceRank,
1628 const int tag,
1629 const Comm<int>& comm);
1630template<>
1631TEUCHOSCOMM_LIB_DLL_EXPORT void
1632send<int, float> (const Comm<int>& comm,
1633 const int count,
1634 const float sendBuffer[],
1635 const int destRank);
1636template<>
1637TEUCHOSCOMM_LIB_DLL_EXPORT void
1638send<int, float> (const float sendBuffer[],
1639 const int count,
1640 const int destRank,
1641 const int tag,
1642 const Comm<int>& comm);
1643template<>
1644TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1645isend<int, float> (const ArrayRCP<const float>& sendBuffer,
1646 const int destRank,
1647 const int tag,
1648 const Comm<int>& comm);
1649
1650template<>
1651TEUCHOSCOMM_LIB_DLL_EXPORT void
1652gatherv<int, float> (const float sendBuf[],
1653 const int sendCount,
1654 float recvBuf[],
1655 const int recvCounts[],
1656 const int displs[],
1657 const int root,
1658 const Comm<int>& comm);
1659
1660// Specialization for Ordinal=int and Packet=long long.
1661template<>
1662TEUCHOSCOMM_LIB_DLL_EXPORT void
1663gather<int, long long> (const long long sendBuf[],
1664 const int sendCount,
1665 long long recvBuf[],
1666 const int recvCount,
1667 const int root,
1668 const Comm<int>& comm);
1669template<>
1670TEUCHOSCOMM_LIB_DLL_EXPORT void
1671gatherv<int, long long> (const long long sendBuf[],
1672 const int sendCount,
1673 long long recvBuf[],
1674 const int recvCounts[],
1675 const int displs[],
1676 const int root,
1677 const Comm<int>& comm);
1678template<>
1679TEUCHOSCOMM_LIB_DLL_EXPORT void
1680reduceAll<int, long long> (const Comm<int>& comm,
1681 const EReductionType reductType,
1682 const int count,
1683 const long long sendBuffer[],
1684 long long globalReducts[]);
1685template<>
1686TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1687ireceive<int, long long> (const Comm<int>& comm,
1688 const ArrayRCP<long long>& recvBuffer,
1689 const int sourceRank);
1690template<>
1691TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1692ireceive<int, long long> (const ArrayRCP<long long> &recvBuffer,
1693 const int sourceRank,
1694 const int tag,
1695 const Comm<int>& comm);
1696template<>
1697TEUCHOSCOMM_LIB_DLL_EXPORT void
1698send<int, long long> (const Comm<int>& comm,
1699 const int count,
1700 const long long sendBuffer[],
1701 const int destRank);
1702template<>
1703TEUCHOSCOMM_LIB_DLL_EXPORT void
1704send<int, long long> (const long long sendBuffer[],
1705 const int count,
1706 const int destRank,
1707 const int tag,
1708 const Comm<int>& comm);
1709template<>
1710TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1711isend<int, long long> (const ArrayRCP<const long long>& sendBuffer,
1712 const int destRank,
1713 const int tag,
1714 const Comm<int>& comm);
1715
1716// Specialization for Ordinal=int and Packet=unsigned long long.
1717template<>
1718TEUCHOSCOMM_LIB_DLL_EXPORT void
1719gather<int, unsigned long long> (const unsigned long long sendBuf[],
1720 const int sendCount,
1721 unsigned long long recvBuf[],
1722 const int recvCount,
1723 const int root,
1724 const Comm<int>& comm);
1725template<>
1726TEUCHOSCOMM_LIB_DLL_EXPORT void
1727gatherv<int, unsigned long long> (const unsigned long long sendBuf[],
1728 const int sendCount,
1729 unsigned long long recvBuf[],
1730 const int recvCounts[],
1731 const int displs[],
1732 const int root,
1733 const Comm<int>& comm);
1734template<>
1735TEUCHOSCOMM_LIB_DLL_EXPORT void
1736reduceAll<int, unsigned long long> (const Comm<int>& comm,
1737 const EReductionType reductType,
1738 const int count,
1739 const unsigned long long sendBuffer[],
1740 unsigned long long globalReducts[]);
1741template<>
1742TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1743ireceive<int, unsigned long long> (const Comm<int>& comm,
1744 const ArrayRCP<unsigned long long>& recvBuffer,
1745 const int sourceRank);
1746template<>
1747TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1748ireceive<int, unsigned long long> (const ArrayRCP<unsigned long long> &recvBuffer,
1749 const int sourceRank,
1750 const int tag,
1751 const Comm<int>& comm);
1752template<>
1753TEUCHOSCOMM_LIB_DLL_EXPORT void
1754send<int, unsigned long long> (const Comm<int>& comm,
1755 const int count,
1756 const unsigned long long sendBuffer[],
1757 const int destRank);
1758template<>
1759TEUCHOSCOMM_LIB_DLL_EXPORT void
1760send<int, unsigned long long> (const unsigned long long sendBuffer[],
1761 const int count,
1762 const int destRank,
1763 const int tag,
1764 const Comm<int>& comm);
1765template<>
1766TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1767isend<int, unsigned long long> (const ArrayRCP<const unsigned long long>& sendBuffer,
1768 const int destRank,
1769 const int tag,
1770 const Comm<int>& comm);
1771
1772// Specialization for Ordinal=int and Packet=long.
1773template<>
1774TEUCHOSCOMM_LIB_DLL_EXPORT void
1775gather<int, long> (const long sendBuf[],
1776 const int sendCount,
1777 long recvBuf[],
1778 const int recvCount,
1779 const int root,
1780 const Comm<int>& comm);
1781template<>
1782TEUCHOSCOMM_LIB_DLL_EXPORT void
1783gatherv<int, long> (const long sendBuf[],
1784 const int sendCount,
1785 long recvBuf[],
1786 const int recvCounts[],
1787 const int displs[],
1788 const int root,
1789 const Comm<int>& comm);
1790template<>
1791TEUCHOSCOMM_LIB_DLL_EXPORT void
1792reduceAll<int, long> (const Comm<int>& comm,
1793 const EReductionType reductType,
1794 const int count,
1795 const long sendBuffer[],
1796 long globalReducts[]);
1797template<>
1798TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1799ireceive<int, long> (const Comm<int>& comm,
1800 const ArrayRCP<long>& recvBuffer,
1801 const int sourceRank);
1802template<>
1803TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1804ireceive<int, long> (const ArrayRCP<long> &recvBuffer,
1805 const int sourceRank,
1806 const int tag,
1807 const Comm<int>& comm);
1808template<>
1809TEUCHOSCOMM_LIB_DLL_EXPORT void
1810send<int, long> (const Comm<int>& comm,
1811 const int count,
1812 const long sendBuffer[],
1813 const int destRank);
1814template<>
1815TEUCHOSCOMM_LIB_DLL_EXPORT void
1816send<int, long> (const long sendBuffer[],
1817 const int count,
1818 const int destRank,
1819 const int tag,
1820 const Comm<int>& comm);
1821template<>
1822TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1823isend<int, long> (const ArrayRCP<const long>& sendBuffer,
1824 const int destRank,
1825 const int tag,
1826 const Comm<int>& comm);
1827
1828// Specialization for Ordinal=int and Packet=unsigned long.
1829template<>
1830TEUCHOSCOMM_LIB_DLL_EXPORT void
1831gather<int, unsigned long> (const unsigned long sendBuf[],
1832 const int sendCount,
1833 unsigned long recvBuf[],
1834 const int recvCount,
1835 const int root,
1836 const Comm<int>& comm);
1837template<>
1838TEUCHOSCOMM_LIB_DLL_EXPORT void
1839gatherv<int, unsigned long> (const unsigned long sendBuf[],
1840 const int sendCount,
1841 unsigned long recvBuf[],
1842 const int recvCounts[],
1843 const int displs[],
1844 const int root,
1845 const Comm<int>& comm);
1846template<>
1847TEUCHOSCOMM_LIB_DLL_EXPORT void
1848reduceAll<int, unsigned long> (const Comm<int>& comm,
1849 const EReductionType reductType,
1850 const int count,
1851 const unsigned long sendBuffer[],
1852 unsigned long globalReducts[]);
1853template<>
1854TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1855ireceive<int, unsigned long> (const Comm<int>& comm,
1856 const ArrayRCP<unsigned long>& recvBuffer,
1857 const int sourceRank);
1858template<>
1859TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1860ireceive<int, unsigned long> (const ArrayRCP<unsigned long> &recvBuffer,
1861 const int sourceRank,
1862 const int tag,
1863 const Comm<int>& comm);
1864template<>
1865TEUCHOSCOMM_LIB_DLL_EXPORT void
1866send<int, unsigned long> (const Comm<int>& comm,
1867 const int count,
1868 const unsigned long sendBuffer[],
1869 const int destRank);
1870template<>
1871TEUCHOSCOMM_LIB_DLL_EXPORT void
1872send<int, unsigned long> (const unsigned long sendBuffer[],
1873 const int count,
1874 const int destRank,
1875 const int tag,
1876 const Comm<int>& comm);
1877template<>
1878TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1879isend<int, unsigned long> (const ArrayRCP<const unsigned long>& sendBuffer,
1880 const int destRank,
1881 const int tag,
1882 const Comm<int>& comm);
1883
1884// Specialization for Ordinal=int and Packet=int.
1885template<>
1886TEUCHOSCOMM_LIB_DLL_EXPORT void
1887gather<int, int> (const int sendBuf[],
1888 const int sendCount,
1889 int recvBuf[],
1890 const int recvCount,
1891 const int root,
1892 const Comm<int>& comm);
1893template<>
1894TEUCHOSCOMM_LIB_DLL_EXPORT void
1895gatherv<int, int> (const int sendBuf[],
1896 const int sendCount,
1897 int recvBuf[],
1898 const int recvCounts[],
1899 const int displs[],
1900 const int root,
1901 const Comm<int>& comm);
1902template<>
1903TEUCHOSCOMM_LIB_DLL_EXPORT void
1904scatter (const int sendBuf[],
1905 const int sendCount,
1906 int recvBuf[],
1907 const int recvCount,
1908 const int root,
1909 const Comm<int>& comm);
1910template<>
1911TEUCHOSCOMM_LIB_DLL_EXPORT void
1912scatterv (const double sendBuf[],
1913 const int sendCounts[],
1914 const int displs[],
1915 double recvBuf[],
1916 const int recvCount,
1917 const int root,
1918 const Comm<int>& comm);
1919template<>
1920TEUCHOSCOMM_LIB_DLL_EXPORT void
1921scatterv (const float sendBuf[],
1922 const int sendCounts[],
1923 const int displs[],
1924 float recvBuf[],
1925 const int recvCount,
1926 const int root,
1927 const Comm<int>& comm);
1928template<>
1929TEUCHOSCOMM_LIB_DLL_EXPORT void
1930reduce<int, int> (const int sendBuf[],
1931 int recvBuf[],
1932 const int count,
1933 const EReductionType reductType,
1934 const int root,
1935 const Comm<int>& comm);
1936template<>
1937TEUCHOSCOMM_LIB_DLL_EXPORT void
1938reduce<int, long> (const long sendBuf[],
1939 long recvBuf[],
1940 const int count,
1941 const EReductionType reductType,
1942 const int root,
1943 const Comm<int>& comm);
1944template<>
1945TEUCHOSCOMM_LIB_DLL_EXPORT void
1946reduce<int, unsigned long> (const unsigned long sendBuf[],
1947 unsigned long recvBuf[],
1948 const int count,
1949 const EReductionType reductType,
1950 const int root,
1951 const Comm<int>& comm);
1952template<>
1953TEUCHOSCOMM_LIB_DLL_EXPORT void
1954reduce<int, unsigned long long > (const unsigned long long sendBuf[],
1955 unsigned long long recvBuf[],
1956 const int count,
1957 const EReductionType reductType,
1958 const int root,
1959 const Comm<int>& comm);
1960template<>
1961TEUCHOSCOMM_LIB_DLL_EXPORT void
1962reduce<int, double> (const double sendBuf[],
1963 double recvBuf[],
1964 const int count,
1965 const EReductionType reductType,
1966 const int root,
1967 const Comm<int>& comm);
1968template<>
1969TEUCHOSCOMM_LIB_DLL_EXPORT void
1970reduceAll<int, int> (const Comm<int>& comm,
1971 const EReductionType reductType,
1972 const int count,
1973 const int sendBuffer[],
1974 int globalReducts[]);
1975
1976template<>
1977TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1978ireceive<int, int> (const Comm<int>& comm,
1979 const ArrayRCP<int>& recvBuffer,
1980 const int sourceRank);
1981template<>
1982TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
1983ireceive<int, int> (const ArrayRCP<int> &recvBuffer,
1984 const int sourceRank,
1985 const int tag,
1986 const Comm<int>& comm);
1987template<>
1988TEUCHOSCOMM_LIB_DLL_EXPORT void
1989send<int, int> (const Comm<int>& comm,
1990 const int count,
1991 const int sendBuffer[],
1992 const int destRank);
1993template<>
1994TEUCHOSCOMM_LIB_DLL_EXPORT void
1995send<int, int> (const int sendBuffer[],
1996 const int count,
1997 const int destRank,
1998 const int tag,
1999 const Comm<int>& comm);
2000template<>
2001TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2002isend<int, int> (const ArrayRCP<const int>& sendBuffer,
2003 const int destRank,
2004 const int tag,
2005 const Comm<int>& comm);
2006
2007// Specialization for Ordinal=int and Packet=unsigned int.
2008template<>
2009TEUCHOSCOMM_LIB_DLL_EXPORT void
2010gather<int, unsigned int> (const unsigned int sendBuf[],
2011 const int sendCount,
2012 unsigned int recvBuf[],
2013 const int recvCount,
2014 const int root,
2015 const Comm<int>& comm);
2016template<>
2017TEUCHOSCOMM_LIB_DLL_EXPORT void
2018gatherv<int, unsigned int> (const unsigned int sendBuf[],
2019 const int sendCount,
2020 unsigned int recvBuf[],
2021 const int recvCounts[],
2022 const int displs[],
2023 const int root,
2024 const Comm<int>& comm);
2025template<>
2026TEUCHOSCOMM_LIB_DLL_EXPORT void
2027reduceAll<int, unsigned int> (const Comm<int>& comm,
2028 const EReductionType reductType,
2029 const int count,
2030 const unsigned int sendBuffer[],
2031 unsigned int globalReducts[]);
2032template<>
2033TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2034ireceive<int, unsigned int> (const Comm<int>& comm,
2035 const ArrayRCP<unsigned int>& recvBuffer,
2036 const int sourceRank);
2037template<>
2038TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2039ireceive<int, unsigned int> (const ArrayRCP<unsigned int> &recvBuffer,
2040 const int sourceRank,
2041 const int tag,
2042 const Comm<int>& comm);
2043template<>
2044TEUCHOSCOMM_LIB_DLL_EXPORT void
2045send<int, unsigned int> (const Comm<int>& comm,
2046 const int count,
2047 const unsigned int sendBuffer[],
2048 const int destRank);
2049template<>
2050TEUCHOSCOMM_LIB_DLL_EXPORT void
2051send<int, unsigned int> (const unsigned int sendBuffer[],
2052 const int count,
2053 const int destRank,
2054 const int tag,
2055 const Comm<int>& comm);
2056template<>
2057TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2058isend<int, unsigned int> (const ArrayRCP<const unsigned int>& sendBuffer,
2059 const int destRank,
2060 const int tag,
2061 const Comm<int>& comm);
2062
2063// Specialization for Ordinal=int and Packet=short.
2064template<>
2065TEUCHOSCOMM_LIB_DLL_EXPORT void
2066gather<int, short> (const short sendBuf[],
2067 const int sendCount,
2068 short recvBuf[],
2069 const int recvCount,
2070 const int root,
2071 const Comm<int>& comm);
2072template<>
2073TEUCHOSCOMM_LIB_DLL_EXPORT void
2074gatherv<int, short> (const short sendBuf[],
2075 const int sendCount,
2076 short recvBuf[],
2077 const int recvCounts[],
2078 const int displs[],
2079 const int root,
2080 const Comm<int>& comm);
2081template<>
2082TEUCHOSCOMM_LIB_DLL_EXPORT void
2083reduceAll<int, short> (const Comm<int>& comm,
2084 const EReductionType reductType,
2085 const int count,
2086 const short sendBuffer[],
2087 short globalReducts[]);
2088template<>
2089TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2090ireceive<int, short> (const Comm<int>& comm,
2091 const ArrayRCP<short>& recvBuffer,
2092 const int sourceRank);
2093template<>
2094TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2095ireceive<int, short> (const ArrayRCP<short> &recvBuffer,
2096 const int sourceRank,
2097 const int tag,
2098 const Comm<int>& comm);
2099template<>
2100TEUCHOSCOMM_LIB_DLL_EXPORT void
2101send<int, short> (const Comm<int>& comm,
2102 const int count,
2103 const short sendBuffer[],
2104 const int destRank);
2105template<>
2106TEUCHOSCOMM_LIB_DLL_EXPORT void
2107send<int, short> (const short sendBuffer[],
2108 const int count,
2109 const int destRank,
2110 const int tag,
2111 const Comm<int>& comm);
2112template<>
2113TEUCHOSCOMM_LIB_DLL_EXPORT RCP<CommRequest<int> >
2114isend<int, short> (const ArrayRCP<const short>& sendBuffer,
2115 const int destRank,
2116 const int tag,
2117 const Comm<int>& comm);
2118
2119// mfh 18 Oct 2012: The specialization for Packet=char seems to be
2120// causing problems such as the following:
2121//
2122// http://testing.sandia.gov/cdash/testDetails.php?test=9909246&build=747699
2123//
2124// I am disabling it for now. This should revert back to the old
2125// behavior for Packet=char. That should fix the Tpetra errors, since
2126// many Tpetra objects inherit from DistObject<char, ...>.
2127#if 0
2128// Specialization for Ordinal=int and Packet=char.
2129template<>
2130TEUCHOSCOMM_LIB_DLL_EXPORT void
2131reduceAll<int, char> (const Comm<int>& comm,
2132 const EReductionType reductType,
2133 const int count,
2134 const char sendBuffer[],
2135 char globalReducts[]);
2136#endif // 0
2137} // namespace Teuchos
2138
2139
2140template<typename Ordinal, typename Packet>
2141void Teuchos::reduceAll(
2142 const Comm<Ordinal>& comm, const EReductionType reductType
2143 ,const Packet &send, const Ptr<Packet> &globalReduct
2144 )
2145{
2146 // mfh 17 Oct 2012: This will invoke the above specializations for
2147 // general count, so we don't need to specialize this function.
2148 reduceAll<Ordinal,Packet>(comm, reductType, 1, &send, &*globalReduct);
2149}
2150
2151
2152template<typename Ordinal, typename Packet>
2153void Teuchos::reduceAll(
2154 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
2155 const ReferenceTypeReductionOp<Ordinal,Packet> &reductOp,
2156 const Ordinal count, const Packet*const sendBuffer[], Packet*const globalReducts[]
2157 )
2158{
2159 TEUCHOS_COMM_TIME_MONITOR(
2160 "Teuchos::CommHelpers: reduceAll<"
2161 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2162 <<">( reference type )"
2163 );
2164 ConstReferenceTypeSerializationBuffer<Ordinal,Packet>
2165 charSendBuffer(serializer,count,sendBuffer);
2166 ReferenceTypeSerializationBuffer<Ordinal,Packet>
2167 charGlobalReducts(serializer,count,globalReducts);
2168 CharToReferenceTypeReductionOp<Ordinal,Packet>
2169 charReductOp(rcp(&serializer,false),rcp(&reductOp,false));
2170 comm.reduceAll(
2171 charReductOp,charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2172 ,charGlobalReducts.getCharBuffer()
2173 );
2174}
2175
2176template<typename Ordinal, typename Packet, typename Serializer>
2177void Teuchos::reduceAll(
2178 const Comm<Ordinal>& comm,
2179 const Serializer& serializer,
2180 const ValueTypeReductionOp<Ordinal,Packet> &reductOp,
2181 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
2182 )
2183{
2184 TEUCHOS_COMM_TIME_MONITOR(
2185 "Teuchos::CommHelpers: reduceAll<"
2186 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2187 <<">( value type, user-defined op )"
2188 );
2189 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2190 charSendBuffer(count,sendBuffer,rcp(&serializer,false));
2191 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2192 charGlobalReducts(count,globalReducts,rcp(&serializer,false));
2193 CharToValueTypeReductionOp<Ordinal,Packet,Serializer>
2194 charReductOp(rcp(&reductOp,false),rcp(&serializer,false));
2195 comm.reduceAll(
2196 charReductOp,charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2197 ,charGlobalReducts.getCharBuffer()
2198 );
2199}
2200
2201
2202template<typename Ordinal, typename Packet, typename Serializer>
2203void Teuchos::reduceAll(
2204 const Comm<Ordinal>& comm,
2205 const Serializer& serializer,
2206 const EReductionType reductType,
2207 const Ordinal count, const Packet sendBuffer[], Packet globalReducts[]
2208 )
2209{
2210 TEUCHOS_COMM_TIME_MONITOR(
2211 "Teuchos::CommHelpers: reduceAll<"
2212 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2213 <<">( value type, "<<toString(reductType)<<" )"
2214 );
2215
2216 ValueTypeReductionOp<Ordinal,Packet>* reductOp =
2217 createOp<Ordinal, Packet> (reductType);
2218 try {
2219 reduceAll(comm,serializer,*reductOp,count,sendBuffer,globalReducts);
2220 }
2221 catch (std::exception& e) {
2222 delete reductOp;
2223 throw e;
2224 }
2225 delete reductOp;
2226}
2227
2228
2229template<typename Ordinal, typename Packet>
2230void Teuchos::scan(
2231 const Comm<Ordinal>& comm, const ValueTypeReductionOp<Ordinal,Packet> &reductOp,
2232 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
2233 )
2234{
2235 TEUCHOS_COMM_TIME_MONITOR(
2236 "Teuchos::CommHelpers: scan<"
2237 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2238 <<">( value type, user-defined op )"
2239 );
2240 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2241 charSendBuffer(count,sendBuffer);
2242 ValueTypeSerializationBuffer<Ordinal,Packet>
2243 charScanReducts(count,scanReducts);
2244 CharToValueTypeReductionOp<Ordinal,Packet>
2245 charReductOp(rcp(&reductOp,false));
2246 comm.scan(
2247 charReductOp,charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2248 ,charScanReducts.getCharBuffer()
2249 );
2250}
2251
2252
2253template<typename Ordinal, typename Packet>
2254void Teuchos::scan(
2255 const Comm<Ordinal>& comm, const EReductionType reductType,
2256 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
2257 )
2258{
2259 TEUCHOS_COMM_TIME_MONITOR(
2260 "Teuchos::CommHelpers: scan<"
2261 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2262 <<">( value type, "<<toString(reductType)<<" )"
2263 );
2264
2265 ValueTypeReductionOp<Ordinal,Packet>* reductOp =
2266 createOp<Ordinal, Packet> (reductType);
2267 try {
2268 scan(comm,*reductOp,count,sendBuffer,scanReducts);
2269 }
2270 catch (std::exception& e) {
2271 delete reductOp;
2272 throw e;
2273 }
2274 delete reductOp;
2275}
2276
2277
2278template<typename Ordinal, typename Packet>
2279void Teuchos::scan(
2280 const Comm<Ordinal>& comm, const EReductionType reductType,
2281 const Packet &send, const Ptr<Packet> &scanReduct
2282 )
2283{
2284 scan<Ordinal,Packet>(comm, reductType, 1, &send, &*scanReduct);
2285}
2286
2287
2288template<typename Ordinal, typename Packet>
2289void Teuchos::scan(
2290 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
2291 const ReferenceTypeReductionOp<Ordinal,Packet> &reductOp,
2292 const Ordinal count, const Packet*const sendBuffer[], Packet*const scanReducts[]
2293 )
2294{
2295 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Implement and test when needed!
2296}
2297
2298template<typename Ordinal, typename Packet, typename Serializer>
2299void Teuchos::scan(
2300 const Comm<Ordinal>& comm,
2301 const Serializer& serializer,
2302 const ValueTypeReductionOp<Ordinal,Packet> &reductOp,
2303 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
2304 )
2305{
2306 TEUCHOS_COMM_TIME_MONITOR(
2307 "Teuchos::CommHelpers: scan<"
2308 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2309 <<">( value type, user-defined op )"
2310 );
2311 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2312 charSendBuffer(count,sendBuffer,rcp(&serializer,false));
2313 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2314 charScanReducts(count,scanReducts,rcp(&serializer,false));
2315 CharToValueTypeReductionOp<Ordinal,Packet,Serializer>
2316 charReductOp(rcp(&reductOp,false),rcp(&serializer,false));
2317 comm.scan(
2318 charReductOp,charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2319 ,charScanReducts.getCharBuffer()
2320 );
2321}
2322
2323
2324template<typename Ordinal, typename Packet, typename Serializer>
2325void Teuchos::scan(
2326 const Comm<Ordinal>& comm,
2327 const Serializer& serializer,
2328 const EReductionType reductType,
2329 const Ordinal count, const Packet sendBuffer[], Packet scanReducts[]
2330 )
2331{
2332 TEUCHOS_COMM_TIME_MONITOR(
2333 "Teuchos::CommHelpers: scan<"
2334 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2335 <<">( value type, "<<toString(reductType)<<" )"
2336 );
2337
2338 ValueTypeReductionOp<Ordinal,Packet>* reductOp =
2339 createOp<Ordinal, Packet> (reductType);
2340 try {
2341 scan(comm,serializer,*reductOp,count,sendBuffer,scanReducts);
2342 }
2343 catch (std::exception& e) {
2344 delete reductOp;
2345 throw e;
2346 }
2347 delete reductOp;
2348}
2349
2350template<typename Ordinal, typename Packet>
2351void Teuchos::send(
2352 const Comm<Ordinal>& comm,
2353 const Ordinal count, const Packet sendBuffer[], const int destRank
2354 )
2355{
2356 TEUCHOS_COMM_TIME_MONITOR(
2357 "Teuchos::CommHelpers: send<"
2358 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2359 <<">( value type )"
2360 );
2361 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2362 charSendBuffer(count,sendBuffer);
2363 comm.send(
2364 charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2365 ,destRank
2366 );
2367}
2368
2369template<typename Ordinal, typename Packet>
2370void
2372 const Ordinal count,
2373 const int destRank,
2374 const int tag,
2375 const Comm<Ordinal>& comm)
2376{
2377 TEUCHOS_COMM_TIME_MONITOR(
2378 "Teuchos::CommHelpers: send<"
2380 <<">( value type )"
2381 );
2383 comm.send (charSendBuffer.getBytes (), charSendBuffer.getCharBuffer (), destRank, tag);
2384}
2385
2386template<typename Ordinal, typename Packet>
2387void Teuchos::ssend(
2388 const Comm<Ordinal>& comm,
2389 const Ordinal count, const Packet sendBuffer[], const int destRank
2390 )
2391{
2392 TEUCHOS_COMM_TIME_MONITOR(
2393 "Teuchos::CommHelpers: ssend<"
2394 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2395 <<">( value type )"
2396 );
2397 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2398 charSendBuffer(count,sendBuffer);
2399 comm.ssend(
2400 charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2401 ,destRank
2402 );
2403}
2404
2405template<typename Ordinal, typename Packet>
2406void
2408 const Ordinal count,
2409 const int destRank,
2410 const int tag,
2411 const Comm<Ordinal>& comm)
2412{
2413 TEUCHOS_COMM_TIME_MONITOR(
2414 "Teuchos::CommHelpers: ssend<"
2416 <<">( value type )"
2417 );
2420 comm.ssend (charSendBuffer.getBytes (),
2421 charSendBuffer.getCharBuffer (),
2422 destRank, tag);
2423}
2424
2425template<typename Ordinal, typename Packet>
2426void Teuchos::send(
2427 const Comm<Ordinal>& comm,
2428 const Packet &send, const int destRank
2429 )
2430{
2431 Teuchos::send<Ordinal,Packet>(comm,1,&send,destRank);
2432}
2433
2434template<typename Ordinal, typename Packet>
2435void Teuchos::ssend(
2436 const Comm<Ordinal>& comm,
2437 const Packet &send, const int destRank
2438 )
2439{
2440 Teuchos::ssend<Ordinal,Packet>(comm,1,&send,destRank);
2441}
2442
2443template<typename Ordinal, typename Packet>
2444void Teuchos::send(
2445 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
2446 const Ordinal count, const Packet*const sendBuffer[], const int destRank
2447 )
2448{
2449 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Implement and test when needed!
2450}
2451
2452template<typename Ordinal, typename Packet, typename Serializer>
2453void Teuchos::send(
2454 const Comm<Ordinal>& comm,
2455 const Serializer& serializer,
2456 const Ordinal count, const Packet sendBuffer[], const int destRank
2457 )
2458{
2459 TEUCHOS_COMM_TIME_MONITOR(
2460 "Teuchos::CommHelpers: send<"
2461 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2462 <<">( value type )"
2463 );
2464 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2465 charSendBuffer(count,sendBuffer,rcp(&serializer,false));
2466 comm.send(
2467 charSendBuffer.getBytes(),charSendBuffer.getCharBuffer()
2468 ,destRank
2469 );
2470}
2471
2472template<typename Ordinal, typename Packet>
2473int Teuchos::receive(
2474 const Comm<Ordinal>& comm,
2475 const int sourceRank, const Ordinal count, Packet recvBuffer[]
2476 )
2477{
2478 TEUCHOS_COMM_TIME_MONITOR(
2479 "Teuchos::CommHelpers: receive<"
2480 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2481 <<">( value type )"
2482 );
2483 ValueTypeSerializationBuffer<Ordinal,Packet>
2484 charRecvBuffer(count,recvBuffer);
2485 return comm.receive(
2486 sourceRank
2487 ,charRecvBuffer.getBytes(),charRecvBuffer.getCharBuffer()
2488 );
2489}
2490
2491
2492template<typename Ordinal, typename Packet>
2493int Teuchos::receive(
2494 const Comm<Ordinal>& comm,
2495 const int sourceRank, Packet *recv
2496 )
2497{
2498 return Teuchos::receive<Ordinal,Packet>(comm,sourceRank,1,recv);
2499}
2500
2501
2502template<typename Ordinal, typename Packet>
2503int Teuchos::receive(
2504 const Comm<Ordinal>& comm, const Serializer<Ordinal,Packet> &serializer,
2505 const int sourceRank, const Ordinal count, Packet*const recvBuffer[]
2506 )
2507{
2508 TEUCHOS_TEST_FOR_EXCEPT(true); // ToDo: Implement and test when needed!
2509}
2510
2511template<typename Ordinal, typename Packet, typename Serializer>
2512int Teuchos::receive(
2513 const Comm<Ordinal>& comm,
2514 const Serializer& serializer,
2515 const int sourceRank, const Ordinal count, Packet recvBuffer[]
2516 )
2517{
2518 TEUCHOS_COMM_TIME_MONITOR(
2519 "Teuchos::CommHelpers: receive<"
2520 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2521 <<">( value type )"
2522 );
2523 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2524 charRecvBuffer(count,recvBuffer,rcp(&serializer,false));
2525 return comm.receive(
2526 sourceRank
2527 ,charRecvBuffer.getBytes(),charRecvBuffer.getCharBuffer()
2528 );
2529}
2530
2531template<typename Ordinal, typename Packet>
2533 const Comm<Ordinal>& comm,
2534 const ArrayView<const Packet> &sendBuffer,
2535 const int destRank
2536 )
2537{
2538 TEUCHOS_COMM_TIME_MONITOR(
2539 "Teuchos::CommHelpers: readySend<"
2540 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2541 <<">( value type )"
2542 );
2543 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2544 charSendBuffer(sendBuffer.size(), sendBuffer.getRawPtr());
2545 comm.readySend( charSendBuffer.getCharBufferView(), destRank );
2546}
2547
2548template<typename Ordinal, typename Packet>
2549void
2551 const Ordinal count,
2552 const int destRank,
2553 const int tag,
2554 const Comm<Ordinal>& comm)
2555{
2556 TEUCHOS_COMM_TIME_MONITOR(
2557 "Teuchos::CommHelpers: readySend<"
2559 <<">( value type )"
2560 );
2563 comm.readySend (charSendBuffer.getBytes (),
2564 charSendBuffer.getCharBuffer (),
2565 destRank, tag);
2566}
2567
2568template<typename Ordinal, typename Packet>
2570 const Comm<Ordinal>& comm,
2571 const Packet &send,
2572 const int destRank
2573 )
2574{
2575 readySend<Ordinal, Packet>( comm, arrayView(&send,1), destRank );
2576}
2577
2578template<typename Ordinal, typename Packet, typename Serializer>
2580 const Comm<Ordinal>& comm,
2581 const Serializer& serializer,
2582 const ArrayView<const Packet> &sendBuffer,
2583 const int destRank
2584 )
2585{
2586 TEUCHOS_COMM_TIME_MONITOR(
2587 "Teuchos::CommHelpers: readySend<"
2588 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2589 <<">( value type )"
2590 );
2591 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2592 charSendBuffer(sendBuffer.size(), sendBuffer.getRawPtr(), serializer);
2593 comm.readySend( charSendBuffer.getCharBufferView(), destRank );
2594}
2595
2596template<typename Ordinal, typename Packet>
2598Teuchos::isend(
2599 const Comm<Ordinal>& comm,
2600 const ArrayRCP<const Packet> &sendBuffer,
2601 const int destRank
2602 )
2603{
2604 TEUCHOS_COMM_TIME_MONITOR(
2605 "Teuchos::CommHelpers: isend<"
2606 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2607 <<">( value type )"
2608 );
2609 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2610 charSendBuffer(sendBuffer.size(), sendBuffer.getRawPtr());
2611 RCP<CommRequest<Ordinal> > commRequest = comm.isend(
2612 charSendBuffer.getCharBufferView(), destRank );
2613 set_extra_data( sendBuffer, "buffer", inOutArg(commRequest) );
2614 return commRequest;
2615}
2616
2617template<typename Ordinal, typename Packet>
2619Teuchos::isend (const ArrayRCP<const Packet> &sendBuffer,
2620 const int destRank,
2621 const int tag,
2622 const Comm<Ordinal>& comm)
2623{
2624 TEUCHOS_COMM_TIME_MONITOR(
2625 "Teuchos::isend<" << OrdinalTraits<Ordinal>::name () << ","
2626 << TypeNameTraits<Packet>::name () << ">");
2627 ConstValueTypeSerializationBuffer<Ordinal,Packet>
2628 charSendBuffer (sendBuffer.size (), sendBuffer.getRawPtr ());
2629 RCP<CommRequest<Ordinal> > commRequest =
2630 comm.isend (charSendBuffer.getCharBufferView (), destRank, tag);
2631 set_extra_data (sendBuffer, "buffer", inOutArg (commRequest));
2632 return commRequest;
2633}
2634
2635template<typename Ordinal, typename Packet>
2637Teuchos::isend(
2638 const Comm<Ordinal>& comm,
2639 const RCP<const Packet> &send,
2640 const int destRank
2641 )
2642{
2643 const ArrayRCP<const Packet> sendBuffer =
2644 arcpWithEmbeddedObj( send.get(), 0, 1, send, false );
2645 // 2008/07/29: rabartl: Above: I need to write a helper function to create
2646 // new ArrayRCP object given a single object to copy.
2647 return isend<Ordinal, Packet>( comm, sendBuffer, destRank );
2648}
2649
2650template<typename Ordinal, typename Packet, typename Serializer>
2652Teuchos::isend(
2653 const Comm<Ordinal>& comm,
2654 const Serializer& serializer,
2655 const ArrayRCP<const Packet> &sendBuffer,
2656 const int destRank
2657 )
2658{
2659 TEUCHOS_COMM_TIME_MONITOR(
2660 "Teuchos::CommHelpers: isend<"
2661 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2662 <<">( value type )"
2663 );
2664 ConstValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2665 charSendBuffer(sendBuffer.size(), sendBuffer.getRawPtr(), serializer);
2666 RCP<CommRequest<Ordinal> > commRequest = comm.isend(
2667 charSendBuffer.getCharBufferView(), destRank );
2668 set_extra_data( sendBuffer, "buffer", inOutArg(commRequest) );
2669 return commRequest;
2670}
2671
2672template<typename Ordinal, typename Packet>
2675 const Comm<Ordinal>& comm,
2676 const ArrayRCP<Packet> &recvBuffer,
2677 const int sourceRank
2678 )
2679{
2680 TEUCHOS_COMM_TIME_MONITOR(
2681 "Teuchos::ireceive<int, " << "," << TypeNameTraits<Packet>::name () << ">");
2682 ValueTypeSerializationBuffer<Ordinal,Packet>
2683 charRecvBuffer(recvBuffer.size(), recvBuffer.getRawPtr());
2684 RCP<CommRequest<Ordinal> > commRequest = comm.ireceive(
2685 charRecvBuffer.getCharBufferView(), sourceRank );
2686 set_extra_data( recvBuffer, "buffer", inOutArg(commRequest) );
2687 return commRequest;
2688}
2689
2690template<typename Ordinal, typename Packet>
2693 const int sourceRank,
2694 const int tag,
2695 const Teuchos::Comm<Ordinal>& comm)
2696{
2697 TEUCHOS_COMM_TIME_MONITOR(
2698 "Teuchos::ireceive<int, " << "," << TypeNameTraits<Packet>::name () << ">");
2699 ValueTypeSerializationBuffer<int, Packet>
2700 charRecvBuffer (recvBuffer.size (), recvBuffer.getRawPtr ());
2701 RCP<CommRequest<int> > commRequest =
2702 comm.ireceive (charRecvBuffer.getCharBufferView (), sourceRank, tag);
2703 set_extra_data (recvBuffer, "buffer", inOutArg (commRequest));
2704 return commRequest;
2705}
2706
2707template<typename Ordinal, typename Packet>
2710 const Comm<Ordinal>& comm,
2711 const RCP<Packet> &recv,
2712 const int sourceRank
2713 )
2714{
2715 const ArrayRCP<Packet> recvBuffer =
2716 arcpWithEmbeddedObj( recv.get(), 0, 1, recv, false );
2717 // 2008/07/29: rabartl: Above: I need to write a helper function to create
2718 // new ArrayRCP object given a single object to copy.
2719 return ireceive<Ordinal, Packet>( comm, recvBuffer, sourceRank );
2720}
2721
2722template<typename Ordinal, typename Packet, typename Serializer>
2725 const Comm<Ordinal>& comm,
2726 const Serializer& serializer,
2727 const ArrayRCP<Packet> &recvBuffer,
2728 const int sourceRank
2729 )
2730{
2731 TEUCHOS_COMM_TIME_MONITOR(
2732 "Teuchos::CommHelpers: ireceive<"
2733 <<OrdinalTraits<Ordinal>::name()<<","<<TypeNameTraits<Packet>::name()
2734 <<">( value type )"
2735 );
2736 ValueTypeSerializationBuffer<Ordinal,Packet,Serializer>
2737 charRecvBuffer(recvBuffer.size(), recvBuffer.getRawPtr(), serializer);
2738 RCP<CommRequest<Ordinal> > commRequest = comm.ireceive(
2739 charRecvBuffer.getCharBufferView(), sourceRank );
2740 set_extra_data( recvBuffer, "buffer", inOutArg(commRequest) );
2741 return commRequest;
2742}
2743
2744template<typename Ordinal>
2745void Teuchos::waitAll(
2746 const Comm<Ordinal>& comm,
2747 const ArrayView<RCP<CommRequest<Ordinal> > > &requests
2748 )
2749{
2750 comm.waitAll(requests);
2751}
2752
2753
2754template<typename Ordinal>
2755void
2756Teuchos::waitAll (const Comm<Ordinal>& comm,
2757 const ArrayView<RCP<CommRequest<Ordinal> > >& requests,
2758 const ArrayView<RCP<CommStatus<Ordinal> > >& statuses)
2759{
2760 comm.waitAll (requests, statuses);
2761}
2762
2763
2764template<typename Ordinal>
2766Teuchos::wait (const Comm<Ordinal>& comm,
2767 const Ptr<RCP<CommRequest<Ordinal> > > &request)
2768{
2769 return comm.wait (request);
2770}
2771
2772
2773#endif // TEUCHOS_COMM_HELPERS_HPP
Templated array class derived from the STL std::vector.
Implementation of Teuchos wrappers for MPI.
Declaration of Teuchos::EReductionType enum, and related functions.
Defines basic traits for the ordinal field type.
Defines basic traits for the scalar field type.
Defines basic traits returning the name of a type in a portable and readable way.
Definition of Teuchos::as, for conversions between types.
Standard logical AND operator for booleans.
void reduce(const Ordinal count, const Packet inBuffer[], Packet inoutBuffer[]) const
Nonowning array view.
void ssend(const Comm< Ordinal > &comm, const Packet &send, const int destRank)
Synchronously send a single object that use values semantics to another process.
RCP< CommRequest< Ordinal > > ireceive(const Comm< Ordinal > &comm, const ArrayRCP< Packet > &recvBuffer, const int sourceRank)
Receive one or more objects (that use values semantics) from another process.
void scan(const Comm< Ordinal > &comm, const Serializer &serializer, const EReductionType reductType, const Ordinal count, const Packet sendBuffer[], Packet scanReducts[])
Scan/Reduce array of objects using value semantics using a predefined reduction type and customized s...
void scan(const Comm< Ordinal > &comm, const ValueTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet sendBuffer[], Packet scanReducts[])
Scan/Reduce array of objects that use value semantics using a user-defined reduction operator.
void waitAll(const Comm< Ordinal > &comm, const ArrayView< RCP< CommRequest< Ordinal > > > &requests)
Wait for an array of Teuchos::CommRequest objects.
void reduceAll(const Comm< Ordinal > &comm, const ValueTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet sendBuffer[], Packet globalReducts[])
Wrapper for MPI_Allreduce that takes a custom reduction operator.
int receive(const Comm< Ordinal > &comm, const int sourceRank, Packet *recv)
Receive a single object that use values semantics from another process.
void gatherv(const Packet sendBuf[], const Ordinal sendCount, Packet recvBuf[], const Ordinal recvCounts[], const Ordinal displs[], const int root, const Comm< Ordinal > &comm)
Gather arrays of possibly different lengths from each process to the root process.
void scan(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, const Ptr< Packet > &scanReduct)
Scan/Reduce single object using value semantics using a predefined reduction type.
int receive(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const int sourceRank, const Ordinal count, Packet *const recvBuffer[])
Receive objects that use reference semantics from another process.
void readySend(const Comm< Ordinal > &comm, const Serializer &serializer, const ArrayView< const Packet > &sendBuffer, const int destRank)
Ready-Send an array of objects that use values semantics to another process using customized serializ...
void reduceAll(const Comm< Ordinal > &comm, const Serializer &serializer, const ValueTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet sendBuffer[], Packet globalReducts[])
Collective reduce all of array of objects using value semantics using a user-defined reduction operat...
void gatherAll(const Comm< Ordinal > &comm, const Serializer &serializer, const Ordinal sendCount, const Packet sendBuffer[], const Ordinal recvCount, Packet recvBuffer[])
Gather array of objects that use value semantics from every process to every process using customized...
int size(const Comm< Ordinal > &comm)
Get the number of processes in the communicator.
int rank(const Comm< Ordinal > &comm)
Get the process rank.
void reduce(const Packet sendBuf[], Packet recvBuf[], const Ordinal count, const EReductionType reductType, const Ordinal root, const Comm< Ordinal > &comm)
Wrapper for MPI_Reduce; reduction to one process, using a built-in reduction operator selected by enu...
void reduceAll(const Comm< Ordinal > &comm, const Serializer &serializer, const EReductionType reductType, const Ordinal count, const Packet sendBuffer[], Packet globalReducts[])
Collective reduce all of array of objects using value semantics using a pre-defined reduction type an...
int receive(const Comm< Ordinal > &comm, const Serializer &serializer, const int sourceRank, const Ordinal count, Packet recvBuffer[])
Receive objects that use values semantics from another process using customized serializer.
void gatherAll(const Comm< Ordinal > &comm, const Ordinal sendCount, const Packet sendBuffer[], const Ordinal recvCount, Packet recvBuffer[])
Gather array of objects that use value semantics from every process to every process.
void broadcast(const Comm< Ordinal > &comm, const int rootRank, Packet *object)
Broadcast single object that use value semantics.
void send(const Comm< Ordinal > &comm, const Ordinal count, const Packet sendBuffer[], const int destRank)
Send objects that use values semantics to another process.
void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, const Ptr< Packet > &globalReduct)
Collective reduce all for single object using value semantics using a pre-defined reduction type.
void broadcast(const Comm< Ordinal > &comm, const int rootRank, const Ordinal count, Packet buffer[])
Broadcast array of objects that use value semantics.
void waitAll(const Comm< Ordinal > &comm, const ArrayView< RCP< CommRequest< Ordinal > > > &requests, const ArrayView< RCP< CommStatus< Ordinal > > > &statuses)
Wait on one or more communication requests, and return their statuses.
void ssend(const Comm< Ordinal > &comm, const Ordinal count, const Packet sendBuffer[], const int destRank)
Synchronously send objects that use values semantics to another process.
void barrier(const Comm< Ordinal > &comm)
Barrier.
void send(const Comm< Ordinal > &comm, const Serializer &serializer, const Ordinal count, const Packet sendBuffer[], const int destRank)
Send objects that use values semantics to another process using customized serializer.
void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Ordinal count, const Packet sendBuffer[], Packet globalReducts[])
Collective reduce all of array of objects using value semantics using a pre-defined reduction type.
void gather(const Packet sendBuf[], const Ordinal sendCount, Packet recvBuf[], const Ordinal recvCount, const int root, const Comm< Ordinal > &comm)
Gather values from each process to the root process.
void broadcast(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const int rootRank, const Ordinal count, Packet *const buffer[])
Broadcast array of objects that use reference semantics.
RCP< CommStatus< Ordinal > > wait(const Comm< Ordinal > &comm, const Ptr< RCP< CommRequest< Ordinal > > > &request)
Wait on a single communication request, and return its status.
void readySend(const Comm< Ordinal > &comm, const ArrayView< const Packet > &sendBuffer, const int destRank)
Ready-Send an array of objects that use values semantics to another process.
void scatter(const Packet sendBuf[], const Ordinal sendCount, Packet recvBuf[], const Ordinal recvCount, const Ordinal root, const Comm< Ordinal > &comm)
Wrapper for MPI_Scatter; scatter collective.
void gatherAll(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const Ordinal sendCount, const Packet *const sendBuffer[], const Ordinal recvCount, Packet *const recvBuffer[])
Gather array of objects that use reference semantics from every process to every process.
RCP< CommRequest< Ordinal > > ireceive(const Comm< Ordinal > &comm, const RCP< Packet > &recv, const int sourceRank)
Receive one object (that uses values semantics) from another process.
RCP< CommRequest< Ordinal > > isend(const Comm< Ordinal > &comm, const Serializer &serializer, const ArrayRCP< const Packet > &sendBuffer, const int destRank)
Send objects that use values semantics to another process using customized serializer.
void scan(const Comm< Ordinal > &comm, const EReductionType reductType, const Ordinal count, const Packet sendBuffer[], Packet scanReducts[])
Scan/Reduce array of objects using value semantics using a predefined reduction type.
void broadcast(const Comm< Ordinal > &comm, const Serializer &serializer, const int rootRank, const Ordinal count, Packet buffer[])
Broadcast array of objects that use value semantics using customized serializer.
RCP< CommRequest< Ordinal > > isend(const Comm< Ordinal > &comm, const RCP< const Packet > &send, const int destRank)
Send a single object that use values semantics to another process.
void reduceAll(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const ReferenceTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet *const sendBuffer[], Packet *const globalReducts[])
Collective reduce all for array of objects using reference semantics.
void broadcast(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const int rootRank, const ArrayView< const Ptr< Packet > > &buffer)
Broadcast array of objects that use reference semantics.
RCP< CommRequest< Ordinal > > isend(const Comm< Ordinal > &comm, const ArrayRCP< const Packet > &sendBuffer, const int destRank)
Send objects that use values semantics to another process.
RCP< CommRequest< Ordinal > > ireceive(const Comm< Ordinal > &comm, const Serializer &serializer, const ArrayRCP< Packet > &recvBuffer, const int sourceRank)
Send objects that use values semantics to another process using customized serializer.
void scan(const Comm< Ordinal > &comm, const Serializer &serializer, const ValueTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet sendBuffer[], Packet scanReducts[])
Scan/Reduce array of objects that use value semantics using a user-defined reduction operator and cus...
void broadcast(const Comm< Ordinal > &comm, const int rootRank, const ArrayView< Packet > &buffer)
Broadcast array of objects that use value semantics.
void broadcast(const Comm< Ordinal > &comm, const int rootRank, const Ptr< Packet > &object)
Broadcast single object that use value semantics.
EReductionType
Predefined reduction operations that Teuchos::Comm understands.
void send(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const Ordinal count, const Packet *const sendBuffer[], const int destRank)
Send objects that use reference semantics to another process.
int receive(const Comm< Ordinal > &comm, const int sourceRank, const Ordinal count, Packet recvBuffer[])
Receive objects that use values semantics from another process.
void scan(const Comm< Ordinal > &comm, const Serializer< Ordinal, Packet > &serializer, const ReferenceTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet *const sendBuffer[], Packet *const scanReducts[])
Scan/Reduce array of objects that use reference semantics using a user-defined reduction operator.
void readySend(const Comm< Ordinal > &comm, const Packet &send, const int destRank)
Ready-Send a single object that use values semantics to another process.
void send(const Comm< Ordinal > &comm, const Packet &send, const int destRank)
Send a single object that use values semantics to another process.
Standard Max operator for types with value semantics.
void reduce(const Ordinal count, const Packet inBuffer[], Packet inoutBuffer[]) const
Standard min operator for types with value semantics.
void reduce(const Ordinal count, const Packet inBuffer[], Packet inoutBuffer[]) const
Simple wrapper class for raw pointers to single objects where no persisting relationship exists.
Smart reference counting pointer class for automatic garbage collection.
T * getRawPtr() const
Get the raw C++ pointer to the underlying object.
T * get() const
Get the raw C++ pointer to the underlying object.
Strategy interface for the indirect serializing and deserializing objects of a given type handled usi...
Standard summation operator for types with value semantics.
void reduce(const Ordinal count, const Packet inBuffer[], Packet inoutBuffer[]) const
Default traits class that just returns typeid(T).name().
Base interface class for user-defined reduction operations for objects that use value semantics.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
Avoid warning about unreachable or missing return from function.
Namespace of implementation details.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
void ssend(const Packet sendBuffer[], const Ordinal count, const int destRank, const int tag, const Comm< Ordinal > &comm)
Variant of ssend() that takes a tag (and restores the correct order of arguments).
void readySend(const Packet sendBuffer[], const Ordinal count, const int destRank, const int tag, const Comm< Ordinal > &comm)
Variant of readySend() that accepts a message tag.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
RCP< CommRequest< Ordinal > > ireceive(const ArrayRCP< Packet > &recvBuffer, const int sourceRank, const int tag, const Comm< Ordinal > &comm)
Variant of ireceive that takes a tag argument (and restores the correct order of arguments).
@ REDUCE_AND
Logical AND.
void send(const Packet sendBuffer[], const Ordinal count, const int destRank, const int tag, const Comm< Ordinal > &comm)
Variant of send() that takes a tag (and restores the correct order of arguments).
This structure defines some basic traits for the ordinal field type.