@@ -9003,8 +9003,7 @@ static void ggml_compute_forward_ssm_scan_f32(
90039003 GGML_ASSERT (src4->nb [0 ] == sizeof (float ));
90049004 GGML_ASSERT (src5->nb [0 ] == sizeof (float ));
90059005 GGML_ASSERT (src6->nb [0 ] == sizeof (int32_t ));
9006- // allows optimizing the modulo since n_group should be a power of 2
9007- GGML_ASSERT ((ng & -ng) == ng);
9006+ GGML_ASSERT (nh % ng == 0 );
90089007
90099008 // heads per thread
90109009 const int dh = (nh + nth - 1 )/nth;
@@ -9035,6 +9034,7 @@ static void ggml_compute_forward_ssm_scan_f32(
90359034 // ref: https://github.com/state-spaces/mamba/blob/62db608da60f6fc790b8ed9f4b3225e95ca15fde/mamba_ssm/ops/triton/softplus.py#L16
90369035 const float dt_soft_plus = dt[h] <= 20 .0f ? log1pf (expf (dt[h])) : dt[h];
90379036 const float dA = expf (dt_soft_plus * A[h]);
9037+ const int g = h / (nh / ng); // repeat_interleave
90389038
90399039 // dim
90409040 for (int i1 = 0 ; i1 < nr; ++i1) {
@@ -9057,8 +9057,8 @@ static void ggml_compute_forward_ssm_scan_f32(
90579057 // TODO: maybe unroll more?
90589058 for (int j = 0 ; j < 1 ; j++) {
90599059 GGML_F32_VEC t0 = GGML_F32_VEC_LOAD (s0 + i + j*ggml_f32_epr + ii*nc);
9060- GGML_F32_VEC t1 = GGML_F32_VEC_LOAD (B + i + j*ggml_f32_epr + (h & (ng - 1 )) *nc);
9061- GGML_F32_VEC t2 = GGML_F32_VEC_LOAD (C + i + j*ggml_f32_epr + (h & (ng - 1 )) *nc);
9060+ GGML_F32_VEC t1 = GGML_F32_VEC_LOAD (B + i + j*ggml_f32_epr + g *nc);
9061+ GGML_F32_VEC t2 = GGML_F32_VEC_LOAD (C + i + j*ggml_f32_epr + g *nc);
90629062
90639063 t0 = GGML_F32_VEC_MUL (t0, adA);
90649064 t1 = GGML_F32_VEC_MUL (t1, axdt);
@@ -9090,8 +9090,8 @@ static void ggml_compute_forward_ssm_scan_f32(
90909090 for (int i = 0 ; i < np; i += GGML_F32_STEP) {
90919091 for (int j = 0 ; j < GGML_F32_ARR; j++) {
90929092 ax[j] = GGML_F32_VEC_LOAD (s0 + i + j*GGML_F32_EPR + ii*nc);
9093- ay[j] = GGML_F32_VEC_LOAD (B + i + j*GGML_F32_EPR + (h & (ng - 1 )) *nc);
9094- az[j] = GGML_F32_VEC_LOAD (C + i + j*GGML_F32_EPR + (h & (ng - 1 )) *nc);
9093+ ay[j] = GGML_F32_VEC_LOAD (B + i + j*GGML_F32_EPR + g *nc);
9094+ az[j] = GGML_F32_VEC_LOAD (C + i + j*GGML_F32_EPR + g *nc);
90959095
90969096 ax[j] = GGML_F32_VEC_MUL (ax[j], adA);
90979097 ay[j] = GGML_F32_VEC_MUL (ay[j], axdt);
@@ -9113,7 +9113,7 @@ static void ggml_compute_forward_ssm_scan_f32(
91139113 // d_state
91149114 for (int i0 = np; i0 < nc; ++i0) {
91159115 const int i = i0 + ii*nc;
9116- const int ig = i0 + (h & (ng - 1 )) *nc;
9116+ const int ig = i0 + g *nc;
91179117 // state = prev_state * dA + dB * x
91189118 const float state = (s0[i] * dA) + (B[ig] * x_dt);
91199119 // y = rowwise_dotprod(state, C)
@@ -9130,6 +9130,7 @@ static void ggml_compute_forward_ssm_scan_f32(
91309130 for (int h = ih0; h < ih1; ++h) {
91319131 // ref: https://github.com/state-spaces/mamba/blob/62db608da60f6fc790b8ed9f4b3225e95ca15fde/mamba_ssm/ops/triton/softplus.py#L16
91329132 const float dt_soft_plus = dt[h] <= 20 .0f ? log1pf (expf (dt[h])) : dt[h];
9133+ const int g = h / (nh / ng); // repeat_interleave
91339134
91349135 // dim
91359136 for (int i1 = 0 ; i1 < nr; ++i1) {
@@ -9144,8 +9145,8 @@ static void ggml_compute_forward_ssm_scan_f32(
91449145 // TODO: what happens when (d_state % svcntw()) != 0?
91459146 for (int64_t k = 0 ; k < nc; k += svcntw ()) {
91469147 svfloat32_t vA = GGML_F32_VEC_LOAD (&A[h*nc + k]);
9147- svfloat32_t vB = GGML_F32_VEC_LOAD (&B[k + (h & (ng - 1 )) *nc]);
9148- svfloat32_t vC = GGML_F32_VEC_LOAD (&C[k + (h & (ng - 1 )) *nc]);
9148+ svfloat32_t vB = GGML_F32_VEC_LOAD (&B[k + g *nc]);
9149+ svfloat32_t vC = GGML_F32_VEC_LOAD (&C[k + g *nc]);
91499150 svfloat32_t vs0 = GGML_F32_VEC_LOAD (&s0[ii*nc + k]);
91509151
91519152 svfloat32_t t1 = GGML_F32_VEC_MUL (vdt_soft_plus, vA);
@@ -9165,7 +9166,7 @@ static void ggml_compute_forward_ssm_scan_f32(
91659166 // d_state
91669167 for (int i0 = 0 ; i0 < nc; ++i0) {
91679168 const int i = i0 + ii*nc;
9168- const int ig = i0 + (h & (ng - 1 )) *nc;
9169+ const int ig = i0 + g *nc;
91699170 // state = prev_state * dA + dB * x
91709171 const float state = (s0[i] * expf (dt_soft_plus * A[i0 + h*nc])) + (B[ig] * x_dt);
91719172 // y = rowwise_dotprod(state, C)
0 commit comments