From 727d578ca9ba24cd3196725ea59b158d82372d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Pietil=C3=A4?= <> Date: Thu, 10 Jul 2025 15:30:30 +0000 Subject: [PATCH] Remove oversubscription. --- ...ce_grouped_conv_bwd_weight_two_stage_xdl_cshuffle.hpp | 4 ++-- .../impl/device_grouped_conv_bwd_weight_xdl_cshuffle.hpp | 4 ++-- .../device_grouped_conv_bwd_weight_xdl_cshuffle_v3.hpp | 4 ++-- .../tensor_operation/gpu/device/impl/split_k_utils.hpp | 9 +++------ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_two_stage_xdl_cshuffle.hpp b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_two_stage_xdl_cshuffle.hpp index 9602fbaee0..070965c299 100644 --- a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_two_stage_xdl_cshuffle.hpp +++ b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_two_stage_xdl_cshuffle.hpp @@ -655,8 +655,8 @@ struct DeviceGroupedConvBwdWeightTwoStage_Xdl_CShuffle const auto gemmM = a_grid_desc_kbatch_k0_m_k1.GetLength(I1); const auto gemmN = b_grid_desc_kbatch_k0_n_k1.GetLength(I1); - const auto grid_size_mn = GridwiseGemm::Block2CTileMap::CalculateGridSize(gemmM, gemmN); - k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size_mn, Conv_G_); + const auto grid_size = GridwiseGemm::Block2CTileMap::CalculateGridSize(gemmM, gemmN) * Conv_G_; + k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size); // Ensure that k_batch_ does not exceed the maximum value // for the GEMM pipeline diff --git a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle.hpp b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle.hpp index 649f6e6a7c..da98cd6f71 100644 --- a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle.hpp +++ b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle.hpp @@ -551,8 +551,8 @@ struct DeviceGroupedConvBwdWeight_Xdl_CShuffle const auto& c_grid_desc_m_n = descs_initial[I2]; const auto& block_2_ctile_map = GridwiseGemm::MakeCBlockClusterAdaptor(c_grid_desc_m_n, M01, N01, k_batch_initial); - const auto grid_size_mn = block_2_ctile_map.CalculateGridSize(c_grid_desc_m_n); - k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size_mn, Conv_G_); + const auto grid_size = block_2_ctile_map.CalculateGridSize(c_grid_desc_m_n) * Conv_G_; + k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size); } else { diff --git a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle_v3.hpp b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle_v3.hpp index aa26559dca..9bbfafd72b 100644 --- a/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle_v3.hpp +++ b/include/ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_weight_xdl_cshuffle_v3.hpp @@ -520,8 +520,8 @@ struct DeviceGroupedConvBwdWeight_Xdl_CShuffleV3 const auto gemmM = a_grid_desc_kbatch_k0_m_k1.GetLength(I1); const auto gemmN = b_grid_desc_kbatch_k0_n_k1.GetLength(I1); - const auto grid_size_mn = GridwiseGemm::Block2CTileMap::CalculateGridSize(gemmM, gemmN); - k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size_mn, Conv_G_); + const auto grid_size = GridwiseGemm::Block2CTileMap::CalculateGridSize(gemmM, gemmN) * Conv_G_; + k_batch_ = get_best_occupancy_k_batch_value(max_occupancy.value_, grid_size); // Ensure that k_batch_ does not exceed the maximum value // for the GEMM pipeline diff --git a/include/ck/tensor_operation/gpu/device/impl/split_k_utils.hpp b/include/ck/tensor_operation/gpu/device/impl/split_k_utils.hpp index 87802fa7c3..8bd3056d2b 100644 --- a/include/ck/tensor_operation/gpu/device/impl/split_k_utils.hpp +++ b/include/ck/tensor_operation/gpu/device/impl/split_k_utils.hpp @@ -27,15 +27,13 @@ struct DeviceProperties int num_cu_; }; -inline ck::index_t get_best_occupancy_k_batch_value(int max_occupancy, ck::index_t grid_size_mn, ck::index_t num_conv_groups) +inline ck::index_t get_best_occupancy_k_batch_value(int max_occupancy, ck::index_t grid_size) { static DeviceProperties device_properties; const int max_capacity = max_occupancy * device_properties.num_cu_; - // Empirically, when we have more than one group, we can oversubscribe by the number of groups. - // This is because the groups are independent and can be processed in parallel. ck::index_t k_batch = 1; - const auto optimal_split = static_cast(std::floor((1.0 * max_capacity) / (grid_size_mn))); + const auto optimal_split = static_cast(std::floor((1.0 * max_capacity) / grid_size)); if (optimal_split > 1) { k_batch = optimal_split; @@ -44,8 +42,7 @@ inline ck::index_t get_best_occupancy_k_batch_value(int max_occupancy, ck::index if (ck::EnvIsEnabled(CK_ENV(CK_LOGGING))) { std::cout << "[SPLIT-K AUTODEDUCE] Max active thread blocks per CU for GEMM kernel: " << max_occupancy << std::endl; - std::cout << "[SPLIT-K AUTODEDUCE] Output grid size: " << grid_size_mn << std::endl; - std::cout << "[SPLIT-K AUTODEDUCE] Number of conv groups: " << num_conv_groups << std::endl; + std::cout << "[SPLIT-K AUTODEDUCE] Output grid size: " << grid_size << std::endl; std::cout << "[SPLIT-K AUTODEDUCE] Optimal split-k value " << k_batch << std::endl; } return k_batch;