68
send_string(const Ref<MessageGrp>& msg, int node, const char *s)
72
msg->send(node, s, l);
76
recv_string(const Ref<MessageGrp>& msg, int node)
80
char *s = new char[l+1];
82
msg->recv(node, s, l);
87
ParallelRegionTimer::send_subregions(int node, const TimedRegion *r) const
89
TimedRegion *subr = r->subregions();
91
// rewind to the beginning
92
if (subr) { while (subr->prev()) subr = subr->prev(); }
96
send_string(msg_, node, subr->name());
97
send_subregions(node, subr);
105
ParallelRegionTimer::recv_subregions(int node, TimedRegion *r) const
108
msg_->recv(node, has_subregions);
109
while (has_subregions) {
110
char *name = recv_string(msg_, node);
111
TimedRegion *region = r->findinsubregion(name);
113
recv_subregions(node, region);
114
msg_->recv(node, has_subregions);
119
ParallelRegionTimer::all_reduce_regions() const
121
Ref<MachineTopology> topology = msg_->topology();
123
// accumulate all the regions onto node zero
124
Ref<GlobalMsgIter> i_reduce(topology->global_msg_iter(msg_, 0));
125
for (i_reduce->backwards(); !i_reduce->done(); i_reduce->next()) {
126
if (i_reduce->send()) {
127
send_subregions(i_reduce->sendto(), top_);
129
if (i_reduce->recv()) {
130
recv_subregions(i_reduce->recvfrom(), top_);
134
// broadcast the regions to all the nodes
135
Ref<GlobalMsgIter> i_bcast(topology->global_msg_iter(msg_, 0));
136
for (i_bcast->forwards(); !i_bcast->done(); i_bcast->next()) {
137
if (i_bcast->send()) {
138
send_subregions(i_bcast->sendto(), top_);
140
if (i_bcast->recv()) {
141
recv_subregions(i_bcast->recvfrom(), top_);
68
147
ParallelRegionTimer::print(ostream &o) const