@@ -79,13 +79,17 @@ __global__ __launch_bounds__(Ktraits::THREADS_PER_CTA) void ln_bwd_kernel(
7979 Reducer reducer (params, bidm, bidn, warp_m, warp_n, lane, smem_dgrad);
8080
8181 Sum<reduce_t > sum;
82- bool is_rmsnorm = params.mean == nullptr ;
82+ bool is_rmsnorm = ( params.mean == nullptr ) ;
8383 constexpr float rn = 1 .f / static_cast <float >(COLS );
8484 Wvec gamma[LDGS ];
8585 index_t idx = c;
8686#pragma unroll
8787 for (int it = 0 ; it < LDGS ; it++) {
88- gamma[it].load_from (params.scale , idx);
88+ if (params.scale != nullptr ) {
89+ gamma[it].load_from (params.scale , idx);
90+ } else {
91+ gamma[it].init (1 .0f );
92+ }
8993 idx += Ktraits::VEC_COLS_PER_LDG ;
9094 }
9195#pragma unroll 1
@@ -149,7 +153,9 @@ __global__ __launch_bounds__(Ktraits::THREADS_PER_CTA) void ln_bwd_kernel(
149153 compute_t dx_tmp = rs_r * (dy_tmp - (mdyy_local * y_tmp + mdy_local));
150154 dx[it].data .elt [jt] = dx_tmp;
151155 }
152- dx[it].store_to (params.dx , idx);
156+ if (params.dx != nullptr ) {
157+ dx[it].store_to (params.dx , idx);
158+ }
153159 idx += Ktraits::VEC_COLS_PER_LDG ;
154160 }
155161 } // end: grid stride loop
@@ -158,7 +164,7 @@ __global__ __launch_bounds__(Ktraits::THREADS_PER_CTA) void ln_bwd_kernel(
158164 idx = r * Ktraits::VEC_COLS + c;
159165#pragma unroll
160166 for (int it = 0 ; it < LDGS ; it++) {
161- if (params.dbias ) {
167+ if (params.dbias != nullptr ) {
162168 dz_sum[it].store_to (params.dbias_part , idx);
163169 }
164170 dzy_sum[it].store_to (params.dscale_part , idx);
@@ -208,13 +214,17 @@ __global__ __launch_bounds__(Ktraits::THREADS_PER_CTA) void ln_bwd_kernel(
208214 }
209215
210216 compute_t *dgamma_part =
211- static_cast <compute_t *>(params.dscale_part ) + bidm * COLS + tidx;
217+ (params.dscale_part != nullptr )
218+ ? static_cast <compute_t *>(params.dscale_part ) + bidm * COLS + tidx
219+ : nullptr ;
212220 for (int jt = 0 ; jt < NUM_RES ; jt++) {
213- *dgamma_part = cta_dzy_sum[jt];
214- dgamma_part += Ktraits::THREADS_PER_CTA ;
221+ if (dgamma_part != nullptr ) {
222+ *dgamma_part = cta_dzy_sum[jt];
223+ dgamma_part += Ktraits::THREADS_PER_CTA ;
224+ }
215225 }
216226
217- if (params.dbias ) {
227+ if (params.dbias != nullptr ) {
218228 compute_t *dbeta_part =
219229 static_cast <compute_t *>(params.dbias_part ) + bidm * COLS + tidx;
220230 for (int jt = 0 ; jt < NUM_RES ; jt++) {
@@ -275,16 +285,22 @@ __launch_bounds__(Kernel_traits::THREADS_PER_CTA) void ln_bwd_finalize_kernel(
275285 index_t idx = row * Kernel_traits::COLS + col;
276286
277287 Vec<compute_t , NUM_ELT > dbeta_part, dgamma_part;
278- if (params.dbias ) {
288+ if (params.dbias != nullptr ) {
279289 dbeta_part.load_from (params.dbias_part , idx);
280290 } else {
281291 dbeta_part.init (0 .);
282292 }
283- dgamma_part.load_from (params.dscale_part , idx);
293+ if (params.dscale_part != nullptr ) {
294+ dgamma_part.load_from (params.dscale_part , idx);
295+ } else {
296+ dgamma_part.init (0 .);
297+ }
284298#pragma unroll
285299 for (int it = 0 ; it < NUM_ELT ; it++) {
286- dgamma_local.data .elt [it] += dgamma_part.data .elt [it];
287- dbeta_local.data .elt [it] += dbeta_part.data .elt [it];
300+ dgamma_local.data .elt [it] += (dgamma_part.data .elt [it]);
301+ if (params.dbias != nullptr ) {
302+ dbeta_local.data .elt [it] += (dbeta_part.data .elt [it]);
303+ }
288304 }
289305 }
290306
@@ -360,8 +376,10 @@ __launch_bounds__(Kernel_traits::THREADS_PER_CTA) void ln_bwd_finalize_kernel(
360376 dbeta_out2.data .elt [it] =
361377 Converter<src_t , dst_t >::convert (dbeta_vec2.data .elt [it]);
362378 }
363- dgamma_out2.store_to (params.dscale , col_out);
364- if (params.dbias ) {
379+ if (params.dscale != nullptr ) {
380+ dgamma_out2.store_to (params.dscale , col_out);
381+ }
382+ if (params.dbias != nullptr ) {
365383 dbeta_out2.store_to (params.dbias , col_out);
366384 }
367385 }
0 commit comments