17 const float *gamma,
size_t gamma_elements,
const float *beta,
size_t beta_elements,
18 float *output,
size_t output_elements,
size_t output_stride,
19 float *scratch,
size_t scratch_elements,
size_t rows,
size_t channels,
float epsilon) {
24 input_elements < ni || output_elements < no || gamma_elements < channels ||
25 beta_elements < channels || scratch_elements < ns)
return -2;
37 for (
size_t r = 0; r < rows; ++r)
39 float *means = scratch + rows * channels;
40 float *rstd = means + rows;
41 for (
size_t r = 0; r < rows; ++r) {
45 scratch + r * channels, means + r, rstd + r, 1, (
int)channels, epsilon);
46 if (!isfinite(means[r]) || !isfinite(rstd[r]) ||
49 for (
size_t r = 0; r < rows; ++r)
50 memcpy(output + r * output_stride, scratch + r * channels, channels *
sizeof(
float));
void layernorm_naive_serial_matched_precision(const float *input, const float *gamma, const float *beta, float *output, float *mean_cache, float *rstd_cache, int tokens, int d_model, float eps)
int layernorm_rows_checked_f32(const float *input, size_t input_elements, size_t input_stride, const float *gamma, size_t gamma_elements, const float *beta, size_t beta_elements, float *output, size_t output_elements, size_t output_stride, float *scratch, size_t scratch_elements, size_t rows, size_t channels, float epsilon)