Skip to content

Commit 7a9cdcf

Browse files
committed
misc: Add param to target messages per second, bug fixes
Bug was with sending multiple values from one src to a dest. Fixed it to cap at number of rlTimeSlots in a connection window. Using the above concept, we can reach a target number of messages per second.
1 parent 398bd50 commit 7a9cdcf

File tree

4 files changed

+93
-6
lines changed

4 files changed

+93
-6
lines changed

configs/supernetwork/SRNoC.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,26 @@ def create_base_parser():
155155
"--maximum-values", type=int, default=0, help="Maximum values"
156156
)
157157
parser.add_argument(
158+
"--no-buffer",
159+
action="store_true",
160+
help="Use no buffer mode (default is buffered mode)",
161+
)
162+
163+
# Mutually exclusive group for value rate config
164+
group = parser.add_mutually_exclusive_group(required=False)
165+
group.add_argument(
158166
"--values-per-port-per-window",
159167
type=int,
160168
default=1,
161169
help="values per port per window",
162170
)
163-
parser.add_argument(
164-
"--no-buffer",
165-
action="store_true",
166-
help="Use no buffer mode (default is buffered mode)",
171+
group.add_argument(
172+
"--target-mps",
173+
type=float,
174+
default=-1.0,
175+
help="Target million packets per second",
167176
)
177+
168178
return parser
169179

170180

@@ -269,6 +279,7 @@ def main():
269279
crosspoint_setup_time=NetworkDelays.CROSSPOINT_SETUP_TIME.value,
270280
hold_time=NetworkDelays.CROSSPOINT_HOLD_TIME.value,
271281
values_per_port_per_window=args.values_per_port_per_window,
282+
target_mps=args.target_mps,
272283
clk_domain=SrcClockDomain(
273284
clock=frequency,
274285
voltage_domain=VoltageDomain(),

src/network/Layer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ class Layer(ClockedObject):
5959
)
6060
hold_time = Param.Float(-1, "Hold time in picoseconds")
6161
values_per_port_per_window = Param.Int(1, "Values per port per window")
62+
target_mps = Param.Float(
63+
-1, "Target million packets per second; -1 means not provided"
64+
)
6265

6366
cxx_exports = [
6467
PyBindMethod("setRandomTrafficMode"),

src/network/layer.cc

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ Layer::Layer(const LayerParams& params) :
6666
valuesDelivered(0),
6767
currentTimeSlotIndex(0),
6868
valuesPerPortPerWindow(params.values_per_port_per_window),
69+
targetMMPS(params.target_mps),
6970
isFinished(false),
7071
fileMode(false),
7172
shuffleEnabled(false),
@@ -187,6 +188,57 @@ Layer::computeTimingParameters()
187188
DPRINTF(Layer, "Connection window: %d ps\n",
188189
getConnectionWindow()
189190
);
191+
192+
if (targetMMPS >= 0) {
193+
double values_this_window =
194+
static_cast<double>(targetMMPS) * 1e6 *
195+
(static_cast<double>(getConnectionWindow()) / 1e12);
196+
197+
DPRINTF(Layer,
198+
"Values this window: %f\n",
199+
values_this_window
200+
);
201+
202+
// spread them evenly across ports, round *up*
203+
valuesPerPortPerWindow =
204+
std::ceil(values_this_window / static_cast<double>(size));
205+
206+
DPRINTF(Layer,
207+
"Value per port per window: %lu\n",
208+
valuesPerPortPerWindow
209+
);
210+
211+
// safety: never let it exceed the hard structural cap
212+
valuesPerPortPerWindow =
213+
std::min<uint64_t>(valuesPerPortPerWindow,
214+
maxValuesPerWindow * size);
215+
DPRINTF(Layer,
216+
"Target MMPS: %f\n",
217+
targetMMPS
218+
);
219+
DPRINTF(Layer,
220+
"Values per port per window: %lu\n",
221+
valuesPerPortPerWindow
222+
);
223+
if (valuesPerPortPerWindow == 0) {
224+
fatal("Layer %s: Target MMPS (%f) is too low!\n",
225+
name(), targetMMPS);
226+
}
227+
if (valuesPerPortPerWindow > (maxValuesPerWindow * size)) {
228+
warn("Layer %s: Target MMPS (%f) is too high!\n",
229+
name(), targetMMPS);
230+
warn("Layer %s: Setting values per port per \
231+
window to %lu\n",
232+
name(),(maxValuesPerWindow * size));
233+
}
234+
}
235+
236+
if (valuesPerPortPerWindow > maxValues) {
237+
fatal("Values per port per window (%lu) \
238+
exceeds max values (%lu)\n",
239+
name(), valuesPerPortPerWindow, maxValues);
240+
}
241+
190242
}
191243

192244
// Calculate the time slot based on network component delays
@@ -305,6 +357,14 @@ Layer::processValues(
305357
);
306358
break;
307359
}
360+
if (valuesPerPortPerWindow > rlTimeSlots) {
361+
warn("Layer %s: values per port per window (%lu) "
362+
"exceeds RL time slots (%lu)\n",
363+
name(), valuesPerPortPerWindow, rlTimeSlots);
364+
warn("Layer %s: setting values per port per window to %lu\n",
365+
name(), rlTimeSlots);
366+
valuesPerPortPerWindow = rlTimeSlots;
367+
}
308368
// Check if we've already reached the maximum values
309369
if (valuesDelivered >= maxValues && !infinite_mode) {
310370
break; // Exit the loop immediately if we've reached max values
@@ -449,7 +509,7 @@ Layer::processValues(
449509
uint64_t payload;
450510
used_payloads.reserve(valuesPerPortPerWindow);
451511
while (used_payloads.size() < valuesPerPortPerWindow) {
452-
uint64_t p = scheduler.generateRandomPayload(rlTimeSlots - 1);
512+
uint64_t p = scheduler.generateRandomPayload(rlTimeSlots);
453513
if (std::find(used_payloads.begin(),
454514
used_payloads.end(),
455515
p)
@@ -458,6 +518,18 @@ Layer::processValues(
458518
}
459519
}
460520

521+
// Sort the payloads in ascending order
522+
std::sort(used_payloads.begin(), used_payloads.end());
523+
524+
// print the payloads
525+
DPRINTF(Layer,
526+
"BufferedPort %lu: payloads for %lu: ",
527+
src_addr, value_dest
528+
);
529+
for (auto p : used_payloads) {
530+
DPRINTF(Layer, "%lu ", p);
531+
}
532+
461533
for (auto p : used_payloads) {
462534
// Calculate precise delivery time
463535
// within the connection window

src/network/layer.hh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ private:
7474
uint64_t currentTimeSlotIndex; // Current index for the time slot
7575
int maxValues; // Maximum number of values, -1 means no limit
7676
int valuesDelivered; // Number of value deliveries
77-
uint32_t valuesPerPortPerWindow; // Values per port per window
77+
int valuesPerPortPerWindow; // Values per port per window
78+
double targetMMPS; // Target million messages per second of the network
7879
int size; // Size of the network
7980
bool isFinished; // Flag to indicate if the layer has finished
8081
bool fileMode; // Flag to indicate if a file is used for scheduling

0 commit comments

Comments
 (0)