From 933e53fa8afd2095c5de49b5f9859017fe96cefa Mon Sep 17 00:00:00 2001 From: Jacob Hinkle Date: Thu, 25 May 2023 10:32:59 -0400 Subject: [PATCH 1/2] Add failing test --- test/test_dynamic_transform.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/test_dynamic_transform.cpp b/test/test_dynamic_transform.cpp index 8ac90012a1f..e51c6582ebe 100644 --- a/test/test_dynamic_transform.cpp +++ b/test/test_dynamic_transform.cpp @@ -964,4 +964,35 @@ TEST_F(NVFuserTest, DynamicPadShmoo_CUDA) { reductionDynamicPadAddFusion(invocations); } +// Test that a Symbolic root/Broadcast rfactor is not concretized to +// Iteration/Iteration +TEST_F(NVFuserTest, FusionDynamicSliceToBroadcast_CUDA) { + std::unique_ptr fusion_ptr = std::make_unique(); + Fusion& fusion = *fusion_ptr.get(); + FusionGuard fg(fusion_ptr.get()); + auto tv0 = makeSymbolicTensor(1); + fusion.addInput(tv0); + // tv0[:2] introduces symbolic IterDomain + auto tv1 = slice( + tv0, {{fusion.zeroVal(), IrBuilder::create(2), fusion.oneVal()}}); + // tv1 has Broadcast rfactor, Iteration root + auto tv2 = slice(tv1, {{fusion.zeroVal(), fusion.oneVal(), fusion.oneVal()}}); + // tv2 has a Symbolic root related to a Broadcast rfactor through a Resize op + fusion.addOutput(tv2); + + // At concretization, tv1's rfactor will be set to Iteration, which will + // propagate to tv2s root. This test will test that when tv2 root is + // concretized to Iteration, it does not wind up overwriting the Broadcast + // rfactor. + + FusionExecutorCache fusion_executor_cache(std::move(fusion_ptr)); + auto options = at::TensorOptions().dtype(at::kFloat).device(at::kCUDA, 0); + at::Tensor at0 = at::randn({5}, options); + std::vector aten_inputs = {at0}; + auto outputs = fusion_executor_cache.runFusionWithInputs(aten_inputs); + auto at1 = at::slice(at0, 0, 0, 2); + auto at2 = at::slice(at1, 0, 0, 1); + testValidate(&fusion, outputs, aten_inputs, {at2}, __LINE__, __FILE__); +} + } // namespace nvfuser From 33f4eaec89813505362614f4e2213e0e6bb212ff Mon Sep 17 00:00:00 2001 From: Jacob Hinkle Date: Thu, 25 May 2023 10:33:20 -0400 Subject: [PATCH 2/2] Skip concretizing non-symbolic IDs in root->rfactor --- csrc/dynamic_transform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/csrc/dynamic_transform.cpp b/csrc/dynamic_transform.cpp index 2f958d69599..0b16d671a0f 100644 --- a/csrc/dynamic_transform.cpp +++ b/csrc/dynamic_transform.cpp @@ -446,6 +446,9 @@ void DynamicTransformConcretizer::mutate(TensorView* tv) { // Update the IterType of each output for (auto out_id : ir_utils::filterByType(expr->outputs())) { + if (!out_id->isSymbolic()) { + continue; + } auto concretized_out_id = IterDomainBuilder(out_id).iter_type(iter_type).build(); registerConcretization(out_id, concretized_out_id);