@@ -3456,7 +3456,7 @@ namespace IGC
3456
3456
3457
3457
static bool exceedMaxScratchUse (CShader* shader, OpenCLProgramContext* ctx)
3458
3458
{
3459
- return getScratchUse (shader, ctx) >
3459
+ return shader && getScratchUse (shader, ctx) >
3460
3460
shader->ProgramOutput ()->m_scratchSpaceSizeLimit ;
3461
3461
}
3462
3462
@@ -3638,33 +3638,29 @@ namespace IGC
3638
3638
}
3639
3639
}
3640
3640
3641
- static void verifyOOBScratch (OpenCLProgramContext *ctx,
3641
+ static bool verifyHasOOBScratch (OpenCLProgramContext *ctx,
3642
3642
COpenCLKernel *simd8Shader,
3643
3643
COpenCLKernel *simd16Shader,
3644
3644
COpenCLKernel *simd32Shader) {
3645
3645
auto verify = [ctx](CShader *shader) {
3646
3646
if (exceedMaxScratchUse (shader, ctx)) {
3647
- std::string errorMsg =
3648
- " total scratch space exceeds HW "
3649
- " supported limit for kernel " +
3650
- shader->entry ->getName ().str () + " : " +
3651
- std::to_string (getScratchUse (shader, ctx)) + " bytes (max permitted PTSS " +
3652
- std::to_string (shader->ProgramOutput ()->m_scratchSpaceSizeLimit ) +
3653
- " bytes)" ;
3654
-
3655
- ctx->EmitError (errorMsg.c_str (), nullptr );
3647
+ return true ;
3656
3648
}
3649
+ return false ;
3657
3650
};
3658
3651
3659
3652
// Need to check if simd* shader is not nullptr and its vISA compile status,
3660
3653
// since it may be created without going through full vISA compilation and
3661
3654
// the spill size record may be invalid
3655
+ bool result = false ;
3662
3656
if (simd8Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd8Shader))
3663
- verify (simd8Shader);
3657
+ result |= verify (simd8Shader);
3664
3658
else if (simd16Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd16Shader))
3665
- verify (simd16Shader);
3659
+ result |= verify (simd16Shader);
3666
3660
else if (simd32Shader && !COpenCLKernel::IsVisaCompileStatusFailureForShader (simd32Shader))
3667
- verify (simd32Shader);
3661
+ result |= verify (simd32Shader);
3662
+
3663
+ return result;
3668
3664
}
3669
3665
3670
3666
static void CodeGen (OpenCLProgramContext* ctx, CShaderProgram::KernelShaderMap& shaders)
@@ -3881,9 +3877,36 @@ namespace IGC
3881
3877
GatherDataForDriver (ctx, simd16Shader, std::move (pKernel), pFunc, pMdUtils, SIMDMode::SIMD16);
3882
3878
else if (COpenCLKernel::IsValidShader (simd8Shader))
3883
3879
GatherDataForDriver (ctx, simd8Shader, std::move (pKernel), pFunc, pMdUtils, SIMDMode::SIMD8);
3884
- else
3885
- // Verify if compilation failed due to OOB scratch
3886
- verifyOOBScratch (ctx, simd8Shader, simd16Shader, simd32Shader);
3880
+ else if (verifyHasOOBScratch (ctx, simd8Shader, simd16Shader, simd32Shader))
3881
+ {
3882
+ // Get the simd* shader with the OOB access.
3883
+ COpenCLKernel* shader =
3884
+ exceedMaxScratchUse (simd32Shader, ctx) ? simd32Shader :
3885
+ exceedMaxScratchUse (simd16Shader, ctx) ? simd16Shader :
3886
+ exceedMaxScratchUse (simd8Shader, ctx) ? simd8Shader :
3887
+ nullptr ;
3888
+
3889
+ IGC_ASSERT (shader);
3890
+
3891
+ if (!ctx->m_retryManager .IsLastTry ())
3892
+ {
3893
+ // If this is not the last try, force retry on this kernel to potentially avoid
3894
+ // OOB access on the next try by reducing spill size and thus SS usage.
3895
+ ctx->m_retryManager .kernelSet .insert (shader->entry ->getName ().str ());
3896
+ }
3897
+ else
3898
+ {
3899
+ std::string errorMsg =
3900
+ " total scratch space exceeds HW "
3901
+ " supported limit for kernel " +
3902
+ shader->entry ->getName ().str () + " : " +
3903
+ std::to_string (getScratchUse (shader, ctx)) + " bytes (max permitted PTSS " +
3904
+ std::to_string (shader->ProgramOutput ()->m_scratchSpaceSizeLimit ) +
3905
+ " bytes)" ;
3906
+
3907
+ ctx->EmitError (errorMsg.c_str (), nullptr );
3908
+ }
3909
+ }
3887
3910
}
3888
3911
}
3889
3912
0 commit comments