Zoltan2
Loading...
Searching...
No Matches
AlltoAll.cpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Zoltan2: A package of combinatorial algorithms for scientific computing
4//
5// Copyright 2012 NTESS and the Zoltan2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10// TODO: doxygen comments
11// make this a real unit test that gives helpful information if it fails
12// and uses different template values
13
15#include <Zoltan2_AlltoAll.hpp>
17
18#include <iostream>
19#include <algorithm>
20#include <vector>
21#include <string>
22
23#include <Teuchos_RCP.hpp>
24#include <Teuchos_ArrayRCP.hpp>
25#include <Teuchos_Comm.hpp>
26#include <Teuchos_DefaultComm.hpp>
27
28
29int main(int narg, char *arg[])
30{
31 Tpetra::ScopeGuard tscope(&narg, &arg);
32 Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::getDefaultComm();
33
34 int rank = comm->getRank();
35 int nprocs = comm->getSize();
36
37 Teuchos::RCP<const Zoltan2::Environment> envPtr =
38 Teuchos::rcp(new Zoltan2::Environment(comm));
39
40 int errcode = 0;
41
42 if (!errcode){
43
44 // test of Zoltan2::AlltoAllv (different sized messages) using a Scalar type
45
46 int myMsgSizeBase=rank*nprocs + 1;
47 Array<int> sendCount(nprocs, 0);
48 Array<int> recvCount(nprocs, 0);
49 long totalOut = 0;
50
51 for (int p=0; p < nprocs; p++){
52 sendCount[p] = myMsgSizeBase + p;
53 totalOut += sendCount[p];
54 }
55
56 Array<int> sendBuf(totalOut, 0);
57
58 int *out = &(sendBuf[0]);
59 for (int p=0; p < nprocs; p++){
60 for (int i=0; i < sendCount[p]; i++){
61 *out++ = p+rank;
62 }
63 }
64
65 Teuchos::ArrayRCP<int> recvBuf;
66
67 Zoltan2::AlltoAllv<int>(*comm, *envPtr,
68 sendBuf(),
69 sendCount(),
70 recvBuf,
71 recvCount());
72
73 int *inBuf = recvBuf.get();
74
75 for (int p=0; p < nprocs; p++){
76 for (int i=0; i < recvCount[p]; i++){
77 if (*inBuf++ != rank+p){
78 errcode = 4;
79 break;
80 }
81 }
82 }
83 }
84
85 TEST_FAIL_AND_EXIT(*comm, errcode==0, "int", errcode);
86
87 if (!errcode){
88
89 // test of Zoltan2::AlltoAllv using strings - which can not
90 // be serialized by Teuchos.
91 // Rank p sends p messages to each process.
92
93 int nstrings = nprocs * rank;
94 string *sendStrings = NULL;
95
96 if (nstrings > 0)
97 sendStrings = new string [nstrings];
98
99 std::ostringstream myMessage;
100 myMessage << "message from process " << rank;
101
102 for (int i=0; i < nstrings; i++)
103 sendStrings[i] = myMessage.str();
104
105 int *counts = new int [nprocs];
106 for (int i=0; i < nprocs ; i++)
107 counts[i] = rank;
108
109 Teuchos::ArrayView<const string> sendBuf(sendStrings, nstrings);
110 Teuchos::ArrayView<const int> sendCount(counts, nprocs);
111 Teuchos::Array<int> recvCounts(nprocs, 0);
112
113 Teuchos::ArrayRCP<string> recvBuf;
114
115 Zoltan2::AlltoAllv<string>(*comm, *envPtr,
116 sendBuf,
117 sendCount,
118 recvBuf,
119 recvCounts());
120
121 delete [] sendStrings;
122 delete [] counts;
123
124 int next = 0;
125 for (int i=0; i < nprocs; i++){
126 if (recvCounts[i] != i){
127 errcode = 5;
128 break;
129 }
130 std::ostringstream msg;
131 msg << "message from process " << i;
132 for (int j=0; j < recvCounts[i]; j++){
133 if (recvBuf[next++] != msg.str()){
134 errcode = 6;
135 break;
136 }
137 }
138 }
139 }
140
141 TEST_FAIL_AND_EXIT(*comm, errcode==0, "strings", errcode);
142
143 if (rank == 0){
144 if (errcode)
145 std::cout << "FAIL" << std::endl;
146 else
147 std::cout << "PASS" << std::endl;
148 }
149
150 return errcode;
151}
#define TEST_FAIL_AND_EXIT(comm, ok, s, code)
AlltoAll communication methods.
Defines the Environment class.
common code used by tests
int main()
The user parameters, debug, timing and memory profiling output objects, and error checking methods.
void AlltoAllv(const Comm< int > &comm, const Environment &env, const ArrayView< const std::string > &sendBuf, const ArrayView< const int > &sendCount, ArrayRCP< std::string > &recvBuf, const ArrayView< int > &recvCount)