gpu-compute: Create CU's ports in the standard way

The CU would initialize its ports in getMasterPort(), which
is not desirable as getMasterPort() may be called several
times for the same port. This can lead to a fatal if the CU
expects to only create a single port of a given type, and may
lead to other issues where stat names are duplicated.

This change instantiates and initializes the CU's ports in the
CU constructor using the CU params.

The index field is also removed from the CU's ports because the
base class already has an ID field, which will be set to the
default value in the base class's constructor for scalar ports.

It doesn't make sense for scalar port's to take an index because
they are scalar, so we let the base class initialize the ID to
the invalid port ID.

Change-Id: Id18386f5f53800a6447d968380676d8fd9bac9df
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/32836
Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com>
Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Tony Gutierrez
2019-03-29 17:48:39 -04:00
committed by Anthony Gutierrez
parent a7530f798b
commit 94000aefe6
4 changed files with 99 additions and 126 deletions

View File

@@ -174,24 +174,24 @@ FetchUnit::initiateFetch(Wavefront *wavefront)
computeUnit.shader->gpuTc,
false, pkt->senderState);
if (computeUnit.sqcTLBPort->isStalled()) {
assert(computeUnit.sqcTLBPort->retries.size() > 0);
if (computeUnit.sqcTLBPort.isStalled()) {
assert(computeUnit.sqcTLBPort.retries.size() > 0);
DPRINTF(GPUTLB, "Failed to send TLB req for FETCH addr %#x\n",
vaddr);
computeUnit.sqcTLBPort->retries.push_back(pkt);
} else if (!computeUnit.sqcTLBPort->sendTimingReq(pkt)) {
computeUnit.sqcTLBPort.retries.push_back(pkt);
} else if (!computeUnit.sqcTLBPort.sendTimingReq(pkt)) {
// Stall the data port;
// No more packet is issued till
// ruby indicates resources are freed by
// a recvReqRetry() call back on this port.
computeUnit.sqcTLBPort->stallPort();
computeUnit.sqcTLBPort.stallPort();
DPRINTF(GPUTLB, "Failed to send TLB req for FETCH addr %#x\n",
vaddr);
computeUnit.sqcTLBPort->retries.push_back(pkt);
computeUnit.sqcTLBPort.retries.push_back(pkt);
} else {
DPRINTF(GPUTLB, "sent FETCH translation request for %#x\n", vaddr);
}
@@ -200,7 +200,7 @@ FetchUnit::initiateFetch(Wavefront *wavefront)
new TheISA::GpuTLB::TranslationState(BaseTLB::Execute,
computeUnit.shader->gpuTc);
computeUnit.sqcTLBPort->sendFunctional(pkt);
computeUnit.sqcTLBPort.sendFunctional(pkt);
TheISA::GpuTLB::TranslationState *sender_state =
safe_cast<TheISA::GpuTLB::TranslationState*>(pkt->senderState);
@@ -257,8 +257,8 @@ FetchUnit::fetch(PacketPtr pkt, Wavefront *wavefront)
if (timingSim) {
// translation is done. Send the appropriate timing memory request.
if (!computeUnit.sqcPort->sendTimingReq(pkt)) {
computeUnit.sqcPort->retries.push_back(std::make_pair(pkt,
if (!computeUnit.sqcPort.sendTimingReq(pkt)) {
computeUnit.sqcPort.retries.push_back(std::make_pair(pkt,
wavefront));
DPRINTF(GPUPort, "CU%d: WF[%d][%d]: Fetch addr %#x failed!\n",
@@ -270,7 +270,7 @@ FetchUnit::fetch(PacketPtr pkt, Wavefront *wavefront)
pkt->req->getPaddr());
}
} else {
computeUnit.sqcPort->sendFunctional(pkt);
computeUnit.sqcPort.sendFunctional(pkt);
processFetchReturn(pkt);
}
}