@@ -949,24 +949,32 @@ static void quantize_row_q4_0(const float * restrict x, void * restrict vy, int
949
949
}
950
950
#elif defined(__wasm_simd128__ )
951
951
for (int i = 0 ; i < nb ; i ++ ) {
952
- float amax = 0.0f ; // absolute max
952
+ float max = 0.0f ;
953
+ float min = 0.0f ;
953
954
954
955
v128_t srcv [8 ];
955
- v128_t asrcv [8 ];
956
- v128_t amaxv [8 ];
956
+ v128_t maxv [8 ];
957
+ v128_t minv [8 ];
957
958
958
959
for (int l = 0 ; l < 8 ; l ++ ) srcv [l ] = wasm_v128_load (x + i * 32 + 4 * l );
959
- for (int l = 0 ; l < 8 ; l ++ ) asrcv [l ] = wasm_f32x4_abs (srcv [l ]);
960
960
961
- for (int l = 0 ; l < 4 ; l ++ ) amaxv [2 * l ] = wasm_f32x4_max (asrcv [2 * l ], asrcv [2 * l + 1 ]);
962
- for (int l = 0 ; l < 2 ; l ++ ) amaxv [4 * l ] = wasm_f32x4_max (amaxv [4 * l ], amaxv [4 * l + 2 ]);
963
- for (int l = 0 ; l < 1 ; l ++ ) amaxv [8 * l ] = wasm_f32x4_max (amaxv [8 * l ], amaxv [8 * l + 4 ]);
961
+ for (int l = 0 ; l < 4 ; l ++ ) maxv [2 * l ] = wasm_f32x4_max (srcv [2 * l ], srcv [2 * l + 1 ]);
962
+ for (int l = 0 ; l < 2 ; l ++ ) maxv [4 * l ] = wasm_f32x4_max (maxv [4 * l ], maxv [4 * l + 2 ]);
963
+ for (int l = 0 ; l < 1 ; l ++ ) maxv [8 * l ] = wasm_f32x4_max (maxv [8 * l ], maxv [8 * l + 4 ]);
964
964
965
- amax = MAX (
966
- MAX ( wasm_f32x4_extract_lane ( amaxv [ 0 ], 0 ), wasm_f32x4_extract_lane ( amaxv [ 0 ], 1 )),
967
- MAX ( wasm_f32x4_extract_lane ( amaxv [ 0 ], 2 ), wasm_f32x4_extract_lane ( amaxv [ 0 ], 3 )) );
965
+ for ( int l = 0 ; l < 4 ; l ++ ) minv [ 2 * l ] = wasm_f32x4_min ( srcv [ 2 * l ], srcv [ 2 * l + 1 ]);
966
+ for ( int l = 0 ; l < 2 ; l ++ ) minv [ 4 * l ] = wasm_f32x4_min ( minv [ 4 * l ], minv [ 4 * l + 2 ]);
967
+ for ( int l = 0 ; l < 1 ; l ++ ) minv [ 8 * l ] = wasm_f32x4_min ( minv [ 8 * l ], minv [ 8 * l + 4 ] );
968
968
969
- const float d = amax / ((1 << 3 ) - 1 );
969
+ max = MAX (
970
+ MAX (wasm_f32x4_extract_lane (maxv [0 ], 0 ), wasm_f32x4_extract_lane (maxv [0 ], 1 )),
971
+ MAX (wasm_f32x4_extract_lane (maxv [0 ], 2 ), wasm_f32x4_extract_lane (maxv [0 ], 3 )));
972
+ min = MIN (
973
+ MIN (wasm_f32x4_extract_lane (minv [0 ], 0 ), wasm_f32x4_extract_lane (minv [0 ], 1 )),
974
+ MIN (wasm_f32x4_extract_lane (minv [0 ], 2 ), wasm_f32x4_extract_lane (minv [0 ], 3 )));
975
+
976
+ const float magnitude = max >= fabsf (min ) ? max : min ;
977
+ const float d = magnitude / -8 ;
970
978
const float id = d ? 1.0 /d : 0.0 ;
971
979
972
980
y [i ].d = d ;
@@ -975,9 +983,10 @@ static void quantize_row_q4_0(const float * restrict x, void * restrict vy, int
975
983
const v128_t v = wasm_f32x4_mul (srcv [l ], wasm_f32x4_splat (id ));
976
984
const v128_t vf = wasm_f32x4_add (v , wasm_f32x4_splat (8.5f ));
977
985
const v128_t vi = wasm_i32x4_trunc_sat_f32x4 (vf );
986
+ const v128_t vc = wasm_i32x4_min_u (vi , wasm_i32x4_splat (15 ));
978
987
979
- y [i ].qs [2 * l + 0 ] = wasm_i32x4_extract_lane (vi , 0 ) | (wasm_i32x4_extract_lane (vi , 1 ) << 4 );
980
- y [i ].qs [2 * l + 1 ] = wasm_i32x4_extract_lane (vi , 2 ) | (wasm_i32x4_extract_lane (vi , 3 ) << 4 );
988
+ y [i ].qs [2 * l + 0 ] = wasm_i32x4_extract_lane (vc , 0 ) | (wasm_i32x4_extract_lane (vc , 1 ) << 4 );
989
+ y [i ].qs [2 * l + 1 ] = wasm_i32x4_extract_lane (vc , 2 ) | (wasm_i32x4_extract_lane (vc , 3 ) << 4 );
981
990
}
982
991
}
983
992
#else
0 commit comments