Go to the documentation of this file.
45 #include "debug/ProtocolTest.hh"
52 _requestorId(
p.
system->getRequestorId(this)),
53 numCpuPorts(
p.port_cpu_ports_connection_count),
54 numDmaPorts(
p.port_dma_ports_connection_count),
55 numVectorPorts(
p.port_cu_vector_ports_connection_count),
56 numSqcPorts(
p.port_cu_sqc_ports_connection_count),
57 numScalarPorts(
p.port_cu_scalar_ports_connection_count),
58 numTokenPorts(
p.port_cu_token_ports_connection_count),
59 numCusPerSqc(
p.cus_per_sqc),
60 numCusPerScalar(
p.cus_per_scalar),
61 numWfsPerCu(
p.wavefronts_per_cu),
62 numWisPerWf(
p.workitems_per_wavefront),
63 numCuTokens(
p.max_cu_tokens),
64 numAtomicLocs(
p.num_atomic_locations),
65 numNormalLocsPerAtomic(
p.num_normal_locs_per_atomic),
66 episodeLength(
p.episode_length),
67 maxNumEpisodes(
p.max_num_episodes),
68 debugTester(
p.debug_tester),
69 cpuThreads(
p.cpu_threads),
70 dmaThreads(
p.dma_threads),
81 DPRINTF(ProtocolTest,
"Creating %s\n",
90 DPRINTF(ProtocolTest,
"Creating %s\n",
99 DPRINTF(ProtocolTest,
"Creating %s\n",
108 DPRINTF(ProtocolTest,
"Creating %s\n",
117 DPRINTF(ProtocolTest,
"Creating %s\n",
139 warn(
"Data race check is not enabled\n");
144 if (
p.random_seed != 0) {
145 srand(
p.random_seed);
157 std::stringstream
ss;
158 ss <<
"GPU Ruby test's configurations" << std::endl
159 <<
"\tNumber of CPUs: " <<
numCpus << std::endl
160 <<
"\tNumber of DMAs: " <<
numDmas << std::endl
161 <<
"\tNumber of CUs: " <<
numCus << std::endl
162 <<
"\tNumber of wavefronts per CU: " <<
numWfsPerCu << std::endl
163 <<
"\tWavefront size: " <<
numWisPerWf << std::endl
164 <<
"\tNumber of atomic locations: " <<
numAtomicLocs << std::endl
165 <<
"\tNumber of non-atomic locations: "
170 <<
"\tRandom seed: " <<
p.random_seed
198 DPRINTF(ProtocolTest,
"Attach threads to ports\n");
201 for (
int cpu_id = 0; cpu_id <
numCpus; ++cpu_id) {
202 cpuThreads[cpu_id]->attachTesterThreadToPorts(
this,
205 cpuThreads[cpu_id]->scheduleDeadlockCheckEvent();
209 for (
int dma_id = 0; dma_id <
numDmas; ++dma_id) {
210 dmaThreads[dma_id]->attachTesterThreadToPorts(
this,
213 dmaThreads[dma_id]->scheduleDeadlockCheckEvent();
218 int vectorPortId = 0;
220 int scalarPortId = 0;
222 for (
int cu_id = 0; cu_id <
numCus; ++cu_id) {
223 vectorPortId = cu_id;
229 wfs[wfId]->attachTesterThreadToPorts(
this,
234 wfs[wfId]->scheduleWakeup();
235 wfs[wfId]->scheduleDeadlockCheckEvent();
243 if (if_name !=
"cpu_ports" && if_name !=
"dma_ports" &&
244 if_name !=
"cu_vector_ports" && if_name !=
"cu_sqc_ports" &&
245 if_name !=
"cu_scalar_ports" && if_name !=
"cu_token_ports") {
249 if (if_name ==
"cpu_ports") {
251 panic(
"ProtocolTester: unknown cpu port %d\n", idx);
253 }
else if (if_name ==
"dma_ports") {
255 panic(
"ProtocolTester: unknown dma port %d\n", idx);
257 }
else if (if_name ==
"cu_vector_ports") {
259 panic(
"ProtocolTester: unknown cu vect port %d\n", idx);
261 }
else if (if_name ==
"cu_sqc_ports") {
263 panic(
"ProtocolTester: unknown cu sqc port %d\n", idx);
265 }
else if (if_name ==
"cu_token_ports") {
267 panic(
"ProtocolTester: unknown cu token port %d\n", idx);
270 assert(if_name ==
"cu_scalar_ports");
272 panic(
"ProtocolTester: unknown cu scal port %d\n", idx);
302 if (!th->checkDRF(atomic_loc, loc, isStore))
307 if (!th->checkDRF(atomic_loc, loc, isStore))
312 if (!th->checkDRF(atomic_loc, loc, isStore))
326 t->printAllOutstandingReqs(
ss);
330 t->printAllOutstandingReqs(
ss);
334 t->printAllOutstandingReqs(
ss);
344 panic(
"GPU Ruby Tester: Failed!\n");
353 safe_cast<ProtocolTester::SenderState*>(pkt->
senderState);
std::vector< RequestPort * > cuSqcPorts
bool checkDRF(Location atomic_loc, Location loc, bool isStore) const
OutputStream * create(const std::string &name, bool binary=false, bool no_gz=false)
Creates a file in this directory (optionally compressed).
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
std::vector< CpuThread * > cpuThreads
std::vector< RequestPort * > cuScalarPorts
std::vector< GMTokenPort * > cuTokenPorts
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
virtual bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the peer.
AddressManager * addrManager
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
std::ostream * stream() const
Get the output underlying output stream.
Ports are used to interface objects to each other.
std::vector< TokenManager * > cuTokenManagers
AddressManager::Location Location
void close(OutputStream *file)
Closes an output file and free the corresponding OutputFile.
void exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, bool serialize)
Schedule an event to exit the simulation loop (returning to Python) at the end of the current cycle (...
std::vector< GpuWavefront * > wfs
virtual void hitCallback(PacketPtr pkt)=0
virtual const std::string name() const
ProtocolTester(const Params &p)
void dumpErrorLog(std::stringstream &ss)
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
ProtocolTesterParams Params
void ccprintf(cp::Print &print)
int numNormalLocsPerAtomic
std::vector< RequestPort * > dmaPorts
SenderState * senderState
This packet's sender state.
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
std::vector< RequestPort * > cpuPorts
std::string csprintf(const char *format, const Args &...args)
std::vector< DmaThread * > dmaThreads
std::vector< RequestPort * > cuVectorPorts
#define panic(...)
This implements a cprintf based panic() function.
Generated on Tue Mar 23 2021 19:41:25 for gem5 by doxygen 1.8.17