Skip to content

Commit a9b55ac

Browse files
trbauerigcbot
authored andcommitted
vISA minor barrier refactor
Minor barrier refactor in vISA; minor refactor to report IGA issues from vISA Adds predication support to certain gateway messages.
1 parent 36f4bd1 commit a9b55ac

15 files changed

+215
-109
lines changed

visa/BinaryEncodingIGA.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ struct SendExDescOpts {
2929

3030
class BinaryEncodingIGA
3131
{
32-
int IGAInstId = 0;
33-
Mem_Manager& mem;
34-
G4_Kernel& kernel;
35-
std::string fileName;
36-
Kernel* IGAKernel = nullptr;
37-
const Model* platformModel;
32+
int IGAInstId = 0;
33+
Mem_Manager& mem;
34+
G4_Kernel& kernel;
35+
std::string fileName; // .dat filename
36+
Kernel* IGAKernel = nullptr;
37+
const Model* platformModel;
3838
const TARGET_PLATFORM platform;
3939
public:
4040
BinaryEncodingIGA(vISA::Mem_Manager &m, vISA::G4_Kernel& k, std::string fname);
@@ -975,7 +975,7 @@ void BinaryEncodingIGA::Encode()
975975
// for a single G4_INST, then it should be safe to
976976
// make pair between the G4_INST and first encoded
977977
// binary inst.
978-
encodedInsts.push_back(std::make_pair(igaInst, inst));
978+
encodedInsts.emplace_back(igaInst, inst);
979979
}
980980
}
981981

@@ -1003,7 +1003,7 @@ void BinaryEncodingIGA::Encode()
10031003
encoder.enableIGAAutoDeps();
10041004
}
10051005

1006-
encoder.encode();
1006+
encoder.encode(kernel.fg.builder->criticalMsgStream());
10071007

10081008
m_kernelBufferSize = encoder.getBinarySize();
10091009
m_kernelBuffer = allocCodeBlock(m_kernelBufferSize);
@@ -1131,7 +1131,8 @@ Instruction *BinaryEncodingIGA::translateInstruction(
11311131
}
11321132

11331133
igaInst->setID(IGAInstId++);
1134-
igaInst->setLoc(g4inst->getCISAOff()); // make IGA src off track CISA id
1134+
int visaOff = g4inst->getCISAOff();
1135+
igaInst->setLoc(visaOff); // make IGA src off track CISA id
11351136

11361137
if (opSpec->supportsDestination())
11371138
{
@@ -1402,7 +1403,6 @@ void BinaryEncodingIGA::translateInstructionSrcs(
14021403
} // for
14031404
}
14041405

1405-
14061406
SendDesc BinaryEncodingIGA::getIGASendDesc(G4_INST* sendInst) const
14071407
{
14081408
SendDesc desc;

visa/BuildIR.h

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,12 @@ class IR_Builder
13701370
G4_DstRegRegion* dst, G4_Operand* src0,
13711371
G4_InstOpts options,
13721372
bool appendToInstList);
1373+
G4_INST* createMov(
1374+
G4_Predicate *pred,
1375+
G4_ExecSize execSize,
1376+
G4_DstRegRegion* dst, G4_Operand* src0,
1377+
G4_InstOpts options,
1378+
bool appendToInstList);
13731379

13741380
G4_INST* createBinOp(
13751381
G4_opcode op, G4_ExecSize execSize,
@@ -2715,20 +2721,22 @@ class IR_Builder
27152721

27162722
///////////////////////////////////////////////////////////////////////////
27172723
///////////////////////////////////////////////////////////////////////////
2718-
// Raw send related members are in VisaToG4/TranslateSendSync.cpp
2724+
// Send sync related members are in VisaToG4/TranslateSendSync.cpp
27192725
G4_INST* translateLscFence(
2726+
G4_Predicate *pred,
27202727
SFID sfid,
27212728
LSC_FENCE_OP fenceOp,
27222729
LSC_SCOPE scope,
27232730
int& status);
27242731

27252732
G4_INST* translateLscFence(
2733+
G4_Predicate *pred,
27262734
SFID sfid,
27272735
LSC_FENCE_OP fenceOp,
27282736
LSC_SCOPE scope)
27292737
{
27302738
int status = VISA_SUCCESS;
2731-
return translateLscFence(sfid, fenceOp, scope, status);
2739+
return translateLscFence(pred, sfid, fenceOp, scope, status);
27322740
}
27332741
enum class NamedBarrierType
27342742
{
@@ -2737,29 +2745,44 @@ class IR_Builder
27372745
BOTH
27382746
};
27392747

2748+
////////////////////////////////////////////////////////////////////////
2749+
// default barrier functions
2750+
void generateSingleBarrier(G4_Predicate* prd);
2751+
void generateBarrierSend(G4_Predicate* prd);
2752+
void generateBarrierWait(G4_Predicate* prd);
2753+
int translateVISASplitBarrierInst(G4_Predicate* prd, bool isSignal);
2754+
2755+
////////////////////////////////////////////////////////////////////////
2756+
// named barrier functions
2757+
int translateVISANamedBarrierSignal(
2758+
G4_Predicate* prd, G4_Operand* barrierId, G4_Operand* threadCount);
2759+
int translateVISANamedBarrierWait(
2760+
G4_Predicate* prd, G4_Operand* barrierId);
27402761
void generateNamedBarrier(
2741-
int numProducer, int numConsumer, NamedBarrierType type, G4_Operand* barrierId);
2742-
2743-
void generateNamedBarrier(G4_Operand* barrierId, G4_SrcRegRegion* threadValue);
2744-
2745-
void generateSingleBarrier();
2762+
G4_Predicate* prd,
2763+
int numProducer, int numConsumer,
2764+
NamedBarrierType type, G4_Operand* barrierId);
2765+
void generateNamedBarrier(
2766+
G4_Predicate* prd, G4_Operand* barrierId, G4_SrcRegRegion* threadValue);
27462767

2747-
int translateVISANamedBarrierWait(G4_Operand* barrierId);
2748-
int translateVISANamedBarrierSignal(G4_Operand* barrierId, G4_Operand* threadCount);
2768+
////////////////////////////////////////////////////////////////////////
2769+
// fence etc
27492770

2750-
G4_INST* createFenceInstruction(
2771+
// this is the old fence op
2772+
// post-LSC platforms should use LSC fences
2773+
G4_INST* createFenceInstructionPreLSC(
2774+
G4_Predicate* prd,
27512775
uint8_t flushParam, bool commitEnable, bool globalMemFence, bool isSendc);
27522776

2753-
G4_INST* createSLMFence();
2777+
G4_INST* createSLMFence(G4_Predicate* prd);
27542778

2779+
////////////////////////////////////////////////////////////////////////
2780+
// other mem sync ops
27552781
int translateVISAWaitInst(G4_Operand* mask);
27562782

2757-
void generateBarrierSend();
2758-
void generateBarrierWait();
2759-
27602783
int translateVISASyncInst(ISA_Opcode opcode, unsigned int mask);
27612784

2762-
int translateVISASplitBarrierInst(bool isSignal);
2785+
27632786

27642787
///////////////////////////////////////////////////////////////////////////
27652788
///////////////////////////////////////////////////////////////////////////

visa/BuildIRImpl.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,18 +1642,26 @@ G4_INST* IR_Builder::createMov(
16421642
G4_ExecSize execSize,
16431643
G4_DstRegRegion* dst, G4_Operand* src0, G4_InstOpts options,
16441644
bool appendToInstList)
1645+
{
1646+
return createMov(nullptr, execSize, dst, src0, options, appendToInstList);
1647+
}
1648+
G4_INST* IR_Builder::createMov(
1649+
G4_Predicate *pred,
1650+
G4_ExecSize execSize,
1651+
G4_DstRegRegion* dst, G4_Operand* src0, G4_InstOpts options,
1652+
bool appendToInstList)
16451653
{
16461654
G4_INST* newInst = nullptr;
16471655
if (appendToInstList)
16481656
{
16491657
newInst = createInst(
1650-
nullptr, G4_mov, nullptr, g4::NOSAT, execSize,
1658+
pred, G4_mov, nullptr, g4::NOSAT, execSize,
16511659
dst, src0, nullptr, options, true);
16521660
}
16531661
else
16541662
{
16551663
newInst = createInternalInst(
1656-
nullptr, G4_mov, nullptr, g4::NOSAT, execSize,
1664+
pred, G4_mov, nullptr, g4::NOSAT, execSize,
16571665
dst, src0, nullptr, options);
16581666
}
16591667
return newInst;

visa/FlowGraph.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,7 @@ void FlowGraph::handleWait()
11591159
}
11601160
if (!sunk)
11611161
{
1162-
auto fenceInst = builder->createSLMFence();
1162+
auto fenceInst = builder->createSLMFence(nullptr);
11631163
auto sendInst = fenceInst->asSendInst();
11641164
if (sendInst != NULL)
11651165
{

visa/G4_BB.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,11 +1439,13 @@ INST_LIST_ITER G4_BB::getFirstInsertPos()
14391439
return II;
14401440
}
14411441

1442+
14421443
//
14431444
// Add an EOT send to the end of this BB.
14441445
//
14451446
void G4_BB::addEOTSend(G4_INST* lastInst)
14461447
{
1448+
14471449
// mov (8) r1.0<1>:ud r0.0<8;8,1>:ud {NoMask}
14481450
// send (8) null r1 0x27 desc
14491451
IR_Builder* builder = parent->builder;

visa/G4_IR.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,9 @@ typedef struct _SWSBInfo
843843
void setEvenlySplitInst(bool val) { evenlySplitInst = val; }
844844
bool getEvenlySplitInst() { return evenlySplitInst; }
845845

846-
void setCISAOff(int offset) { srcCISAoff = offset; }
846+
void setCISAOff(int offset) {
847+
srcCISAoff = offset;
848+
}
847849
int getCISAOff() const { return srcCISAoff; }
848850
bool isCISAOffValid() const { return getCISAOff() != UndefinedCisaOffset; }
849851

visa/G4_SendDescs.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ std::string vISA::ToSymbol(MsgOp op)
5353
case MsgOp::ATOMIC_AND: return "atomic_and";
5454
case MsgOp::ATOMIC_XOR: return "atomic_xor";
5555
case MsgOp::ATOMIC_OR: return "atomic_or";
56+
case MsgOp::EOT: return "eot";
57+
case MsgOp::FENCE: return "fence";
58+
case MsgOp::BARRIER: return "barrier";
59+
case MsgOp::NBARRIER: return "named_barrier";
5660
default:
5761
break;
5862
}
@@ -107,6 +111,8 @@ MsgOp vISA::ConvertLSCOpToMsgOp(LSC_OP op) {
107111
return MsgOp::ATOMIC_XOR;
108112
case LSC_OP::LSC_ATOMIC_OR:
109113
return MsgOp::ATOMIC_OR;
114+
case LSC_OP::LSC_FENCE:
115+
return MsgOp::FENCE;
110116
default:
111117
return MsgOp::INVALID;
112118
}
@@ -140,6 +146,12 @@ uint32_t vISA::GetMsgOpEncoding(MsgOp m) {
140146
case MsgOp::ATOMIC_AND: return 24;
141147
case MsgOp::ATOMIC_XOR: return 25;
142148
case MsgOp::ATOMIC_OR: return 26;
149+
case MsgOp::READ_STATE_INFO: return 30;
150+
case MsgOp::FENCE: return 31;
151+
//
152+
case MsgOp::EOT: return 0x0;
153+
case MsgOp::BARRIER: return 0x4;
154+
case MsgOp::NBARRIER: return 0x5;
143155
// TODO: other ops
144156
default: MUST_BE_TRUE(false, "Invalid msg op");
145157
}

visa/G4_SendDescs.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,14 @@ enum class MsgOp {
7474
ATOMIC_XOR,
7575
ATOMIC_OR,
7676
// others ...
77-
READ_STATE_INFO
77+
READ_STATE_INFO,
78+
//
79+
FENCE,
80+
//
81+
// gateway operations
82+
BARRIER,
83+
NBARRIER,
84+
EOT,
7885
};
7986
std::string ToSymbol(MsgOp);
8087
uint32_t GetMsgOpEncoding(MsgOp);

visa/G4_Verifier.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,9 @@ void G4Verifier::verifyOpnd(G4_Operand* opnd, G4_INST* inst)
409409
std::cerr << " in instruction:\n ";
410410
inst->emit(std::cerr);
411411
std::cerr << "\n";
412+
std::cerr << " operand: ";
413+
opnd->emit(std::cerr);
414+
std::cerr << "\n";
412415

413416
if (opnd->getInst() == NULL)
414417
{

visa/HWConformity.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5213,6 +5213,8 @@ void HWConformity::fixSendInst(G4_BB* bb)
52135213
// they satisfy EOT and preemption restrictions
52145214
auto needsTempSrc = [this](G4_INST* inst, G4_Declare* dcl)
52155215
{
5216+
if (dcl == nullptr) // %null is okay
5217+
return false;
52165218
return dcl->getRegVar() && dcl->getRegVar()->getPhyReg() &&
52175219
((inst->isEOT() && builder.hasEOTGRFBinding() &&
52185220
dcl->getRegVar()->getPhyReg()->asGreg()->getRegNum() < 112) ||

visa/Optimizer.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9353,12 +9353,14 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
93539353
G4_INST* fenceInst = nullptr;
93549354
if (builder.getPlatform() == Xe_PVCXT)
93559355
{
9356-
fenceInst = builder.translateLscFence(SFID::UGM, LSC_FENCE_OP_NONE, LSC_SCOPE_TILE);
9356+
fenceInst = builder.translateLscFence(
9357+
nullptr, SFID::UGM, LSC_FENCE_OP_NONE, LSC_SCOPE_TILE);
93579358
}
93589359
else
93599360
{
93609361
// use fence.ugm.6.tile. 6 is reserved and is the same as none.
9361-
fenceInst = builder.translateLscFence(SFID::UGM, LSC_FENCE_OP_TYPE6, LSC_SCOPE_TILE);
9362+
fenceInst = builder.translateLscFence(
9363+
nullptr, SFID::UGM, LSC_FENCE_OP_TYPE6, LSC_SCOPE_TILE);
93629364
}
93639365
bb->insertBefore(iter, fenceInst);
93649366
}
@@ -9370,19 +9372,22 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
93709372
{
93719373
if (hasTypedWrites)
93729374
{
9373-
auto fenceInst = builder.translateLscFence(SFID::TGM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
9375+
auto fenceInst = builder.translateLscFence(
9376+
nullptr, SFID::TGM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
93749377
bb->insertBefore(iter, fenceInst);
93759378
}
93769379
// If needLSCFence is true, the fence has been added already, skip the following.
93779380
if (hasUAVWrites && !needLscUgmFence)
93789381
{
9379-
auto fenceInst = builder.translateLscFence(SFID::UGM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
9382+
auto fenceInst = builder.translateLscFence(
9383+
nullptr, SFID::UGM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
93809384
bb->insertBefore(iter, fenceInst);
93819385
}
93829386
if (hasSLMWrites && !hasUAVWrites)
93839387
{
93849388
// UGM fence takes of SLM fence as well
9385-
auto fenceInst = builder.translateLscFence(SFID::SLM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
9389+
auto fenceInst = builder.translateLscFence(
9390+
nullptr, SFID::SLM, LSC_FENCE_OP_NONE, LSC_SCOPE_LOCAL);
93869391
bb->insertBefore(iter, fenceInst);
93879392
}
93889393
}
@@ -9395,12 +9400,14 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
93959400
}
93969401
if (hasUAVWrites || hasTypedWrites)
93979402
{
9398-
auto fenceInst = builder.createFenceInstruction(0, true, true, false);
9403+
auto fenceInst = builder.createFenceInstructionPreLSC(
9404+
nullptr, 0, true, true, false);
93999405
bb->insertBefore(iter, fenceInst);
94009406
}
94019407
if (hasSLMWrites)
94029408
{
9403-
auto fenceInst = builder.createFenceInstruction(0, true, false, false);
9409+
auto fenceInst = builder.createFenceInstructionPreLSC(
9410+
nullptr, 0, true, false, false);
94049411
bb->insertBefore(iter, fenceInst);
94059412
}
94069413
}
@@ -9431,10 +9438,10 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
94319438
auto iter = std::find_if(entryBB->begin(), entryBB->end(), [](G4_INST* inst) { return !inst->isLabel(); });
94329439

94339440
builder.instList.clear();
9434-
builder.translateLscFence(SFID::UGM, LSC_FENCE_OP_EVICT, LSC_SCOPE_GPU);
9441+
builder.translateLscFence(nullptr, SFID::UGM, LSC_FENCE_OP_EVICT, LSC_SCOPE_GPU);
94359442
// according to architects the invalidate fence should not use backup mode
94369443
const_cast<Options*>(builder.getOptions())->setOption(vISA_LSCBackupMode, false);
9437-
builder.translateLscFence(SFID::UGM, LSC_FENCE_OP_INVALIDATE, LSC_SCOPE_GPU);
9444+
builder.translateLscFence(nullptr, SFID::UGM, LSC_FENCE_OP_INVALIDATE, LSC_SCOPE_GPU);
94389445
const_cast<Options*>(builder.getOptions())->setOption(vISA_LSCBackupMode, true);
94399446
entryBB->insert(iter, builder.instList.begin(), builder.instList.end());
94409447
builder.instList.clear();

visa/VISAKernelImpl.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4979,7 +4979,8 @@ int VISAKernelImpl::AppendVISASplitBarrierInst(bool isSignal)
49794979

49804980
if (IS_GEN_BOTH_PATH)
49814981
{
4982-
status = m_builder->translateVISASplitBarrierInst(isSignal);
4982+
status = m_builder->translateVISASplitBarrierInst(
4983+
nullptr, isSignal);
49834984
}
49844985

49854986
if (IS_VISA_BOTH_PATH)
@@ -8507,7 +8508,7 @@ VISA_BUILDER_API int VISAKernelImpl::AppendVISALscFence(
85078508

85088509
if (IS_GEN_BOTH_PATH) {
85098510
SFID sfid = LSC_SFID_To_SFID(lscSfid);
8510-
m_builder->translateLscFence(sfid, fenceOp, scope, status);
8511+
m_builder->translateLscFence(nullptr, sfid, fenceOp, scope, status);
85118512
}
85128513

85138514
if (IS_VISA_BOTH_PATH) {
@@ -8545,7 +8546,8 @@ VISA_BUILDER_API int VISAKernelImpl::AppendVISANamedBarrierWait(
85458546

85468547
if (IS_GEN_BOTH_PATH)
85478548
{
8548-
status = m_builder->translateVISANamedBarrierWait(barrierId->g4opnd);
8549+
status = m_builder->translateVISANamedBarrierWait(
8550+
nullptr, barrierId->g4opnd);
85498551
}
85508552

85518553
if (IS_VISA_BOTH_PATH)
@@ -8581,7 +8583,8 @@ VISA_BUILDER_API int VISAKernelImpl::AppendVISANamedBarrierSignal(
85818583

85828584
if (IS_GEN_BOTH_PATH)
85838585
{
8584-
status = m_builder->translateVISANamedBarrierSignal(barrierId->g4opnd, barrierCount->g4opnd);
8586+
status = m_builder->translateVISANamedBarrierSignal(
8587+
nullptr, barrierId->g4opnd, barrierCount->g4opnd);
85858588
}
85868589
if (IS_VISA_BOTH_PATH)
85878590
{

0 commit comments

Comments
 (0)