@@ -3455,7 +3455,7 @@ namespace IGC
3455
3455
3456
3456
static bool exceedMaxScratchUse (CShader* shader, OpenCLProgramContext* ctx)
3457
3457
{
3458
- return getScratchUse (shader, ctx) >
3458
+ return shader && getScratchUse (shader, ctx) >
3459
3459
shader->ProgramOutput ()->m_scratchSpaceSizeLimit ;
3460
3460
}
3461
3461
@@ -3592,33 +3592,29 @@ namespace IGC
3592
3592
}
3593
3593
}
3594
3594
3595
- static void verifyOOBScratch (OpenCLProgramContext *ctx,
3595
+ static bool verifyHasOOBScratch (OpenCLProgramContext *ctx,
3596
3596
COpenCLKernel *simd8Shader,
3597
3597
COpenCLKernel *simd16Shader,
3598
3598
COpenCLKernel *simd32Shader) {
3599
3599
auto verify = [ctx](CShader *shader) {
3600
3600
if (exceedMaxScratchUse (shader, ctx)) {
3601
- std::string errorMsg =
3602
- " total scratch space exceeds HW "
3603
- " supported limit for kernel " +
3604
- shader->entry ->getName ().str () + " : " +
3605
- std::to_string (getScratchUse (shader, ctx)) + " bytes (max permitted PTSS " +
3606
- std::to_string (shader->ProgramOutput ()->m_scratchSpaceSizeLimit ) +
3607
- " bytes)" ;
3608
-
3609
- ctx->EmitError (errorMsg.c_str (), nullptr );
3601
+ return true ;
3610
3602
}
3603
+ return false ;
3611
3604
};
3612
3605
3613
3606
// Need to check if simd* shader is not nullptr and its vISA compile status,
3614
3607
// since it may be created without going through full vISA compilation and
3615
3608
// the spill size record may be invalid
3609
+ bool result = false ;
3616
3610
if (simd8Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd8Shader))
3617
- verify (simd8Shader);
3611
+ result |= verify (simd8Shader);
3618
3612
else if (simd16Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd16Shader))
3619
- verify (simd16Shader);
3613
+ result |= verify (simd16Shader);
3620
3614
else if (simd32Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd32Shader))
3621
- verify (simd32Shader);
3615
+ result |= verify (simd32Shader);
3616
+
3617
+ return result;
3622
3618
}
3623
3619
3624
3620
static void CodeGen (OpenCLProgramContext* ctx, CShaderProgram::KernelShaderMap& shaders)
@@ -3835,9 +3831,36 @@ namespace IGC
3835
3831
GatherDataForDriver (ctx, simd16Shader, std::move (pKernel), pFunc, pMdUtils, SIMDMode::SIMD16);
3836
3832
else if (COpenCLKernel::IsValidShader (simd8Shader))
3837
3833
GatherDataForDriver (ctx, simd8Shader, std::move (pKernel), pFunc, pMdUtils, SIMDMode::SIMD8);
3838
- else
3839
- // Verify if compilation failed due to OOB scratch
3840
- verifyOOBScratch (ctx, simd8Shader, simd16Shader, simd32Shader);
3834
+ else if (verifyHasOOBScratch (ctx, simd8Shader, simd16Shader, simd32Shader))
3835
+ {
3836
+ // Get the simd* shader with the OOB access.
3837
+ COpenCLKernel* shader =
3838
+ exceedMaxScratchUse (simd32Shader, ctx) ? simd32Shader :
3839
+ exceedMaxScratchUse (simd16Shader, ctx) ? simd16Shader :
3840
+ exceedMaxScratchUse (simd8Shader, ctx) ? simd8Shader :
3841
+ nullptr ;
3842
+
3843
+ IGC_ASSERT (shader);
3844
+
3845
+ if (!ctx->m_retryManager .IsLastTry ())
3846
+ {
3847
+ // If this is not the last try, force retry on this kernel to potentially avoid
3848
+ // OOB access on the next try by reducing spill size and thus SS usage.
3849
+ ctx->m_retryManager .kernelSet .insert (shader->entry ->getName ().str ());
3850
+ }
3851
+ else
3852
+ {
3853
+ std::string errorMsg =
3854
+ " total scratch space exceeds HW "
3855
+ " supported limit for kernel " +
3856
+ shader->entry ->getName ().str () + " : " +
3857
+ std::to_string (getScratchUse (shader, ctx)) + " bytes (max permitted PTSS " +
3858
+ std::to_string (shader->ProgramOutput ()->m_scratchSpaceSizeLimit ) +
3859
+ " bytes)" ;
3860
+
3861
+ ctx->EmitError (errorMsg.c_str (), nullptr );
3862
+ }
3863
+ }
3841
3864
}
3842
3865
}
3843
3866
0 commit comments