Skip to content

Commit 9aac158

Browse files
iwwusys_zuul
authored andcommitted
Implement SIMD compile info for each kernel
Support added to pixel and compute shaders 8 bits stored for each SIMD kernel Change-Id: I11914e8d3e8d84113c400229013c94fc6ddd0388
1 parent 788313b commit 9aac158

File tree

5 files changed

+148
-2
lines changed

5 files changed

+148
-2
lines changed

IGC/Compiler/CISACodeGen/ComputeShaderCodeGen.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,12 @@ namespace IGC
397397
bool hasSimd16 = simd16Program && simd16Program->ProgramOutput()->m_programSize > 0;
398398
bool hasSimd32 = simd32Program && simd32Program->ProgramOutput()->m_programSize > 0;
399399

400+
if (!ctx->m_retryManager.IsFirstTry())
401+
{
402+
ctx->ClearSIMDInfo(simdMode, ShaderDispatchMode::NOT_APPLICABLE);
403+
ctx->SetSIMDInfo(SIMD_RETRY, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
404+
}
405+
400406
////////
401407
// dynamic rules
402408
////////
@@ -411,6 +417,7 @@ namespace IGC
411417
if (simdMode == SIMDMode::SIMD32 && simd16Program &&
412418
simd16Program->m_spillSize > 0)
413419
{
420+
ctx->SetSIMDInfo(SIMD_SKIP_SPILL, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
414421
return false;
415422
}
416423

@@ -445,16 +452,20 @@ namespace IGC
445452
{
446453
return true;
447454
}
455+
456+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
448457
}
449458
else // SIMD8
450459
{
451460
if (simd16Program->m_spillCost <= ctx->GetSpillThreshold())
452461
{
462+
ctx->SetSIMDInfo(SIMD_SKIP_PERF, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
453463
return false;
454464
}
455465
else if (!ctx->m_retryManager.IsLastTry() && ctx->instrStat[LICM_STAT][EXCEED_THRESHOLD])
456466
{
457467
// skip SIMD8 if LICM threshold is met, unless it's lastTry
468+
ctx->SetSIMDInfo(SIMD_SKIP_REGPRES, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
458469
return false;
459470
}
460471
else

IGC/Compiler/CISACodeGen/PixelShaderCodeGen.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,8 +732,13 @@ void CShaderProgram::FillProgram(SPixelShaderKernelProgram* pKernelProgram)
732732
{
733733
pKernelProgram->simd32 = *simd32Shader->ProgramOutput();
734734
pShader = simd32Shader;
735+
GetContext()->SetSIMDInfo(SIMD_SELECTED, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
735736
}
736737
}
738+
else if (kernelSize > 0 && (kernelSize < InstCacheSize))
739+
{
740+
GetContext()->SetSIMDInfo(SIMD_SKIP_PERF, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
741+
}
737742
}
738743
if (simd16Shader)
739744
{
@@ -742,13 +747,15 @@ void CShaderProgram::FillProgram(SPixelShaderKernelProgram* pKernelProgram)
742747
{
743748
pKernelProgram->simd16 = *simd16Shader->ProgramOutput();
744749
pShader = simd16Shader;
750+
GetContext()->SetSIMDInfo(SIMD_SELECTED, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
745751
}
746752
}
747753
{
748754
if (simd8Shader && simd8Shader->m_simdProgram.m_programSize > 0)
749755
{
750756
pKernelProgram->simd8 = *simd8Shader->ProgramOutput();
751757
pShader = simd8Shader;
758+
GetContext()->SetSIMDInfo(SIMD_SELECTED, SIMDMode::SIMD8, ShaderDispatchMode::NOT_APPLICABLE);
752759
}
753760
}
754761

@@ -757,6 +764,7 @@ void CShaderProgram::FillProgram(SPixelShaderKernelProgram* pKernelProgram)
757764
{
758765
pShader->FillProgram(pKernelProgram);
759766
}
767+
pKernelProgram->SIMDInfo = GetContext()->GetSIMDInfo();
760768
}
761769

762770
void CPixelShader::FillProgram(SPixelShaderKernelProgram* pKernelProgram)
@@ -1157,7 +1165,14 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
11571165
if (!CompileSIMDSizeInCommon())
11581166
return false;
11591167

1168+
11601169
CodeGenContext* ctx = GetContext();
1170+
if (!ctx->m_retryManager.IsFirstTry())
1171+
{
1172+
ctx->ClearSIMDInfo(simdMode, EP.m_ShaderDispatchMode);
1173+
ctx->SetSIMDInfo(SIMD_RETRY, simdMode, EP.m_ShaderDispatchMode);
1174+
}
1175+
11611176
bool forceSIMD32 =
11621177
(ctx->getCompilerOption().forcePixelShaderSIMDMode &
11631178
FLAG_PS_SIMD_MODE_FORCE_SIMD32) != 0;
@@ -1174,21 +1189,25 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
11741189

11751190
if (m_HasoStencil && !ctx->platform.supportsStencil(simdMode))
11761191
{
1192+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
11771193
return false;
11781194
}
11791195
if (m_HasDouble && simdMode != SIMDMode::SIMD8)
11801196
{
1197+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
11811198
return false;
11821199
}
11831200
if (m_hasDualBlendSource && simdMode != SIMDMode::SIMD8 &&
11841201
(m_phase == PSPHASE_PIXEL || (m_phase != PSPHASE_LEGACY && ctx->platform.getWATable().Wa_1409392000)))
11851202
{
11861203
// Spec restriction CPS multi-phase cannot use SIMD16 with dual source blending
1204+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
11871205
return false;
11881206
}
11891207
if (m_phase != PSPHASE_LEGACY && simdMode == SIMDMode::SIMD32)
11901208
{
11911209
// Coarse pixel shader doesn't support SIMD32
1210+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
11921211
return false;
11931212
}
11941213

@@ -1197,6 +1216,7 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
11971216
IsPerSample() && !IsStage1(ctx))
11981217
{
11991218
//Fused SIMD32 not enabled when dispatch rate is per sample
1219+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
12001220
return false;
12011221
}
12021222

@@ -1223,6 +1243,7 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
12231243
CShader* simd8Program = m_parent->GetShader(SIMDMode::SIMD8);
12241244
if (simd8Program != nullptr && simd8Program->ProgramOutput()->m_scratchSpaceUsedBySpills > 0)
12251245
{
1246+
ctx->SetSIMDInfo(SIMD_SKIP_REGPRES, simdMode, EP.m_ShaderDispatchMode);
12261247
return false;
12271248
}
12281249
}
@@ -1243,6 +1264,7 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
12431264
simd16Program->ProgramOutput()->m_programBin == 0 ||
12441265
simd16Program->ProgramOutput()->m_scratchSpaceUsedBySpills > 0))
12451266
{
1267+
ctx->SetSIMDInfo(SIMD_SKIP_REGPRES, simdMode, EP.m_ShaderDispatchMode);
12461268
return false;
12471269
}
12481270

@@ -1255,12 +1277,14 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
12551277

12561278
if (!ctx->platform.enablePSsimd32())
12571279
{
1280+
ctx->SetSIMDInfo(SIMD_SKIP_HW, simdMode, EP.m_ShaderDispatchMode);
12581281
return false;
12591282
}
12601283

12611284
if (iSTD::BitCount(m_RenderTargetMask) > 1)
12621285
{
12631286
// don't compile SIMD32 for MRT as we may trash the render cache
1287+
ctx->SetSIMDInfo(SIMD_SKIP_PERF, simdMode, EP.m_ShaderDispatchMode);
12641288
return false;
12651289
}
12661290

@@ -1269,9 +1293,15 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
12691293
{
12701294
return true;
12711295
}
1296+
else
1297+
{
1298+
ctx->SetSIMDInfo(SIMD_SKIP_PERF, simdMode, EP.m_ShaderDispatchMode);
1299+
}
12721300

12731301
if (simd16Program && static_cast<CPixelShader*>(simd16Program)->m_sendStallCycle == 0)
12741302
{
1303+
// simd16 doesn't have any latency issue, no need to try simd32
1304+
ctx->SetSIMDInfo(SIMD_SKIP_STALL, simdMode, EP.m_ShaderDispatchMode);
12751305
return false;
12761306
}
12771307

@@ -1288,6 +1318,10 @@ bool CPixelShader::CompileSIMDSize(SIMDMode simdMode, EmitPass& EP, llvm::Functi
12881318
{
12891319
return true;
12901320
}
1321+
else
1322+
{
1323+
ctx->SetSIMDInfo(SIMD_SKIP_STALL, simdMode, EP.m_ShaderDispatchMode);
1324+
}
12911325
}
12921326
return false;
12931327
}

IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,9 @@ static void PSCodeGen(
811811
if (enableHigherSimd)
812812
{
813813
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD16, true, ShaderDispatchMode::NOT_APPLICABLE, pSignature);
814+
} else
815+
{
816+
ctx->SetSIMDInfo(SIMD_SKIP_SPILL, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
814817
}
815818
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD8, !ctx->m_retryManager.IsLastTry(), ShaderDispatchMode::NOT_APPLICABLE, pSignature);
816819
useRegKeySimd = true;
@@ -822,6 +825,9 @@ static void PSCodeGen(
822825
{
823826
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD16, earlyExit16, ShaderDispatchMode::NOT_APPLICABLE, pSignature);
824827
}
828+
else {
829+
ctx->SetSIMDInfo(SIMD_SKIP_SPILL, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
830+
}
825831
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD8, !ctx->m_retryManager.IsLastTry(), ShaderDispatchMode::NOT_APPLICABLE, pSignature);
826832
useRegKeySimd = true;
827833
}
@@ -865,6 +871,11 @@ static void PSCodeGen(
865871
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD16, earlyExit16, ShaderDispatchMode::NOT_APPLICABLE, pSignature);
866872
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD32, earlyExit, ShaderDispatchMode::NOT_APPLICABLE, pSignature);
867873
}
874+
else
875+
{
876+
ctx->SetSIMDInfo(SIMD_SKIP_SPILL, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
877+
ctx->SetSIMDInfo(SIMD_SKIP_SPILL, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
878+
}
868879
}
869880

870881
PassMgr.add(new DebugInfoPass(shaders));
@@ -942,6 +953,10 @@ void CodeGen(ComputeShaderContext* ctx, CShaderProgram::KernelShaderMap& shaders
942953
allowSpill = true;
943954
}
944955
}
956+
else {
957+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
958+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
959+
}
945960

946961
// if simd16 has better thread occupancy, then allows spills
947962
unsigned tempThreshold16 = allowSpill
@@ -959,6 +974,8 @@ void CodeGen(ComputeShaderContext* ctx, CShaderProgram::KernelShaderMap& shaders
959974
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD8,
960975
!ctx->m_retryManager.IsLastTry());
961976
setEarlyExit16Stat = true;
977+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
978+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
962979
}
963980
else
964981
{
@@ -967,9 +984,13 @@ void CodeGen(ComputeShaderContext* ctx, CShaderProgram::KernelShaderMap& shaders
967984
// allow simd16 spill if having SLM
968985
if (cgSimd16)
969986
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD16, earlyExit);
987+
else
988+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
970989

971990
if (cgSimd32)
972991
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD32, true);
992+
else
993+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
973994

974995
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD8,
975996
!ctx->m_retryManager.IsLastTry());
@@ -985,13 +1006,19 @@ void CodeGen(ComputeShaderContext* ctx, CShaderProgram::KernelShaderMap& shaders
9851006
{
9861007
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD32, true);
9871008
}
1009+
else {
1010+
ctx->SetSIMDInfo(SIMD_SKIP_THGRPSIZE, SIMDMode::SIMD32, ShaderDispatchMode::NOT_APPLICABLE);
1011+
}
1012+
ctx->SetSIMDInfo(SIMD_SKIP_HW, SIMDMode::SIMD8, ShaderDispatchMode::NOT_APPLICABLE);
9881013
break;
9891014
}
9901015

9911016
case SIMDMode::SIMD32:
9921017
{
9931018
AddCodeGenPasses(*ctx, shaders, PassMgr, SIMDMode::SIMD32,
9941019
!ctx->m_retryManager.IsLastTry());
1020+
ctx->SetSIMDInfo(SIMD_SKIP_HW, SIMDMode::SIMD16, ShaderDispatchMode::NOT_APPLICABLE);
1021+
ctx->SetSIMDInfo(SIMD_SKIP_HW, SIMDMode::SIMD8, ShaderDispatchMode::NOT_APPLICABLE);
9951022
break;
9961023
}
9971024

IGC/Compiler/CodeGenContext.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,30 +387,39 @@ namespace IGC
387387
PickCSEntryFinally(simdMode));
388388
IGC_ASSERT(shader != nullptr);
389389
}
390+
390391
if (shader)
391392
{
392393
switch (simdMode)
393394
{
394395
case SIMDMode::SIMD8:
395396
pKernelProgram->simd8 = *shader->ProgramOutput();
396397
pKernelProgram->SimdWidth = USC::GFXMEDIA_GPUWALKER_SIMD8;
398+
cgCtx->SetSIMDInfo(SIMD_SELECTED, simdMode,
399+
ShaderDispatchMode::NOT_APPLICABLE);
397400
break;
398401

399402
case SIMDMode::SIMD16:
400403
pKernelProgram->simd16 = *shader->ProgramOutput();
401404
pKernelProgram->SimdWidth = USC::GFXMEDIA_GPUWALKER_SIMD16;
405+
cgCtx->SetSIMDInfo(SIMD_SELECTED, simdMode,
406+
ShaderDispatchMode::NOT_APPLICABLE);
402407
break;
403408

404409
case SIMDMode::SIMD32:
405410
pKernelProgram->simd32 = *shader->ProgramOutput();
406411
pKernelProgram->SimdWidth = USC::GFXMEDIA_GPUWALKER_SIMD32;
412+
cgCtx->SetSIMDInfo(SIMD_SELECTED, simdMode,
413+
ShaderDispatchMode::NOT_APPLICABLE);
407414
break;
408415

409416
default:
410417
IGC_ASSERT_MESSAGE(0, "Invalie SIMDMode");
411418
break;
412419
}
413420
shader->FillProgram(pKernelProgram);
421+
pKernelProgram->SIMDInfo = cgCtx->GetSIMDInfo();
422+
414423

415424
// free allocated memory for the remaining kernels
416425
FreeAllocatedMemForNotPickedCS(simdMode);

0 commit comments

Comments
 (0)