A Lightweight Library for Building Scalable T
- ols
A Lightweight Library for Building Scalable T ools Emily R. - - PowerPoint PPT Presentation
A Lightweight Library for Building Scalable T ools Emily R. Jacobson , Michael J. Brim, Barton P. Miller Paradyn Project University of Wisconsin jacobson@cs.wisc.edu June 6, 2010 Para 2010: State of the Art in Scientific and Parallel
2
FE BE BE BE BE
…
3
100,000s of nodes
FE BE BE BE BE
…
4
5
6
FE
…
BE BE BE BE
7
FE CP CP CP CP CP CP
… …
BE BE BE BE
CP
8
FE CP CP CP CP CP CP
… …
BE BE BE BE
CP
9
FE CP CP CP CP CP CP
… …
BE BE BE BE
CP
10
FE CP CP CP CP CP CP
… …
BE BE BE BE
CP
11
CP CP CP CP CP CP
… …
BE BE BE BE
FE CP
12
CP CP CP CP CP CP
… …
BE BE BE BE
FE CP
13
Application-level packet Packet filter
CP CP CP CP CP CP
… …
BE BE BE BE
FE CP
14
Packet Batching/Unbatching
Packet Batching/Unbatching
Packet Filter
15
T
libmrnet T
filter
filter
filter
T
libmrnet T
libmrnet T
libmrnet Provided by MRNet User Written
… …
CP CP CP CP CP CP BE BE BE BE
num_vals, delay num_vals, delay num_vals, delay num_vals, delay num_vals, delay
FE CP
… …
CP CP CP CP CP CP BE BE BE BE
num_vals, delay num_vals, delay num_vals, delay num_vals, delay num_vals, delay cur_load cur_load cur_load cur_load
avg_load avg_load
FE CP
avg filter
avg_load avg_load avg_load
… …
CP CP CP CP CP CP BE BE BE BE
num_vals, delay num_vals, delay num_vals, delay num_vals, delay num_vals, delay cur_load cur_load cur_load cur_load
avg_load avg_load
FE CP
avg filter
avg_load avg_load avg_load
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
19
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
20
Create a new instance of a Network
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
21
Get broadcast communicator and create a Stream that uses this communicator
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
22
Send num_vals and delay to the BEs
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
23
Receive and unpack Packet with a single int
front_end_main(int argc, char ** argv) { Network * net = Network::CreateNetworkFE(topo_file, bckend_exe, &dummy_argv); int filter_id = net->load_FilterFunc(so_file, “LoadAvg”); Communicator * comm = net->get_BroadcastCommunicator(); Stream * strm = net->new_Stream(comm, filter_id, SFILTER_WAITFORALL); int tag = PROT_SUM; strm->send(tag, “%d %d”, num_vals, delay); for (i = 0; i < num_vals; i++) { strm->recv(&tag, pkt); pkt->unpack(“%d”, &recv_val); } strm->send(PROT_EXIT, “”); delete net; }
24
T eardown the Network
const char * LoadAvg_format_string = “%d”; void LoadAvg(std::vector<PacketPtr> & pkts_in, std::vector<PacketPtr> & pkts_out, std::vector<PacketPtr> &, /* packets_out_reverse */ void **, /* client data */ PacketPtr &) { /* params */ int avg = 0; for (unsigned int i = 0; i < pkts_in.size(); i++) { PacketPtr cur_packet = pkts_in[i]; int val; cur_packet->unpack(“%d”, &val); avg += val; } avg = avg / pkts_in.size(); PacketPtr new_pkt (new Packet(pkts_in[0]->get_StreamId(), pkts_in[0]->get_Tag(), “%d”, avg)); pkts_out.push_back(new_pkt); }
25
const char * LoadAvg_format_string = “%d”; void LoadAvg(std::vector<PacketPtr> & pkts_in, std::vector<PacketPtr> & pkts_out, std::vector<PacketPtr> &, /* packets_out_reverse */ void **, /* client data */ PacketPtr &) { /* params */ int avg = 0; for (unsigned int i = 0; i < pkts_in.size(); i++) { PacketPtr cur_packet = pkts_in[i]; int val; cur_packet->unpack(“%d”, &val); avg += val; } avg = avg / pkts_in.size(); PacketPtr new_pkt (new Packet(pkts_in[0]->get_StreamId(), pkts_in[0]->get_Tag(), “%d”, avg)); pkts_out.push_back(new_pkt); }
26
Declare format of data expected by the filter
const char * LoadAvg_format_string = “%d”; void LoadAvg(std::vector<PacketPtr> & pkts_in, std::vector<PacketPtr> & pkts_out, std::vector<PacketPtr> &, /* packets_out_reverse */ void **, /* client data */ PacketPtr &) { /* params */ int avg = 0; for (unsigned int i = 0; i < pkts_in.size(); i++) { PacketPtr cur_packet = pkts_in[i]; int val; cur_packet->unpack(“%d”, &val); avg += val; } avg = avg / pkts_in.size(); PacketPtr new_pkt (new Packet(pkts_in[0]->get_StreamId(), pkts_in[0]->get_Tag(), “%d”, avg)); pkts_out.push_back(new_pkt); }
27
Use generic function signature
const char * LoadAvg_format_string = “%d”; void LoadAvg(std::vector<PacketPtr> & pkts_in, std::vector<PacketPtr> & pkts_out, std::vector<PacketPtr> &, /* packets_out_reverse */ void **, /* client data */ PacketPtr &) { /* params */ int avg = 0; for (unsigned int i = 0; i < pkts_in.size(); i++) { PacketPtr cur_packet = pkts_in[i]; int val; cur_packet->unpack(“%d”, &val); avg += val; } avg = avg / pkts_in.size(); PacketPtr new_pkt (new Packet(pkts_in[0]->get_StreamId(), pkts_in[0]->get_Tag(), “%d”, avg)); pkts_out.push_back(new_pkt); }
28
Aggregate incoming packets
const char * LoadAvg_format_string = “%d”; void LoadAvg(std::vector<PacketPtr> & pkts_in, std::vector<PacketPtr> & pkts_out, std::vector<PacketPtr> &, /* packets_out_reverse */ void **, /* client data */ PacketPtr &) { /* params */ int avg = 0; for (unsigned int i = 0; i < pkts_in.size(); i++) { PacketPtr cur_packet = pkts_in[i]; int val; cur_packet->unpack(“%d”, &val); avg += val; } avg = avg / pkts_in.size(); PacketPtr new_pkt (new Packet(pkts_in[0]->get_StreamId(), pkts_in[0]->get_Tag(), “%d”, avg)); pkts_out.push_back(new_pkt); }
29
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
30
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
31
Create a new instance of a Network
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
32
Declare some necessary variables
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
33
Do an anonymous network receive
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
34
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
35
Send current load up the stream, then sleep for specified time
pkt->unpack(“%d %d”,&n,&delay);
36
pkt->unpack(“%d %d”,&n,&delay);
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { }
37
for (i = 0; i < n; i++) { Stream_send(strm,tag,“%d”, get_load()); sleep(delay); }
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); pkt->unpack(“%d %d”,&n,&delay); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { } Network_t * net = Network_CreateNetworkBE(argc, argv); Stream_t * strm; Packet_t * pkt; Network_recv(net, &tag, pkt, &strm); Packet_unpack(pkt,“%d %d”,&n,&delay); back_end_main(int argc, char ** argv) { }
38
for (i = 0; i < n; i++) { Stream_send(strm,tag,“%d”, get_load()); sleep(delay); }
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); pkt->unpack(“%d %d”,&n,&delay); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { } Network_t * net = Network_CreateNetworkBE(argc, argv); Stream_t * strm; Packet_t * pkt; Network_recv(net, &tag, pkt, &strm); Packet_unpack(pkt,“%d %d”,&n,&delay); back_end_main(int argc, char ** argv) { } Network_t * Network * Stream_t * Packet_t * Stream * PacketPtr
39
for (i = 0; i < n; i++) { Stream_send(strm,tag,“%d”, get_load()); sleep(delay); } Stream_send(strmtag, “%d”, get_load());
Network * net = Network::CreateNetworkBE(argc, argv); Stream * strm; PacketPtr pkt; net->recv(&tag, pkt, &strm); pkt->unpack(“%d %d”,&n,&delay); for (i = 0; i < n; i++) { strm->send(tag, “%d”, get_load()); sleep(delay); } back_end_main(int argc, char ** argv) { } Network_t * net = Network_CreateNetworkBE(argc, argv); Stream_t * strm; Packet_t * pkt; Network_recv(net, &tag, pkt, &strm); Packet_unpack(pkt,“%d %d”,&n,&delay); back_end_main(int argc, char ** argv) { } Network_t * Network * Stream_t * Packet_t * Stream * PacketPtr Network::CreateNetworkBE(argc, argv); Network_CreateNetworkBE(argc, argv); pkt->unpack(“%d %d”,&n,&delay); net->recv(&tag, pkt, &strm); Packet_unpack(pkt,“%d %d”,&n,&delay); Network_recv(net, &tag, pkt, &strm); strm->send(tag, “%d”, get_load());
40
41
42
43
44
45