Skip to content

Commit 93058a1

Browse files
gkluczekgfxbot
authored andcommitted
WorkgroupWalkOrder
Change-Id: I923d2eb87804606ac85dfc1345410cb6340bce64
1 parent f4c49be commit 93058a1

File tree

11 files changed

+680
-5
lines changed

11 files changed

+680
-5
lines changed

IGC/AdaptorOCL/OCL/KernelAnnotations.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ struct ExecutionEnivronment
292292
bool CompiledForGreaterThan4GBBuffers = false;
293293
DWORD FixedWorkgroupSize[3];
294294
DWORD NumGRFRequired;
295+
DWORD WorkgroupWalkOrder[3] = { 3, 3, 3 };
295296
};
296297

297298
struct KernelTypeProgramBinaryInfo

IGC/AdaptorOCL/OCL/sp/sp_g8.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,6 +1925,11 @@ RETVAL CGen8OpenCLStateProcessor::CreatePatchList(
19251925
patch.RequiredWorkGroupSizeZ = annotations.m_executionEnivronment.FixedWorkgroupSize[2];
19261926
}
19271927

1928+
patch.WorkgroupWalkOrderDims = 0;
1929+
patch.WorkgroupWalkOrderDims |= annotations.m_executionEnivronment.WorkgroupWalkOrder[0];
1930+
patch.WorkgroupWalkOrderDims |= annotations.m_executionEnivronment.WorkgroupWalkOrder[1] << 2;
1931+
patch.WorkgroupWalkOrderDims |= annotations.m_executionEnivronment.WorkgroupWalkOrder[2] << 4;
1932+
19281933
patch.CompiledSIMD32 = ( annotations.m_executionEnivronment.CompiledSIMDSize == 32 );
19291934
patch.CompiledSIMD16 = ( annotations.m_executionEnivronment.CompiledSIMDSize == 16 );
19301935
patch.CompiledSIMD8 = ( annotations.m_executionEnivronment.CompiledSIMDSize == 8 );

IGC/AdaptorOCL/ocl_igc_shared/executable_format/patch_list.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Abstract: Contains common patch structure definitions
3434
namespace iOpenCL
3535
{
3636

37-
const uint32_t CURRENT_ICBE_VERSION = 1053;
37+
const uint32_t CURRENT_ICBE_VERSION = 1054;
3838

3939
const uint32_t MAGIC_CL = 0x494E5443; // 'I', 'N', 'T', 'C'
4040
const uint32_t INVALID_INDEX = 0xFFFFFFFF;

IGC/AdaptorOCL/ocl_igc_shared/executable_format/patch_shared.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,11 @@ struct SPatchExecutionEnvironment :
203203
uint32_t SubgroupIndependentForwardProgressRequired;
204204
uint32_t CompiledForGreaterThan4GBBuffers;
205205
uint32_t NumGRFRequired;
206+
uint32_t WorkgroupWalkOrderDims; // dim0 : [0 : 1]; dim1 : [2 : 3]; dim2 : [4 : 5]
206207
};
207208

208209
// Update CURRENT_ICBE_VERSION when modifying the patch list
209-
static_assert(sizeof(SPatchExecutionEnvironment) == (80 + sizeof(SPatchItemHeader)), "The size of SPatchExecutionEnvironment is not what is expected");
210+
static_assert(sizeof(SPatchExecutionEnvironment) == (84 + sizeof(SPatchItemHeader)), "The size of SPatchExecutionEnvironment is not what is expected");
210211

211212
/*****************************************************************************\
212213
STRUCT: SPatchString

IGC/Compiler/CISACodeGen/OpenCLKernelCodeGen.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,11 @@ void COpenCLKernel::CreateKernelAttributeInfo()
438438
{
439439
m_kernelInfo.m_kernelAttributeInfo += " " + getSubGroupSizeString(subGroupSize);
440440
}
441+
WorkgroupWalkOrderMetaDataHandle workgroupWalkOrder = funcInfoMD->getWorkgroupWalkOrder();
442+
if (workgroupWalkOrder->hasValue())
443+
{
444+
m_kernelInfo.m_kernelAttributeInfo += " " + getWorkgroupWalkOrderString(workgroupWalkOrder);
445+
}
441446
ThreadGroupSizeMetaDataHandle threadGroupSize = funcInfoMD->getThreadGroupSize();
442447
if (threadGroupSize->hasValue())
443448
{
@@ -477,6 +482,15 @@ std::string COpenCLKernel::getSubGroupSizeString(SubGroupSizeMetaDataHandle& sub
477482
subTypeString += ")";
478483
return subTypeString;
479484
}
485+
std::string COpenCLKernel::getWorkgroupWalkOrderString(WorkgroupWalkOrderMetaDataHandle& workgroupWalkOrder)
486+
{
487+
std::string subTypeString = "intel_reqd_workgroup_walk_order(";
488+
subTypeString += utostr(workgroupWalkOrder->getDim0()) + ",";
489+
subTypeString += utostr(workgroupWalkOrder->getDim1()) + ",";
490+
subTypeString += utostr(workgroupWalkOrder->getDim2()) + ",";
491+
subTypeString += ")";
492+
return subTypeString;
493+
}
480494
std::string COpenCLKernel::getVecTypeHintString(VectorTypeHintMetaDataHandle& vecTypeHintInfo)
481495
{
482496
std::string vecTypeString = "vec_type_hint(";
@@ -1493,6 +1507,7 @@ void COpenCLKernel::FillKernel()
14931507
FunctionInfoMetaDataHandle funcInfoMD = m_pMdUtils->getFunctionsInfoItem(entry);
14941508
ThreadGroupSizeMetaDataHandle threadGroupSize = funcInfoMD->getThreadGroupSize();
14951509
SubGroupSizeMetaDataHandle subGroupSize = funcInfoMD->getSubGroupSize();
1510+
WorkgroupWalkOrderMetaDataHandle workgroupWalkOrder = funcInfoMD->getWorkgroupWalkOrder();
14961511
if(threadGroupSize->hasValue())
14971512
{
14981513
m_kernelInfo.m_executionEnivronment.HasFixedWorkGroupSize = true;
@@ -1504,6 +1519,13 @@ void COpenCLKernel::FillKernel()
15041519
{
15051520
m_kernelInfo.m_executionEnivronment.CompiledSIMDSize = subGroupSize->getSIMD_size();
15061521
}
1522+
1523+
if (workgroupWalkOrder->hasValue())
1524+
{
1525+
m_kernelInfo.m_executionEnivronment.WorkgroupWalkOrder[0] = workgroupWalkOrder->getDim0();
1526+
m_kernelInfo.m_executionEnivronment.WorkgroupWalkOrder[1] = workgroupWalkOrder->getDim1();
1527+
m_kernelInfo.m_executionEnivronment.WorkgroupWalkOrder[2] = workgroupWalkOrder->getDim2();
1528+
}
15071529

15081530
auto &FuncMap = m_Context->getModuleMetaData()->FuncMD;
15091531
auto FuncIter = FuncMap.find(entry);

IGC/Compiler/CISACodeGen/OpenCLKernelCodeGen.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class COpenCLKernel : public CShader
9696
std::string getVecTypeHintString(IGC::IGCMD::VectorTypeHintMetaDataHandle& vecTypeHintInfo);
9797
std::string getThreadGroupSizeString(IGC::IGCMD::ThreadGroupSizeMetaDataHandle& threadGroupSize, bool isHint);
9898
std::string getSubGroupSizeString(IGC::IGCMD::SubGroupSizeMetaDataHandle& subGroupSize);
99+
std::string getWorkgroupWalkOrderString(IGC::IGCMD::WorkgroupWalkOrderMetaDataHandle& workgroupWalkOrder);
99100
// Create annotation for printf strings.
100101
void CreatePrintfStringAnnotations();
101102

IGC/Compiler/MetaDataApi/MetaDataApi.cpp

Lines changed: 193 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1517,6 +1517,160 @@ llvm::Metadata* SubGroupSizeMetaData::getSIMD_sizeNode( const llvm::MDNode* pPar
15171517
return pParentNode->getOperand(0 + offset).get();
15181518
}
15191519

1520+
1521+
1522+
///
1523+
// Ctor - loads the WorkgroupWalkOrderMetaData from the given metadata node
1524+
//
1525+
WorkgroupWalkOrderMetaData::WorkgroupWalkOrderMetaData(const llvm::MDNode* pNode, bool hasId) :
1526+
_Mybase(pNode, hasId),
1527+
m_Dim0(getDim0Node(pNode)),
1528+
m_Dim1(getDim1Node(pNode)),
1529+
m_Dim2(getDim2Node(pNode)),
1530+
m_pNode(pNode)
1531+
{}
1532+
1533+
///
1534+
// Default Ctor - creates the empty, not named SubGroupSizeMetaData object
1535+
//
1536+
WorkgroupWalkOrderMetaData::WorkgroupWalkOrderMetaData() :
1537+
m_pNode(NULL)
1538+
{}
1539+
1540+
///
1541+
// Ctor - creates the empty, named SubGroupSizeMetaData object
1542+
//
1543+
WorkgroupWalkOrderMetaData::WorkgroupWalkOrderMetaData(const char* name) :
1544+
_Mybase(name),
1545+
m_pNode(NULL)
1546+
{}
1547+
1548+
bool WorkgroupWalkOrderMetaData::hasValue() const
1549+
{
1550+
if (m_Dim0.hasValue())
1551+
{
1552+
return true;
1553+
}
1554+
1555+
if (m_Dim1.hasValue())
1556+
{
1557+
return true;
1558+
}
1559+
1560+
if (m_Dim2.hasValue())
1561+
{
1562+
return true;
1563+
}
1564+
1565+
return NULL != m_pNode || dirty();
1566+
}
1567+
1568+
///
1569+
// Returns true if any of the SubGroupSizeMetaData`s members has changed
1570+
bool WorkgroupWalkOrderMetaData::dirty() const
1571+
{
1572+
if (m_Dim0.dirty())
1573+
{
1574+
return true;
1575+
}
1576+
1577+
if (m_Dim1.dirty())
1578+
{
1579+
return true;
1580+
}
1581+
1582+
if (m_Dim2.dirty())
1583+
{
1584+
return true;
1585+
}
1586+
return false;
1587+
}
1588+
1589+
///
1590+
// Discards the changes done to the SubGroupSizeMetaData instance
1591+
void WorkgroupWalkOrderMetaData::discardChanges()
1592+
{
1593+
m_Dim0.discardChanges();
1594+
m_Dim1.discardChanges();
1595+
m_Dim2.discardChanges();
1596+
}
1597+
1598+
///
1599+
// Generates the new MDNode hierarchy for the given structure
1600+
llvm::Metadata* WorkgroupWalkOrderMetaData::generateNode(llvm::LLVMContext& context) const
1601+
{
1602+
llvm::SmallVector<llvm::Metadata*, 5> args;
1603+
1604+
llvm::Metadata* pIDNode = _Mybase::generateNode(context);
1605+
if (NULL != pIDNode)
1606+
{
1607+
args.push_back(pIDNode);
1608+
}
1609+
1610+
args.push_back(m_Dim0.generateNode(context));
1611+
args.push_back(m_Dim1.generateNode(context));
1612+
args.push_back(m_Dim2.generateNode(context));
1613+
1614+
return llvm::MDNode::get(context, args);
1615+
}
1616+
1617+
///
1618+
// Saves the structure changes to the given MDNode
1619+
void WorkgroupWalkOrderMetaData::save(llvm::LLVMContext& context, llvm::MDNode* pNode) const
1620+
{
1621+
assert(pNode && "The target node should be valid pointer");
1622+
1623+
// we assume that underlying metadata node has not changed under our foot
1624+
if (pNode == m_pNode && !dirty())
1625+
{
1626+
return;
1627+
}
1628+
#if 0
1629+
// check that we could save the new information to the given node without regenerating it
1630+
if (!compatibleWith(pNode))
1631+
{
1632+
pNode->replaceAllUsesWith(generateNode(context));
1633+
return;
1634+
}
1635+
#endif
1636+
1637+
m_Dim0.save(context, llvm::cast<llvm::MDNode>(getDim0Node(pNode)));
1638+
m_Dim1.save(context, llvm::cast<llvm::MDNode>(getDim1Node(pNode)));
1639+
m_Dim2.save(context, llvm::cast<llvm::MDNode>(getDim2Node(pNode)));
1640+
}
1641+
1642+
llvm::Metadata* WorkgroupWalkOrderMetaData::getDim0Node(const llvm::MDNode* pParentNode) const
1643+
{
1644+
if (!pParentNode)
1645+
{
1646+
return NULL;
1647+
}
1648+
1649+
unsigned int offset = _Mybase::getStartIndex();
1650+
return pParentNode->getOperand(0 + offset).get();
1651+
}
1652+
1653+
llvm::Metadata* WorkgroupWalkOrderMetaData::getDim1Node(const llvm::MDNode* pParentNode) const
1654+
{
1655+
if (!pParentNode)
1656+
{
1657+
return NULL;
1658+
}
1659+
1660+
unsigned int offset = _Mybase::getStartIndex();
1661+
return pParentNode->getOperand(1 + offset).get();
1662+
}
1663+
1664+
llvm::Metadata* WorkgroupWalkOrderMetaData::getDim2Node(const llvm::MDNode* pParentNode) const
1665+
{
1666+
if (!pParentNode)
1667+
{
1668+
return NULL;
1669+
}
1670+
1671+
unsigned int offset = _Mybase::getStartIndex();
1672+
return pParentNode->getOperand(2 + offset).get();
1673+
}
15201674

15211675

15221676
///
@@ -2242,6 +2396,7 @@ FunctionInfoMetaData::FunctionInfoMetaData(const llvm::MDNode* pNode, bool hasId
22422396
m_ThreadGroupSize(ThreadGroupSizeMetaData::get(getThreadGroupSizeNode(pNode), true)),
22432397
m_ThreadGroupSizeHint(ThreadGroupSizeMetaData::get(getThreadGroupSizeHintNode(pNode), true)),
22442398
m_SubGroupSize(SubGroupSizeMetaData::get(getSubGroupSizeNode(pNode), true)),
2399+
m_WorkgroupWalkOrder(WorkgroupWalkOrderMetaData::get(getWorkgroupWalkOrderNode(pNode), true)),
22452400
m_LocalIDPresent(getLocalIDPresentNode(pNode)),
22462401
m_GroupIDPresent(getGroupIDPresentNode(pNode)),
22472402
m_GlobalOffsetPresent(getGlobalOffsetPresentNode(pNode)),
@@ -2270,6 +2425,7 @@ FunctionInfoMetaData::FunctionInfoMetaData(): m_Type("function_type"),
22702425
m_ThreadGroupSize(ThreadGroupSizeMetaDataHandle::ObjectType::get("thread_group_size")),
22712426
m_ThreadGroupSizeHint(ThreadGroupSizeMetaDataHandle::ObjectType::get("thread_group_size_hint")),
22722427
m_SubGroupSize(SubGroupSizeMetaDataHandle::ObjectType::get("sub_group_size")),
2428+
m_WorkgroupWalkOrder(WorkgroupWalkOrderMetaDataHandle::ObjectType::get("intel_reqd_workgroup_walk_order")),
22732429
m_LocalIDPresent("local_id_present"),
22742430
m_GroupIDPresent("group_id_present"),
22752431
m_GlobalOffsetPresent("global_offset_present"),
@@ -2300,6 +2456,7 @@ FunctionInfoMetaData::FunctionInfoMetaData(const char* name):
23002456
m_ThreadGroupSize(ThreadGroupSizeMetaDataHandle::ObjectType::get("thread_group_size")),
23012457
m_ThreadGroupSizeHint(ThreadGroupSizeMetaDataHandle::ObjectType::get("thread_group_size_hint")),
23022458
m_SubGroupSize(SubGroupSizeMetaDataHandle::ObjectType::get("sub_group_size")),
2459+
m_WorkgroupWalkOrder(WorkgroupWalkOrderMetaDataHandle::ObjectType::get("intel_reqd_workgroup_walk_order")),
23032460
m_LocalIDPresent("local_id_present"),
23042461
m_GroupIDPresent("group_id_present"),
23052462
m_GlobalOffsetPresent("global_offset_present"),
@@ -2356,6 +2513,12 @@ bool FunctionInfoMetaData::hasValue() const
23562513
{
23572514
return true;
23582515
}
2516+
2517+
2518+
if (m_WorkgroupWalkOrder->hasValue())
2519+
{
2520+
return true;
2521+
}
23592522

23602523

23612524
if (m_LocalIDPresent.hasValue())
@@ -2482,7 +2645,11 @@ bool FunctionInfoMetaData::dirty() const
24822645
if( m_SubGroupSize.dirty() )
24832646
{
24842647
return true;
2485-
}
2648+
}
2649+
if (m_WorkgroupWalkOrder.dirty())
2650+
{
2651+
return true;
2652+
}
24862653
if( m_LocalIDPresent.dirty() )
24872654
{
24882655
return true;
@@ -2560,6 +2727,7 @@ void FunctionInfoMetaData::discardChanges()
25602727
m_ThreadGroupSize.discardChanges();
25612728
m_ThreadGroupSizeHint.discardChanges();
25622729
m_SubGroupSize.discardChanges();
2730+
m_WorkgroupWalkOrder.discardChanges();
25632731
m_LocalIDPresent.discardChanges();
25642732
m_GroupIDPresent.discardChanges();
25652733
m_GlobalOffsetPresent.discardChanges();
@@ -2617,6 +2785,11 @@ llvm::Metadata* FunctionInfoMetaData::generateNode(llvm::LLVMContext& context) c
26172785
args.push_back(m_SubGroupSize.generateNode(context));
26182786
}
26192787

2788+
if (m_WorkgroupWalkOrder->hasValue())
2789+
{
2790+
args.push_back(m_WorkgroupWalkOrder.generateNode(context));
2791+
}
2792+
26202793
if (isLocalIDPresentHasValue())
26212794
{
26222795
args.push_back(m_LocalIDPresent.generateNode(context));
@@ -2731,6 +2904,7 @@ void FunctionInfoMetaData::save(llvm::LLVMContext& context, llvm::MDNode* pNode)
27312904
m_ThreadGroupSize.save(context, llvm::cast<llvm::MDNode>(getThreadGroupSizeNode(pNode)));
27322905
m_ThreadGroupSizeHint.save(context, llvm::cast<llvm::MDNode>(getThreadGroupSizeHintNode(pNode)));
27332906
m_SubGroupSize.save(context, llvm::cast<llvm::MDNode>(getSubGroupSizeNode(pNode)));
2907+
m_WorkgroupWalkOrder.save(context, llvm::cast<llvm::MDNode>(getSubGroupSizeNode(pNode)));
27342908
m_LocalIDPresent.save(context, llvm::cast<llvm::MDNode>(getLocalIDPresentNode(pNode)));
27352909
m_GroupIDPresent.save(context, llvm::cast<llvm::MDNode>(getGroupIDPresentNode(pNode)));
27362910
m_GlobalOffsetPresent.save(context, llvm::cast<llvm::MDNode>(getGlobalOffsetPresentNode(pNode)));
@@ -2857,6 +3031,24 @@ llvm::MDNode* FunctionInfoMetaData::getSubGroupSizeNode( const llvm::MDNode* pPa
28573031
}
28583032
return NULL;
28593033
}
3034+
3035+
llvm::MDNode* FunctionInfoMetaData::getWorkgroupWalkOrderNode(const llvm::MDNode* pParentNode) const
3036+
{
3037+
if (!pParentNode)
3038+
{
3039+
return NULL;
3040+
}
3041+
3042+
unsigned int offset = _Mybase::getStartIndex();
3043+
for (NodeIterator i = NodeIterator(pParentNode, 0 + offset), e = NodeIterator(pParentNode); i != e; ++i)
3044+
{
3045+
if (isNamedNode(i.get(), "sub_group_size"))
3046+
{
3047+
return llvm::dyn_cast<llvm::MDNode>(i.get());
3048+
}
3049+
}
3050+
return NULL;
3051+
}
28603052

28613053
llvm::Metadata* FunctionInfoMetaData::getLocalIDPresentNode( const llvm::MDNode* pParentNode) const
28623054
{

0 commit comments

Comments
 (0)