diff --git a/onnxruntime/contrib_ops/rocm/bert/skip_layer_norm_tunable_op.h b/onnxruntime/contrib_ops/rocm/bert/skip_layer_norm_tunable_op.h index b37ed32563..4354b79414 100644 --- a/onnxruntime/contrib_ops/rocm/bert/skip_layer_norm_tunable_op.h +++ b/onnxruntime/contrib_ops/rocm/bert/skip_layer_norm_tunable_op.h @@ -78,75 +78,44 @@ template Status SkipLayerNormStaticSelection(const SkipLayerNormParams* params) { bool hasBias = (params->bias == nullptr) ? false : true; bool hasSkipInputBiasAdditionOutput = (params->skip_input_bias_add_output == nullptr) ? false : true; + const int grid_size = params->element_count / params->ld; + const int block_size = 256; + +#define LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(ELEMENTS, TPB, ILP) \ + if (params->ld <= ELEMENTS) { \ + SkipLayerNormKernelSmall<<stream>>>( \ + params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, \ + maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, \ + hasBias, hasSkipInputBiasAdditionOutput); \ + break; \ + } if (0 == (params->ld % 4)) { - const int grid_size = params->element_count / params->ld; - if (params->ld <= 32) { - constexpr int block_size = 32; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 64) { - constexpr int block_size = 64 / 2; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 128) { - constexpr int block_size = 128 / 4; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 384) { - constexpr int block_size = 384 / 4; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 768) { - constexpr int block_size = 768 / 4; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 1024) { - constexpr int block_size = 1024 / 4; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else { - constexpr int block_size = 256; + do { + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(32, 32, 1) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(64, 32, 2) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(128, 32, 4) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(384, 96, 4) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(768, 192, 4) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(1024, 256, 4) + SkipLayerNormKernel<<stream>>>( params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output); - } + } while (0); } else { - const int grid_size = params->element_count / params->ld; - if (params->ld <= 32) { - constexpr int block_size = 32; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 64) { - constexpr int block_size = 64; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld <= 128) { - constexpr int block_size = 128; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else if (params->ld == 384) { - constexpr int block_size = 384; - SkipLayerNormKernelSmall<<stream>>>( - params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, - maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output, hasBias, hasSkipInputBiasAdditionOutput); - } else { - constexpr int block_size = 256; + do { + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(32, 32, 1) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(64, 64, 1) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(128, 128, 1) + LAUNCH_SKIPLAYERNORM_SMALL_FORWARD(384, 384, 1) + SkipLayerNormKernel<<stream>>>( params->ld, params->input, params->skip, params->beta, params->gamma, params->bias, maybe2half(params->epsilon), params->output, params->skip_input_bias_add_output); - } + } while (0); } return HIP_CALL(hipPeekAtLastError()); -} +} // namespace rocm #define ADD_OP_FOR_ALL_VEC_SIZE(name, threads_per_block) \ this->RegisterOp(name); \