gem5-users@gem5.org

The gem5 Users mailing list

View all threads

Why there is miss prediction of non-control instructions

AR
Atul Rahman
Mon, Oct 21, 2024 12:41 PM

Hello,
In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen from commit and decode even if mispredictInst->isControl() is false.

// Check squash signals from commit.
    if (fromCommit->commitInfo[tid].squash) {

        DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash "
                "from commit.\n",tid);
        // In any case, squash.
        squash(*fromCommit->commitInfo[tid].pc,
               fromCommit->commitInfo[tid].doneSeqNum,
               fromCommit->commitInfo[tid].squashInst, tid);

        // If it was a branch mispredict on a control instruction, update the
        // branch predictor with that instruction, otherwise just kill the
        // invalid state we generated in after sequence number
        if (fromCommit->commitInfo[tid].mispredictInst &&
            fromCommit->commitInfo[tid].mispredictInst->isControl()) {
            branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                    *fromCommit->commitInfo[tid].pc,
                    fromCommit->commitInfo[tid].branchTaken, tid);
        } **else {
            branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                              tid);
        }**

        return true;
    }

Can someone please explain when would this else condition be true? How can there be miss prediction of non-control instructions?

Hello, In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen from commit and decode even if mispredictInst->isControl() is false. ``` // Check squash signals from commit. if (fromCommit->commitInfo[tid].squash) { DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash " "from commit.\n",tid); // In any case, squash. squash(*fromCommit->commitInfo[tid].pc, fromCommit->commitInfo[tid].doneSeqNum, fromCommit->commitInfo[tid].squashInst, tid); // If it was a branch mispredict on a control instruction, update the // branch predictor with that instruction, otherwise just kill the // invalid state we generated in after sequence number if (fromCommit->commitInfo[tid].mispredictInst && fromCommit->commitInfo[tid].mispredictInst->isControl()) { branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, *fromCommit->commitInfo[tid].pc, fromCommit->commitInfo[tid].branchTaken, tid); } **else { branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, tid); }** return true; } ``` Can someone please explain when would this else condition be true? How can there be miss prediction of non-control instructions?
EM
Eliot Moss
Mon, Oct 21, 2024 12:54 PM

On 10/21/2024 8:41 AM, Atul Rahman via gem5-users wrote:

Hello,
In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen
from commit and decode even if mispredictInst->isControl() is false.

// Check squash signals from commit.
     if (fromCommit->commitInfo[tid].squash) {

         DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash "
                 "from commit.\n",tid);
         // In any case, squash.
         squash(*fromCommit->commitInfo[tid].pc,
                fromCommit->commitInfo[tid].doneSeqNum,
                fromCommit->commitInfo[tid].squashInst, tid);

         // If it was a branch mispredict on a control instruction, update the
         // branch predictor with that instruction, otherwise just kill the
         // invalid state we generated in after sequence number
         if (fromCommit->commitInfo[tid].mispredictInst &&
             fromCommit->commitInfo[tid].mispredictInst->isControl()) {
             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                     *fromCommit->commitInfo[tid].pc,
                     fromCommit->commitInfo[tid].branchTaken, tid);
         } **else {
             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                               tid);
         }**

         return true;
     }

Can someone please explain when would this else condition be true? How can there be miss prediction of non-control
instructions?

I am thinking that these are non-control instructions that are on the mispredicted path.
They also need to be squashed.  If that's not it, then possibly instructions like CMOV
(conditional move) that might be (mis)predicted even though they do not affect control
flow.  Not sure if there might be other cases ...

Eliot Moss

On 10/21/2024 8:41 AM, Atul Rahman via gem5-users wrote: > Hello, > In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen > from commit and decode even if mispredictInst->isControl() is false. > ``` > // Check squash signals from commit. >     if (fromCommit->commitInfo[tid].squash) { > >         DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash " >                 "from commit.\n",tid); >         // In any case, squash. >         squash(*fromCommit->commitInfo[tid].pc, >                fromCommit->commitInfo[tid].doneSeqNum, >                fromCommit->commitInfo[tid].squashInst, tid); > >         // If it was a branch mispredict on a control instruction, update the >         // branch predictor with that instruction, otherwise just kill the >         // invalid state we generated in after sequence number >         if (fromCommit->commitInfo[tid].mispredictInst && >             fromCommit->commitInfo[tid].mispredictInst->isControl()) { >             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, >                     *fromCommit->commitInfo[tid].pc, >                     fromCommit->commitInfo[tid].branchTaken, tid); >         } **else { >             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, >                               tid); >         }** > >         return true; >     } > ``` > Can someone please explain when would this else condition be true? How can there be miss prediction of non-control > instructions? I am thinking that these are non-control instructions that are on the mispredicted path. They also need to be squashed. If that's not it, then possibly instructions like CMOV (conditional move) that might be (mis)predicted even though they do not affect control flow. Not sure if there might be other cases ... Eliot Moss
YY
Yuan Yao
Tue, Oct 22, 2024 2:11 PM

Yes, because not all the squashes are caused by control instructions.

Another source of squash is memory violations
(IEW::SquanshDueToMemOrder).

There, the squash bit toCommit->squash is set, but
toCommit->mispredictInst is set to NULL.

Thus, when the reason for the squash is later checked in Commit::commit() and then in
Fetch::checkSignalsAndUpdate, the if(fromIEW->mispredictInst[tid]) branch is not executed.

The branchPred->squash() function in the else-part is to delete all the branch
predictor states that has been made after the squash instruction
(BPredUnit::Squash).

Hope this helps.

Eliot Moss via gem5-users @ 2024-10-21 14:54 :

On 10/21/2024 8:41 AM, Atul Rahman via gem5-users wrote:

Hello,
In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen
from commit and decode even if mispredictInst->isControl() is false.

// Check squash signals from commit.
     if (fromCommit->commitInfo[tid].squash) {

         DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash "
                 "from commit.\n",tid);
         // In any case, squash.
         squash(*fromCommit->commitInfo[tid].pc,
                fromCommit->commitInfo[tid].doneSeqNum,
                fromCommit->commitInfo[tid].squashInst, tid);

         // If it was a branch mispredict on a control instruction, update the
         // branch predictor with that instruction, otherwise just kill the
         // invalid state we generated in after sequence number
         if (fromCommit->commitInfo[tid].mispredictInst &&
             fromCommit->commitInfo[tid].mispredictInst->isControl()) {
             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                     *fromCommit->commitInfo[tid].pc,
                     fromCommit->commitInfo[tid].branchTaken, tid);
         } **else {
             branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum,
                               tid);
         }**

         return true;
     }

Can someone please explain when would this else condition be true? How can there be miss prediction of non-control
instructions?

I am thinking that these are non-control instructions that are on the mispredicted path.
They also need to be squashed.  If that's not it, then possibly instructions like CMOV
(conditional move) that might be (mis)predicted even though they do not affect control
flow.  Not sure if there might be other cases ...

Eliot Moss


gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-leave@gem5.org

--
Best regards,
Yuan Yao

När du har kontakt med oss på Uppsala universitet med e-post så innebär det att vi behandlar dina personuppgifter. För att läsa mer om hur vi gör det kan du läsa här: http://www.uu.se/om-uu/dataskydd-personuppgifter/

E-mailing Uppsala University means that we will process your personal data. For more information on how this is performed, please read here: http://www.uu.se/en/about-uu/data-protection-policy

Yes, because not all the squashes are caused by control instructions. Another source of squash is memory violations (IEW::SquanshDueToMemOrder). There, the squash bit toCommit->squash is set, but toCommit->mispredictInst is set to NULL. Thus, when the reason for the squash is later checked in Commit::commit() and then in Fetch::checkSignalsAndUpdate, the if(fromIEW->mispredictInst[tid]) branch is not executed. The branchPred->squash() function in the else-part is to delete all the branch predictor states that has been made after the squash instruction (BPredUnit::Squash). Hope this helps. Eliot Moss via gem5-users @ 2024-10-21 14:54 : > On 10/21/2024 8:41 AM, Atul Rahman via gem5-users wrote: >> Hello, >> In function checkSignalsAndUpdate(ThreadID tid) in src/cpu/o3/fetch.cc file, it seems miss prediction can still happen >> from commit and decode even if mispredictInst->isControl() is false. >> ``` >> // Check squash signals from commit. >> if (fromCommit->commitInfo[tid].squash) { >> >> DPRINTF(Fetch, "[tid:%i] Squashing instructions due to squash " >> "from commit.\n",tid); >> // In any case, squash. >> squash(*fromCommit->commitInfo[tid].pc, >> fromCommit->commitInfo[tid].doneSeqNum, >> fromCommit->commitInfo[tid].squashInst, tid); >> >> // If it was a branch mispredict on a control instruction, update the >> // branch predictor with that instruction, otherwise just kill the >> // invalid state we generated in after sequence number >> if (fromCommit->commitInfo[tid].mispredictInst && >> fromCommit->commitInfo[tid].mispredictInst->isControl()) { >> branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, >> *fromCommit->commitInfo[tid].pc, >> fromCommit->commitInfo[tid].branchTaken, tid); >> } **else { >> branchPred->squash(fromCommit->commitInfo[tid].doneSeqNum, >> tid); >> }** >> >> return true; >> } >> ``` >> Can someone please explain when would this else condition be true? How can there be miss prediction of non-control >> instructions? > > I am thinking that these are non-control instructions that are on the mispredicted path. > They also need to be squashed. If that's not it, then possibly instructions like CMOV > (conditional move) that might be (mis)predicted even though they do not affect control > flow. Not sure if there might be other cases ... > > Eliot Moss > _______________________________________________ > gem5-users mailing list -- gem5-users@gem5.org > To unsubscribe send an email to gem5-users-leave@gem5.org -- Best regards, Yuan Yao När du har kontakt med oss på Uppsala universitet med e-post så innebär det att vi behandlar dina personuppgifter. För att läsa mer om hur vi gör det kan du läsa här: http://www.uu.se/om-uu/dataskydd-personuppgifter/ E-mailing Uppsala University means that we will process your personal data. For more information on how this is performed, please read here: http://www.uu.se/en/about-uu/data-protection-policy