* Removes __restrict__ from PDL kernel headers due to incompatibility with PDL. Adds preprocessor directives based on arch in kernel body to add __restrict__ to retain performance on older architectures. * Simplifies new __restrict__ usage via macro * Add hopper to PDL __restrict__ fix. Co-authored-by: Oliver Simons <osimons@nvidia.com> --------- Co-authored-by: Oliver Simons <osimons@nvidia.com>
44 lines
1.2 KiB
Plaintext
44 lines
1.2 KiB
Plaintext
#include "common.cuh"
|
|
|
|
// Row reduction kernel template - compute sum (norm=false) or mean (norm=true)
|
|
template <bool norm>
|
|
static __global__ void reduce_rows_f32(const float * x_ptr, float * dst_ptr, const int ncols) {
|
|
const float * GGML_CUDA_RESTRICT x = x_ptr;
|
|
float * GGML_CUDA_RESTRICT dst = dst_ptr;
|
|
const int row = blockIdx.x;
|
|
const int col = threadIdx.x;
|
|
|
|
float sum = 0.0f;
|
|
const int num_unroll = 8;
|
|
float temp[num_unroll];
|
|
float sum_temp[num_unroll] = { 0.0f };
|
|
|
|
ggml_cuda_pdl_sync();
|
|
for (int i = col; i < ncols;) {
|
|
for (int j = 0; j < num_unroll; ++j) {
|
|
if (i < ncols) {
|
|
temp[j] = x[row * ncols + i];
|
|
} else {
|
|
temp[j] = 0;
|
|
}
|
|
i += blockDim.x;
|
|
}
|
|
for (int j = 0; j < num_unroll; ++j) {
|
|
sum_temp[j] += temp[j];
|
|
}
|
|
}
|
|
for (int j = 0; j < num_unroll; ++j) {
|
|
sum += sum_temp[j];
|
|
}
|
|
|
|
// sum up partial sums
|
|
__shared__ float shared_vals[32];
|
|
sum = block_reduce<block_reduce_method::SUM>(sum, shared_vals);
|
|
|
|
if (col != 0) {
|
|
return;
|
|
}
|
|
|
|
dst[row] = norm ? sum / ncols : sum;
|
|
}
|