Thanks Hongxia and Greg for the replies.
Hongxia, I still want to confirm one thing.
An example L1 controller has this:-
machine(L1Cache, "MSI Directory L1 Cache CMP") {
// NODE L1 CACHE
// From this node's L1 cache TO the network
// a local L1 -> this L2 bank, currently ordered with directory
forwarded requests
MessageBuffer requestFromL1Cache, network="To", virtual_network="1",
ordered="false";
// a local L1 -> this L2 bank
MessageBuffer responseFromL1Cache, network="To",
virtual_network="3", ordered="false";
MessageBuffer unblockFromL1Cache, network="To", virtual_network="4",
ordered="false";
MessageBuffer messageToPrivateL2, network="To", virtual_network="0",
ordered="true";
MessageBuffer messageFromPrivateL2, network="From",
virtual_network="0", ordered="true";
MessageBuffer requestToL1Cache, network="From", virtual_network="2",
ordered="false";
// a L2 bank -> this L1
MessageBuffer responseToL1Cache, network="From",
virtual_network="3", ordered="false";
I guess here, a virtual net is assigned to message buffers like
requestFromL1Cache assigned virtual_network="1".
Now the PerfectSwitch::wakeup() is written such that it picks a message
from a particular "vnet" of an incoming link and then finds the outlink
and forwards the message into the same vnet of the outlink.
I hope, this is how protocol level deadlocks are avoided. Please confirm
this.
One more question I have. How is it determined, which message buffers
should be ordered and which ones unordered?
Thanks for your answers,
Niket.
|