Skip to content

[miopen] Log applicability failures#3964

Closed
SreecharanGundaboluAMD wants to merge 40 commits intodevelopfrom
users/SreecharanGundaboluAMD/log_applicability_failures
Closed

[miopen] Log applicability failures#3964
SreecharanGundaboluAMD wants to merge 40 commits intodevelopfrom
users/SreecharanGundaboluAMD/log_applicability_failures

Conversation

@SreecharanGundaboluAMD
Copy link
Copy Markdown
Contributor

This pull request introduces a set of macros and standardized messages to improve the clarity, consistency, and maintainability of applicability checks in solver classes across the MIOpen codebase. The main theme is refactoring the IsApplicable methods of various solvers to use the new macros for logging and returning early when a solver is not applicable, along with standardized messages for common reasons. This change helps developers quickly understand why a solver was rejected and ensures uniform logging across different solver implementations.

The most important changes are:

Core Infrastructure:

  • Added new header file solver_utils.hpp that defines the MIOPEN_SOLVER_INAPPLICABLE_IF and MIOPEN_SOLVER_INAPPLICABLE_IF_CONTEXT macros, as well as a set of standardized inapplicability message strings in the inapplicable_msg namespace. This file includes documentation and usage guidelines for the macros.

Refactoring Applicability Checks (Activ Solvers):

  • Refactored IsApplicable methods in activ/bwd_0.cpp, activ/bwd_1.cpp, activ/fwd_0.cpp, and activ/fwd_1.cpp to use the new macros for early returns and standardized messages, replacing manual if checks and custom strings. This improves logging and code consistency for activation solvers. [1] [2] [3] [4] [5] [6] [7] [8]

Refactoring Applicability Checks (Adam Solvers):

  • Updated IsApplicable methods in adam/adam.cpp and adam/transformers_adam_w.cpp to use the new macro and standardized message for contiguous tensor checks. [1] [2]

Refactoring Applicability Checks (BatchNorm Solver):

  • Refactored IsApplicable in batchnorm/backward_per_activation.cpp to use the macros and standardized messages for 2D checks, direction/mode checks, and data type validation, replacing multiple manual if statements.

Codebase Integration:

  • Added #include <miopen/solver/solver_utils.hpp> to all affected solver source files to enable use of the new macros and messages. [1] [2] [3] [4] [5] [6] [7]

These changes collectively standardize the way solver applicability is checked and logged, making the code easier to maintain and debug.

Submission Checklist

return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(
!(x_elem_sz == y_elem_sz && dx_elem_sz == dy_elem_sz && x_elem_sz == dx_elem_sz),
"Element sizes do not match");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be added to inapplicable_msg?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or we could use ElementSizeMismatch?

inline constexpr const char* Layout = "Unsupported tensor layout.";
inline constexpr const char* UnsupportedDevice = "Unsupported GPU.";
inline constexpr const char* Direction = "Unsupported direction.";
inline constexpr const char* UseAsmKernels = "Assembly kernels are disabled.";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Name seems counter intuitive

Suggested change
inline constexpr const char* UseAsmKernels = "Assembly kernels are disabled.";
inline constexpr const char* AsmKernelsDisabled = "Assembly kernels are disabled.";


MIOPEN_SOLVER_INAPPLICABLE_IF(!ctx.rmv.IsV2orV3(), inapplicable_msg::MetaData);

MIOPEN_SOLVER_INAPPLICABLE_IF(!(problem.IsFp32() || problem.IsFp16()),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missed IsBfp8 type

Comment on lines -516 to -518

if(problem.IsTensorsCasted() || problem.IsFp8() || problem.IsBfp8())
return false;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missed Datatype check for fp8 and bfp8


if(problem.IsTensorsCasted())
return false;
const std::string solver = SolverDbId();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unused


MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault(), inapplicable_msg::Layout);

MIOPEN_SOLVER_INAPPLICABLE_IF(problem.IsTensorsCasted() || problem.IsFp8() || problem.IsBfp8(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be separated to IsTensorsCasted and DataType msg for uniformity

if(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(
(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can add a new worksize limit exceeded msg

(!problem.IsFp32() && !problem.IsFp16() &&
!(problem.IsBfp16() && (device_name == "gfx90a" || device_name == "gfx942" ||
StartsWith(device_name, "gfx95")))),
"Datatype and HW combination not supported");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Datatype and HW combination not supported");
"Datatype and device combination not supported");

if(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(
(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be replace with worksize msg

(!problem.IsFp32() && !problem.IsFp16() &&
!(problem.IsBfp16() && (device_name == "gfx90a" || device_name == "gfx942" ||
StartsWith(device_name, "gfx95")))),
"Datatype, HW combination not supported");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Datatype, HW combination not supported");
"Datatype and device combination not supported");

if(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(
!(current_block_size * current_grid_size * current_splits_4G > 0xffffffffULL),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be replaced with worksize msg

MIOPEN_SOLVER_INAPPLICABLE_IF(!ctx.use_hip_kernels, inapplicable_msg::HIPDisabled);

MIOPEN_SOLVER_INAPPLICABLE_IF(!legacy_ck::is_ck_supported_hardware(ctx.GetStream()),
"Legacy CK does not support HW");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Legacy CK does not support HW");
"Legacy CK is not support on this Hardware");

HW is misleading for Height and Width parameters

legacy_ck::get_ck_convolution_problem_descriptor(problem));
MIOPEN_SOLVER_INAPPLICABLE_IF(!ctx.use_hip_kernels, inapplicable_msg::HIPDisabled);

MIOPEN_SOLVER_INAPPLICABLE_IF(!legacy_ck::is_ck_supported_hardware(ctx.GetStream()),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can also use CKWhitelist, "GPU is not in CK whitelist."

MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.AllTensorsLengthsFitIntoInt(),
inapplicable_msg::AllTensorsDimsFitIntoInt);

MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
added twice

return false;
if(test_cast(problem.GetWeights()))
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(test_cast(problem.GetIn()), "Input tensor missing cast type");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
MIOPEN_SOLVER_INAPPLICABLE_IF(test_cast(problem.GetIn()), "Input tensor missing cast type");
MIOPEN_SOLVER_INAPPLICABLE_IF(test_cast(problem.GetOut()), "Output tensor missing cast type");


if(!ConvDirectNaiveConvIsApplicableByKernelType(ctx, problem))
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
MIOPEN_SOLVER_INAPPLICABLE_IF(!ConvDirectNaiveConvIsApplicableByKernelType(ctx, problem),
inapplicable_msg::Generic);

Comment on lines +51 to +52
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
inapplicable_msg::Layout);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsLayoutDefault() && !problem.IsLayoutNHWC(),
inapplicable_msg::Layout);
MIOPEN_SOLVER_INAPPLICABLE_IF(!ConvDirectNaiveConvIsApplicableByKernelType(ctx, problem),
inapplicable_msg::Generic);

return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(test_cast(problem.GetIn()), "Input tensor missing cast type");
MIOPEN_SOLVER_INAPPLICABLE_IF(test_cast(problem.GetOut()),
"Weight tensor missing cast type");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Weight tensor missing cast type");
"Output tensor missing cast type");

std::tie(gemm_g, gemm_m, gemm_n, gemm_k_total) = CalculateGemmSize(problem);

return static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total);
MIOPEN_SOLVER_INAPPLICABLE_IF(!static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this a case for InvalidGridGemm


return static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total);
MIOPEN_SOLVER_INAPPLICABLE_IF(!static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total),
inapplicable_msg::NoKernelForConfig);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
inapplicable_msg::NoKernelForConfig);
inapplicable_msg::InvalidGridGemm);


return static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total);
MIOPEN_SOLVER_INAPPLICABLE_IF(!static_ck::IsValidGridGemmXdlops(gemm_m, gemm_n, gemm_k_total),
inapplicable_msg::NoKernelForConfig);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
inapplicable_msg::NoKernelForConfig);
inapplicable_msg::InvalidGridGemm);

if(IS_DISABLED(MIOPEN_DEBUG_AMD_MP_BD_WINOGRAD_F3X3))
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(IS_DISABLED(MIOPEN_DEBUG_AMD_MP_BD_WINOGRAD_F3X3),
inapplicable_msg::EnvDisabled);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be useful to also capture the ENV VAR in EnvDisabled msg to help isolate why its disabled

Comment on lines +492 to +507
// #if 0
// // There is a stronger restriction than this one, which make this one
// unnecessary.
// // The kernel read stripes (in height direction, one stripe at a time) of
// input into LDS,
// // the height of stripe is (MLO_N_ALIGNED_OUT_SCAN_BLK - 1) *
// MLO_FILTER_STRIDE1 +
// // MLO_FILTER_SIZE1, (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) of it is
// reusable from
// // previous read, (MLO_N_ALIGNED_OUT_SCAN_BLK * MLO_FILTER_STRIDE1) of it is
// fresh read
// // from device memory. So (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) need no
// less than 0.
// // TODO: chao: revisit this if failure is encountered.
// problem.GetWeightsHeight() >= problem.GetKernelStrideH() &&
// #endif
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// #if 0
// // There is a stronger restriction than this one, which make this one
// unnecessary.
// // The kernel read stripes (in height direction, one stripe at a time) of
// input into LDS,
// // the height of stripe is (MLO_N_ALIGNED_OUT_SCAN_BLK - 1) *
// MLO_FILTER_STRIDE1 +
// // MLO_FILTER_SIZE1, (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) of it is
// reusable from
// // previous read, (MLO_N_ALIGNED_OUT_SCAN_BLK * MLO_FILTER_STRIDE1) of it is
// fresh read
// // from device memory. So (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) need no
// less than 0.
// // TODO: chao: revisit this if failure is encountered.
// problem.GetWeightsHeight() >= problem.GetKernelStrideH() &&
// #endif
#if 0
// There is a stronger restriction than this one, which make this one unnecessary.
// The kernel read stripes (in height direction, one stripe at a time) of input into LDS,
// the height of stripe is (MLO_N_ALIGNED_OUT_SCAN_BLK - 1) * MLO_FILTER_STRIDE1 +
// MLO_FILTER_SIZE1, (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) of it is reusable from
// previous read, (MLO_N_ALIGNED_OUT_SCAN_BLK * MLO_FILTER_STRIDE1) of it is fresh read
// from device memory. So (MLO_FILTER_SIZE1 - MLO_FILTER_STRIDE1) need no less than 0.
// TODO: chao: revisit this if failure is encountered.
problem.GetWeightsHeight() >= problem.GetKernelStrideH() &&
#endif

if (!supported)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!supported,
inapplicable_msg::Workaround);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure if this is due to an explicit workaround?

bool ConvWinoFuryRxSCommon<Winodata, Winofilter>::IsApplicable(const ExecutionContext& ctx,
const ProblemDescription& problem)
{
std::string context = "ConvWinoFuryRxSCommon"; // for logging
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we mean to add it to all solvers? or this is leftover code?

return false;
if(desc.op_map[0]->kind() != miopenFusionOpConvForward)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF((desc.op_map.size() > 3), "Too many ops in fusion plan.");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FusionOpCount

!(gemm::IsAnyBufferBf16(xDesc, yDesc, wDesc) && !gemm::IsBf16Supported) &&
!(gemm::IsAnyBufferFp16(xDesc, yDesc, wDesc) && !gemm::IsFp16Supported);
MIOPEN_SOLVER_INAPPLICABLE_IF((problem.IsFp8() && !rblas_fp8_supported),
"GEMM not applicable for F8 on this GPU architecture");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"GEMM not applicable for F8 on this GPU architecture");
"GEMM not applicable for FP8 on this GPU architecture");

}
MIOPEN_SOLVER_INAPPLICABLE_IF(
!rblas_fp8_supported,
"GEMM not supported with casted tensors on this GPU architecture");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsTensorsCasted?

!(gemm::IsAnyBufferBf16(dxDesc, dyDesc, wDesc) && !gemm::IsBf16Supported) &&
!(gemm::IsAnyBufferFp16(dxDesc, dyDesc, wDesc) && !gemm::IsFp16Supported);
MIOPEN_SOLVER_INAPPLICABLE_IF((problem.IsFp8() && !rblas_fp8_supported),
"GEMM not applicable for F8 on this GPU architecture");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"GEMM not applicable for F8 on this GPU architecture");
"GEMM not applicable for FP8 on this GPU architecture");

}
MIOPEN_SOLVER_INAPPLICABLE_IF(
!rblas_fp8_supported,
"GEMM not supported with casted tensors on this GPU architecture");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsTensorsCasted

!(gemm::IsAnyBufferBf16(xDesc, dyDesc, dwDesc) && !gemm::IsBf16Supported) &&
!(gemm::IsAnyBufferFp16(xDesc, dyDesc, dwDesc) && !gemm::IsFp16Supported);
MIOPEN_SOLVER_INAPPLICABLE_IF((problem.IsFp8() && !rblas_fp8_supported),
"GEMM not applicable for F8 on this GPU architecture");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"GEMM not applicable for F8 on this GPU architecture");
"GEMM not applicable for FP8 on this GPU architecture");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DataType?

return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsSameType(), inapplicable_msg::DataTypeMismatch);

MIOPEN_SOLVER_INAPPLICABLE_IF(!IsLargeIndex(problem), "Not a large index problem");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
MIOPEN_SOLVER_INAPPLICABLE_IF(!IsLargeIndex(problem), "Not a large index problem");
MIOPEN_SOLVER_INAPPLICABLE_IF(!IsLargeIndex(problem), inapplicable_msg::IndexRange);

return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsAllContiguous(), inapplicable_msg::NotContiguous);

MIOPEN_SOLVER_INAPPLICABLE_IF((problem.GetDim() != 0), "Only dim=0 is supported.");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inapplicable_msg::InvalidDim?

return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!problem.IsAllContiguous(), inapplicable_msg::NotContiguous);

MIOPEN_SOLVER_INAPPLICABLE_IF((problem.GetDim() != 0), "Only dim=0 is supported.");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inapplicable_msg::InvalidDim?

if(problem.GetInputDesc().GetNumDims() > 5)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(!IsImprovementOverROCm(problem),
"Not an improvement over ROCm implementation");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Not an improvement over ROCm implementation");
inapplicable_msg::IsImprovementOverROCm);

MIOPEN_SOLVER_INAPPLICABLE_IF(!IsImprovementOverROCm(problem),
"Not an improvement over ROCm implementation");

MIOPEN_SOLVER_INAPPLICABLE_IF((problem.GetInputDesc().GetNumDims() > 5),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

InvalidDim?

if(activ_op.activMode != miopenActivationRELU)
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF((activ_op.activMode != miopenActivationRELU),
"Activation is not RELU");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Activation is not RELU");
inapplicable_msg::InvalidActivation);

MIOPEN_SOLVER_INAPPLICABLE_IF((activationType != miopenActivationRELU &&
activationType != miopenActivationCLIPPEDRELU &&
activationType != miopenActivationCLAMP),
"Unsupported activation type");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Unsupported activation type");
inapplicable_msg::InvalidActivation);

MIOPEN_SOLVER_INAPPLICABLE_IF((activationType != miopenActivationRELU &&
activationType != miopenActivationCLIPPEDRELU &&
activationType != miopenActivationCLAMP),
"Unsupported activation type");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Unsupported activation type");
inapplicable_msg::InvalidActivation);

MIOPEN_SOLVER_INAPPLICABLE_IF(!(prim == miopenFusionOpBatchNormInference ||
prim == miopenFusionOpBiasForward ||
prim == miopenFusionOpActivForward),
"Unsupported 2nd fusion op");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Unsupported 2nd fusion op");
inapplicable_msg::InvalidActivation);

if(!(prim == miopenFusionOpActivForward || prim == miopenFusionOpBatchNormInference))
return false;
MIOPEN_SOLVER_INAPPLICABLE_IF(
!(prim == miopenFusionOpActivForward || prim == miopenFusionOpBatchNormInference),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThirdFusionOp

@AnaghaRaoAMD
Copy link
Copy Markdown
Contributor

Great work 🙌

  • As a unit test for logging can we check deterministic msgs being dumped for CPU_UnitTestConvSolverImplicitGemm3DGroupFwdXdlopsDeterministicApplicability_NONE test case?
  • As a backlog task, can this be leveraged to test applicability for all solvers, so that when it is unintentionally updated we have test coverage?

@github-actions
Copy link
Copy Markdown
Contributor

This pull request has been inactive for 25 days and will be marked as stale.

If you would like to keep this PR open, please:

  • Add new commits
  • Add a comment explaining why it should remain open

This PR will be automatically closed in 5 days if no further activity occurs.

@github-actions github-actions Bot added the Stale PR has no activity for period of 2+ weeks label Apr 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

This pull request has been automatically closed due to inactivity (30 days with no updates).

If you'd like to continue working on this, feel free to reopen the PR or create a new one.

@github-actions github-actions Bot closed this Apr 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

organization: ROCm project: miopen Stale PR has no activity for period of 2+ weeks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants