SimpleNetwork.cc (6895:5f3d2d3f977e) | SimpleNetwork.cc (7054:7d6862b80049) |
---|---|
1 | |
2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; --- 12 unchanged lines hidden (view full) --- 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 | 1/* 2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 12 unchanged lines hidden (view full) --- 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 |
30/* 31 * SimpleNetwork.cc 32 * 33 * Description: See SimpleNetwork.hh 34 * 35 * $Id$ 36 * 37 */ 38 | 29#include "mem/gems_common/Map.hh" 30#include "mem/protocol/MachineType.hh" 31#include "mem/protocol/Protocol.hh" 32#include "mem/protocol/TopologyType.hh" 33#include "mem/ruby/buffers/MessageBuffer.hh" 34#include "mem/ruby/common/NetDest.hh" |
39#include "mem/ruby/network/simple/SimpleNetwork.hh" | 35#include "mem/ruby/network/simple/SimpleNetwork.hh" |
40#include "mem/ruby/profiler/Profiler.hh" 41#include "mem/ruby/system/System.hh" | |
42#include "mem/ruby/network/simple/Switch.hh" | 36#include "mem/ruby/network/simple/Switch.hh" |
43#include "mem/ruby/common/NetDest.hh" | |
44#include "mem/ruby/network/simple/Topology.hh" | 37#include "mem/ruby/network/simple/Topology.hh" |
45#include "mem/protocol/TopologyType.hh" 46#include "mem/protocol/MachineType.hh" 47#include "mem/ruby/buffers/MessageBuffer.hh" 48#include "mem/protocol/Protocol.hh" 49#include "mem/gems_common/Map.hh" | 38#include "mem/ruby/profiler/Profiler.hh" 39#include "mem/ruby/system/System.hh" |
50 | 40 |
41#if 0 |
|
51// ***BIG HACK*** - This is actually code that _should_ be in Network.cc 52 53// Note: Moved to Princeton Network 54// calls new to abstract away from the network | 42// ***BIG HACK*** - This is actually code that _should_ be in Network.cc 43 44// Note: Moved to Princeton Network 45// calls new to abstract away from the network |
55/* 56Network* Network::createNetwork(int nodes) | 46Network* 47Network::createNetwork(int nodes) |
57{ | 48{ |
58 return new SimpleNetwork(nodes); | 49 return new SimpleNetwork(nodes); |
59} | 50} |
60*/ | 51#endif |
61 62SimpleNetwork::SimpleNetwork(const Params *p) 63 : Network(p) 64{ | 52 53SimpleNetwork::SimpleNetwork(const Params *p) 54 : Network(p) 55{ |
65 // 66 // Note: the parent Network Object constructor is called before the 67 // SimpleNetwork child constructor. Therefore, the member variables 68 // used below should already be initialized. 69 // 70 71 m_endpoint_switches.setSize(m_nodes); | 56 // Note: the parent Network Object constructor is called before the 57 // SimpleNetwork child constructor. Therefore, the member variables 58 // used below should already be initialized. |
72 | 59 |
73 m_in_use.setSize(m_virtual_networks); 74 m_ordered.setSize(m_virtual_networks); 75 for (int i = 0; i < m_virtual_networks; i++) { 76 m_in_use[i] = false; 77 m_ordered[i] = false; 78 } | 60 m_endpoint_switches.setSize(m_nodes); |
79 | 61 |
80 // Allocate to and from queues 81 m_toNetQueues.setSize(m_nodes); 82 m_fromNetQueues.setSize(m_nodes); 83 for (int node = 0; node < m_nodes; node++) { 84 m_toNetQueues[node].setSize(m_virtual_networks); 85 m_fromNetQueues[node].setSize(m_virtual_networks); 86 for (int j = 0; j < m_virtual_networks; j++) { 87 m_toNetQueues[node][j] = new MessageBuffer( 88 "toNet node "+int_to_string(node)+" j "+int_to_string(j)); 89 m_fromNetQueues[node][j] = new MessageBuffer( 90 "fromNet node "+int_to_string(node)+" j "+int_to_string(j)); | 62 m_in_use.setSize(m_virtual_networks); 63 m_ordered.setSize(m_virtual_networks); 64 for (int i = 0; i < m_virtual_networks; i++) { 65 m_in_use[i] = false; 66 m_ordered[i] = false; |
91 } | 67 } |
92 } | 68 69 // Allocate to and from queues 70 m_toNetQueues.setSize(m_nodes); 71 m_fromNetQueues.setSize(m_nodes); 72 for (int node = 0; node < m_nodes; node++) { 73 m_toNetQueues[node].setSize(m_virtual_networks); 74 m_fromNetQueues[node].setSize(m_virtual_networks); 75 for (int j = 0; j < m_virtual_networks; j++) { 76 m_toNetQueues[node][j] = new MessageBuffer( 77 "toNet node "+int_to_string(node)+" j "+int_to_string(j)); 78 m_fromNetQueues[node][j] = new MessageBuffer( 79 "fromNet node "+int_to_string(node)+" j "+int_to_string(j)); 80 } 81 } |
93} 94 | 82} 83 |
95void SimpleNetwork::init() | 84void 85SimpleNetwork::init() |
96{ | 86{ |
87 Network::init(); |
|
97 | 88 |
98 Network::init(); | 89 // The topology pointer should have already been initialized in 90 // the parent class network constructor. 91 assert(m_topology_ptr != NULL); 92 int number_of_switches = m_topology_ptr->numSwitches(); 93 for (int i = 0; i < number_of_switches; i++) { 94 m_switch_ptr_vector.insertAtBottom(new Switch(i, this)); 95 } |
99 | 96 |
100 // 101 // The topology pointer should have already been initialized in the parent 102 // class network constructor. 103 // 104 assert(m_topology_ptr != NULL); 105 int number_of_switches = m_topology_ptr->numSwitches(); 106 for (int i=0; i<number_of_switches; i++) { 107 m_switch_ptr_vector.insertAtBottom(new Switch(i, this)); 108 } 109 m_topology_ptr->createLinks(this, false); // false because this isn't a reconfiguration | 97 // false because this isn't a reconfiguration 98 m_topology_ptr->createLinks(this, false); |
110} 111 | 99} 100 |
112void SimpleNetwork::reset() | 101void 102SimpleNetwork::reset() |
113{ | 103{ |
114 for (int node = 0; node < m_nodes; node++) { 115 for (int j = 0; j < m_virtual_networks; j++) { 116 m_toNetQueues[node][j]->clear(); 117 m_fromNetQueues[node][j]->clear(); | 104 for (int node = 0; node < m_nodes; node++) { 105 for (int j = 0; j < m_virtual_networks; j++) { 106 m_toNetQueues[node][j]->clear(); 107 m_fromNetQueues[node][j]->clear(); 108 } |
118 } | 109 } |
119 } | |
120 | 110 |
121 for(int i=0; i<m_switch_ptr_vector.size(); i++){ 122 m_switch_ptr_vector[i]->clearBuffers(); 123 } | 111 for(int i = 0; i < m_switch_ptr_vector.size(); i++){ 112 m_switch_ptr_vector[i]->clearBuffers(); 113 } |
124} 125 126SimpleNetwork::~SimpleNetwork() 127{ | 114} 115 116SimpleNetwork::~SimpleNetwork() 117{ |
128 for (int i = 0; i < m_nodes; i++) { 129 m_toNetQueues[i].deletePointers(); 130 m_fromNetQueues[i].deletePointers(); 131 } 132 m_switch_ptr_vector.deletePointers(); 133 m_buffers_to_free.deletePointers(); 134 // delete m_topology_ptr; | 118 for (int i = 0; i < m_nodes; i++) { 119 m_toNetQueues[i].deletePointers(); 120 m_fromNetQueues[i].deletePointers(); 121 } 122 m_switch_ptr_vector.deletePointers(); 123 m_buffers_to_free.deletePointers(); 124 // delete m_topology_ptr; |
135} 136 137// From a switch to an endpoint node | 125} 126 127// From a switch to an endpoint node |
138void SimpleNetwork::makeOutLink(SwitchID src, NodeID dest, const NetDest& routing_table_entry, int link_latency, int link_weight, int bw_multiplier, bool isReconfiguration) | 128void 129SimpleNetwork::makeOutLink(SwitchID src, NodeID dest, 130 const NetDest& routing_table_entry, int link_latency, int link_weight, 131 int bw_multiplier, bool isReconfiguration) |
139{ | 132{ |
140 assert(dest < m_nodes); 141 assert(src < m_switch_ptr_vector.size()); 142 assert(m_switch_ptr_vector[src] != NULL); 143 if(!isReconfiguration){ 144 m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest], routing_table_entry, link_latency, bw_multiplier); | 133 assert(dest < m_nodes); 134 assert(src < m_switch_ptr_vector.size()); 135 assert(m_switch_ptr_vector[src] != NULL); 136 137 if (isReconfiguration) { 138 m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 139 return; 140 } 141 142 m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest], 143 routing_table_entry, link_latency, bw_multiplier); |
145 m_endpoint_switches[dest] = m_switch_ptr_vector[src]; | 144 m_endpoint_switches[dest] = m_switch_ptr_vector[src]; |
146 } else { 147 m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 148 } | |
149} 150 151// From an endpoint node to a switch | 145} 146 147// From an endpoint node to a switch |
152void SimpleNetwork::makeInLink(NodeID src, SwitchID dest, const NetDest& routing_table_entry, int link_latency, int bw_multiplier, bool isReconfiguration) | 148void 149SimpleNetwork::makeInLink(NodeID src, SwitchID dest, 150 const NetDest& routing_table_entry, int link_latency, int bw_multiplier, 151 bool isReconfiguration) |
153{ | 152{ |
154 assert(src < m_nodes); 155 if(!isReconfiguration){ | 153 assert(src < m_nodes); 154 if (isReconfiguration) { 155 // do nothing 156 return; 157 } 158 |
156 m_switch_ptr_vector[dest]->addInPort(m_toNetQueues[src]); | 159 m_switch_ptr_vector[dest]->addInPort(m_toNetQueues[src]); |
157 } else { 158 // do nothing 159 } | |
160} 161 162// From a switch to a switch | 160} 161 162// From a switch to a switch |
163void SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, const NetDest& routing_table_entry, int link_latency, int link_weight, int bw_multiplier, bool isReconfiguration) | 163void 164SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, 165 const NetDest& routing_table_entry, int link_latency, int link_weight, 166 int bw_multiplier, bool isReconfiguration) |
164{ | 167{ |
165 if(!isReconfiguration){ | 168 if (isReconfiguration) { 169 m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 170 return; 171 } 172 |
166 // Create a set of new MessageBuffers 167 Vector<MessageBuffer*> queues; 168 for (int i = 0; i < m_virtual_networks; i++) { | 173 // Create a set of new MessageBuffers 174 Vector<MessageBuffer*> queues; 175 for (int i = 0; i < m_virtual_networks; i++) { |
169 // allocate a buffer 170 MessageBuffer* buffer_ptr = new MessageBuffer; 171 buffer_ptr->setOrdering(true); 172 if (m_buffer_size > 0) { 173 buffer_ptr->setSize(m_buffer_size); 174 } 175 queues.insertAtBottom(buffer_ptr); 176 // remember to deallocate it 177 m_buffers_to_free.insertAtBottom(buffer_ptr); | 176 // allocate a buffer 177 MessageBuffer* buffer_ptr = new MessageBuffer; 178 buffer_ptr->setOrdering(true); 179 if (m_buffer_size > 0) { 180 buffer_ptr->setSize(m_buffer_size); 181 } 182 queues.insertAtBottom(buffer_ptr); 183 // remember to deallocate it 184 m_buffers_to_free.insertAtBottom(buffer_ptr); |
178 } | 185 } |
179 | |
180 // Connect it to the two switches 181 m_switch_ptr_vector[dest]->addInPort(queues); | 186 // Connect it to the two switches 187 m_switch_ptr_vector[dest]->addInPort(queues); |
182 m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry, link_latency, bw_multiplier); 183 } else { 184 m_switch_ptr_vector[src]->reconfigureOutPort(routing_table_entry); 185 } | 188 m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry, 189 link_latency, bw_multiplier); |
186} 187 | 190} 191 |
188void SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num) | 192void 193SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num) |
189{ | 194{ |
190 ASSERT(id < m_nodes); 191 ASSERT(network_num < m_virtual_networks); | 195 ASSERT(id < m_nodes); 196 ASSERT(network_num < m_virtual_networks); |
192 | 197 |
193 if (ordered) { 194 m_ordered[network_num] = true; 195 } 196 m_in_use[network_num] = true; | 198 if (ordered) { 199 m_ordered[network_num] = true; 200 } 201 m_in_use[network_num] = true; |
197} 198 | 202} 203 |
199MessageBuffer* SimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num) | 204MessageBuffer* 205SimpleNetwork::getToNetQueue(NodeID id, bool ordered, int network_num) |
200{ | 206{ |
201 checkNetworkAllocation(id, ordered, network_num); 202 return m_toNetQueues[id][network_num]; | 207 checkNetworkAllocation(id, ordered, network_num); 208 return m_toNetQueues[id][network_num]; |
203} 204 | 209} 210 |
205MessageBuffer* SimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num) | 211MessageBuffer* 212SimpleNetwork::getFromNetQueue(NodeID id, bool ordered, int network_num) |
206{ | 213{ |
207 checkNetworkAllocation(id, ordered, network_num); 208 return m_fromNetQueues[id][network_num]; | 214 checkNetworkAllocation(id, ordered, network_num); 215 return m_fromNetQueues[id][network_num]; |
209} 210 | 216} 217 |
211const Vector<Throttle*>* SimpleNetwork::getThrottles(NodeID id) const | 218const Vector 219SimpleNetwork::getThrottles(NodeID id) const |
212{ | 220{ |
213 assert(id >= 0); 214 assert(id < m_nodes); 215 assert(m_endpoint_switches[id] != NULL); 216 return m_endpoint_switches[id]->getThrottles(); | 221 assert(id >= 0); 222 assert(id < m_nodes); 223 assert(m_endpoint_switches[id] != NULL); 224 return m_endpoint_switches[id]->getThrottles(); |
217} 218 | 225} 226 |
219void SimpleNetwork::printStats(ostream& out) const | 227void 228SimpleNetwork::printStats(ostream& out) const |
220{ | 229{ |
221 out << endl; 222 out << "Network Stats" << endl; 223 out << "-------------" << endl; 224 out << endl; 225 for(int i=0; i<m_switch_ptr_vector.size(); i++) { 226 m_switch_ptr_vector[i]->printStats(out); 227 } 228 m_topology_ptr->printStats(out); | 230 out << endl; 231 out << "Network Stats" << endl; 232 out << "-------------" << endl; 233 out << endl; 234 for (int i = 0; i < m_switch_ptr_vector.size(); i++) { 235 m_switch_ptr_vector[i]->printStats(out); 236 } 237 m_topology_ptr->printStats(out); |
229} 230 | 238} 239 |
231void SimpleNetwork::clearStats() | 240void 241SimpleNetwork::clearStats() |
232{ | 242{ |
233 for(int i=0; i<m_switch_ptr_vector.size(); i++) { 234 m_switch_ptr_vector[i]->clearStats(); 235 } 236 m_topology_ptr->clearStats(); | 243 for (int i = 0; i < m_switch_ptr_vector.size(); i++) { 244 m_switch_ptr_vector[i]->clearStats(); 245 } 246 m_topology_ptr->clearStats(); |
237} 238 | 247} 248 |
239void SimpleNetwork::printConfig(ostream& out) const | 249void 250SimpleNetwork::printConfig(ostream& out) const |
240{ | 251{ |
241 out << endl; 242 out << "Network Configuration" << endl; 243 out << "---------------------" << endl; 244 out << "network: SIMPLE_NETWORK" << endl; 245 out << "topology: " << m_topology_ptr->getName() << endl; 246 out << endl; | 252 out << endl; 253 out << "Network Configuration" << endl; 254 out << "---------------------" << endl; 255 out << "network: SIMPLE_NETWORK" << endl; 256 out << "topology: " << m_topology_ptr->getName() << endl; 257 out << endl; |
247 | 258 |
248 for (int i = 0; i < m_virtual_networks; i++) { 249 out << "virtual_net_" << i << ": "; 250 if (m_in_use[i]) { 251 out << "active, "; 252 if (m_ordered[i]) { 253 out << "ordered" << endl; 254 } else { 255 out << "unordered" << endl; 256 } 257 } else { 258 out << "inactive" << endl; | 259 for (int i = 0; i < m_virtual_networks; i++) { 260 out << "virtual_net_" << i << ": "; 261 if (m_in_use[i]) { 262 out << "active, "; 263 if (m_ordered[i]) { 264 out << "ordered" << endl; 265 } else { 266 out << "unordered" << endl; 267 } 268 } else { 269 out << "inactive" << endl; 270 } |
259 } | 271 } |
260 } 261 out << endl; 262 for(int i=0; i<m_switch_ptr_vector.size(); i++) { 263 m_switch_ptr_vector[i]->printConfig(out); 264 } | 272 out << endl; |
265 | 273 |
266 m_topology_ptr->printConfig(out); | 274 for(int i = 0; i < m_switch_ptr_vector.size(); i++) { 275 m_switch_ptr_vector[i]->printConfig(out); 276 } 277 278 m_topology_ptr->printConfig(out); |
267} 268 | 279} 280 |
269void SimpleNetwork::print(ostream& out) const | 281void 282SimpleNetwork::print(ostream& out) const |
270{ | 283{ |
271 out << "[SimpleNetwork]"; | 284 out << "[SimpleNetwork]"; |
272} 273 274 275SimpleNetwork * 276SimpleNetworkParams::create() 277{ 278 return new SimpleNetwork(this); 279} | 285} 286 287 288SimpleNetwork * 289SimpleNetworkParams::create() 290{ 291 return new SimpleNetwork(this); 292} |