From 5298246ac07f4eb7492249397391cb2bdf518dad Mon Sep 17 00:00:00 2001 From: OscarXu Date: Wed, 11 Jun 2025 02:59:12 -0500 Subject: [PATCH] Add result all zero check. --- .../moe_gemm1_xdl_fp8_blockscale.cpp | 21 +++++--- .../moe_gemm2_xdl_fp8_blockscale.cpp | 51 ++++++++++++------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/example/65_gemm_multiply_multiply/moe_gemm1_xdl_fp8_blockscale.cpp b/example/65_gemm_multiply_multiply/moe_gemm1_xdl_fp8_blockscale.cpp index 6e29db76d9..fae18ce008 100644 --- a/example/65_gemm_multiply_multiply/moe_gemm1_xdl_fp8_blockscale.cpp +++ b/example/65_gemm_multiply_multiply/moe_gemm1_xdl_fp8_blockscale.cpp @@ -37,8 +37,8 @@ using A0DataType = F8; using A1DataType = F32; using B0DataType = F8; using B1DataType = F32; -// using EDataType = F16; -using EDataType = BF16; +using EDataType = F16; +// using EDataType = BF16; using AccDataType = F32; using CShuffleDataType = EDataType; using D2DataType = F32; @@ -180,7 +180,7 @@ static constexpr ck::index_t MPerBlock = 64; using DeviceOpInstance = ck::tensor S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 16, 16, 0, S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 16, 16, 0, 4, 2, S<1, 32, 1, 8>, S<2, 1, 1, 1>, - ck::BlockGemmPipelineScheduler::Intrawave, ck::BlockGemmPipelineVersion::v3, ActOP, Nswizzle, true, MulRoutedWeight, int32_t, A0DataType>; + ck::BlockGemmPipelineScheduler::Intrawave, ck::BlockGemmPipelineVersion::v1, ActOP, Nswizzle, true, MulRoutedWeight, int32_t, A0DataType>; #endif // clang-format on @@ -200,8 +200,8 @@ int main(int argc, char* argv[]) // ck::index_t tokens = 8192; // ck::index_t sorted_tile_num = 15; // ck::index_t valid_tile_num = 13; - ck::index_t sorted_tile_num = 259; - ck::index_t valid_tile_num = 256; + ck::index_t sorted_tile_num = 131; + ck::index_t valid_tile_num = 128; ck::index_t tokens = 4096; #else // deepseek @@ -255,6 +255,8 @@ int main(int argc, char* argv[]) exit(0); } + valid_tile_num = tokens * topk / MPerBlock; + sorted_tile_num = valid_tile_num + 3; ck::index_t sorted_size = sorted_tile_num * MPerBlock; ck::index_t valid_size = valid_tile_num * MPerBlock; if(tokens * topk > valid_size) @@ -384,8 +386,8 @@ int main(int argc, char* argv[]) DeviceMem d2_device_buf(sizeof(D2DataType) * d2_e_n.mDesc.GetElementSpaceSize()); DeviceMem e_device_buf(sizeof(EDataType) * e_t_n_device_result.mDesc.GetElementSpaceSize()); // a0_t_k.savetxt("a.txt"); - expert_ids.savetxt("expert_ids.txt", "int"); - sorted_token_ids.savetxt("sorted_token_ids.txt", "int"); + // expert_ids.savetxt("expert_ids.txt", "int"); + // sorted_token_ids.savetxt("sorted_token_ids.txt", "int"); // d2_e_n.savetxt("d2_e_n.txt", "int"); sorted_token_ids_dev.ToDevice(sorted_token_ids.mData.data()); expert_ids_dev.ToDevice(expert_ids.mData.data()); @@ -515,6 +517,7 @@ int main(int argc, char* argv[]) PassThrough{}); ref_invoker.Run(ref_argument); + bool host_all_zero = true; for(int m = 0; m < valid_size; ++m) { @@ -530,6 +533,7 @@ int main(int argc, char* argv[]) { e_t_n_host_result(t, topk_id, n) = ck::type_convert(c_t_k_n(t, topk_id, n)); + host_all_zero = host_all_zero && !e_t_n_host_result(t, topk_id, n); } } @@ -542,6 +546,9 @@ int main(int argc, char* argv[]) : 1; if(status == 0) { + if (host_all_zero){ + printf("WARNING: All results are zero. "); + } printf("Validation Pass.\n"); } return status; diff --git a/example/65_gemm_multiply_multiply/moe_gemm2_xdl_fp8_blockscale.cpp b/example/65_gemm_multiply_multiply/moe_gemm2_xdl_fp8_blockscale.cpp index 7e8697492f..4d7fd90d9d 100644 --- a/example/65_gemm_multiply_multiply/moe_gemm2_xdl_fp8_blockscale.cpp +++ b/example/65_gemm_multiply_multiply/moe_gemm2_xdl_fp8_blockscale.cpp @@ -184,24 +184,15 @@ int main(int argc, char* argv[]) bool do_verification = true; int init_method = 1; bool time_kernel = true; - - // tokens = 1 - // topk = 1 - // experts = 8 - // per expert: - - constexpr ck::index_t valid_tile_num = - 26; // 13 for 128; 52 for 32; 4096 for ds // > token * topk / MPerBlock - constexpr ck::index_t sorted_tile_num = valid_tile_num + 3; - ck::index_t sorted_size = sorted_tile_num * MPerBlock; - ck::index_t valid_size = valid_tile_num * MPerBlock; #if 1 // GEMM shape ck::index_t N = 6144; ck::index_t K = 4096; ck::index_t experts = 8; - ck::index_t tokens = 832; ck::index_t topk = 2; + ck::index_t valid_tile_num = 128; + ck::index_t sorted_tile_num = valid_tile_num + 3; + ck::index_t tokens = 4096; #else // deepseek ck::index_t N = 2048; @@ -231,6 +222,18 @@ int main(int argc, char* argv[]) K = std::stoi(argv[5]); tokens = std::stoi(argv[6]); } + else if(argc == 9) + { + + do_verification = std::stoi(argv[1]); + init_method = std::stoi(argv[2]); + time_kernel = std::stoi(argv[3]); + N = std::stoi(argv[4]); + K = std::stoi(argv[5]); + tokens = std::stoi(argv[6]); + sorted_tile_num = std::stoi(argv[7]); + valid_tile_num = std::stoi(argv[8]); + } else { printf("arg1: verification (0=no, 1=yes)\n"); @@ -240,6 +243,15 @@ int main(int argc, char* argv[]) exit(0); } + valid_tile_num = tokens * topk / MPerBlock; + sorted_tile_num = valid_tile_num + 3; + ck::index_t sorted_size = sorted_tile_num * MPerBlock; + ck::index_t valid_size = valid_tile_num * MPerBlock; + if(tokens * topk > valid_size) + { + printf("err config, tokens * topk > valid_size\n"); + exit(-1); + } ck::index_t StrideA = K; ck::index_t StrideB = K; ck::index_t StrideE = N; @@ -270,12 +282,8 @@ int main(int argc, char* argv[]) { expert_ids.mData[i] = i / ck::math::integer_divide_ceil(valid_tile_num, experts); } - if(tokens * topk > valid_size) - { - printf("err config, tokens * topk > valid_size\n"); - exit(-1); - } - int token_per_tile = tokens * topk / valid_tile_num; + + int token_per_tile = (tokens * topk + valid_tile_num - 1) / valid_tile_num; int tokenid = 0; for(int i = 0; i < sorted_size; i++) @@ -448,7 +456,7 @@ int main(int argc, char* argv[]) float ave_time = invoker.Run(argument, StreamConfig{nullptr, time_kernel}); std::size_t flop = std::size_t(2) * tokens * topk * N * K; - std::size_t num_btype = sizeof(A0DataType) * tokens * K * topk + + std::size_t num_btype = sizeof(A0DataType) * valid_tile_num * K + sizeof(B0DataType) * K * N * experts + sizeof(EDataType) * tokens * N; @@ -520,12 +528,14 @@ int main(int argc, char* argv[]) cde_element_op); ref_invoker.Run(ref_argument); + bool host_all_zero = true; for(int t = 0; t < tokens; ++t) { for(int n = 0; n < N; ++n) { e_t_n_host_result(t, n) = ck::type_convert(c_t_n(t, n)); + host_all_zero = host_all_zero && !e_t_n_host_result(t, n); } } @@ -561,6 +571,9 @@ int main(int argc, char* argv[]) : 1; if(status == 0) { + if (host_all_zero){ + printf("WARNING: All results are zero. "); + } printf("Validation Pass.\n"); } return status;