diff --git a/csrc/quantization/activation_kernels.cu b/csrc/quantization/activation_kernels.cu index 9d7da85a22..0e01c0d912 100644 --- a/csrc/quantization/activation_kernels.cu +++ b/csrc/quantization/activation_kernels.cu @@ -4,6 +4,7 @@ #include "core/utils.hpp" #include "core/cuda_compat.h" +#include "cuda_vec_utils.cuh" #include "dispatch_utils.h" #include "quantization/w8a8/fp8/common.cuh" @@ -43,7 +44,7 @@ template 16 ? num_tokens > 32 ? 1 : 2 : 4); \ - dim3 block(std::min(d, 512)); \ - const torch::stable::accelerator::DeviceGuard device_guard( \ - input.get_device_index()); \ - const cudaStream_t stream = \ - get_current_cuda_stream(input.get_device_index()); \ - VLLM_STABLE_DISPATCH_FLOATING_TYPES( \ - input.scalar_type(), "act_and_mul_kernel", [&] { \ - VLLM_STABLE_DISPATCH_FP8_TYPES( \ - out.scalar_type(), "act_and_mul_quant_kernel_fp8_type", [&] { \ - vllm::act_and_mul_quant_kernel, \ - fp8_t> \ - <<>>( \ - out.mutable_data_ptr(), \ - input.const_data_ptr(), \ - scale.const_data_ptr(), d); \ - }); \ +#define LAUNCH_ACTIVATION_GATE_KERNEL(KERNEL) \ + int d = input.size(-1) / 2; \ + int64_t num_tokens = input.numel() / input.size(-1); \ + dim3 grid(num_tokens, num_tokens > 16 ? num_tokens > 32 ? 1 : 2 : 4); \ + dim3 block(std::min(d, 512)); \ + const torch::stable::accelerator::DeviceGuard device_guard( \ + input.get_device_index()); \ + const cudaStream_t stream = \ + get_current_cuda_stream(input.get_device_index()); \ + VLLM_STABLE_DISPATCH_FLOATING_TYPES( \ + input.scalar_type(), "act_and_mul_kernel", [&] { \ + VLLM_STABLE_DISPATCH_FP8_TYPES( \ + out.scalar_type(), "act_and_mul_quant_kernel_fp8_type", [&] { \ + const scalar_t* in_ptr = input.const_data_ptr(); \ + fp8_t* out_ptr = out.mutable_data_ptr(); \ + const bool vectorize = d % (16 / sizeof(scalar_t)) == 0 && \ + vllm::is_16byte_aligned(in_ptr) && \ + vllm::is_16byte_aligned(out_ptr); \ + vllm::act_and_mul_quant_kernel, \ + fp8_t> \ + <<>>(out_ptr, in_ptr, \ + scale.const_data_ptr(), \ + d, vectorize); \ + }); \ }); void silu_and_mul_quant(torch::stable::Tensor& out, // [..., d]