@@ -93,9 +93,51 @@ void compute_one_to_many_inner_product_avx2_int8_12(
9393 float *results);
9494#endif
9595
96+ #if defined(__riscv_vector)
97+ void compute_one_to_many_inner_product_rvv_fp32_1 (
98+ const float *query, const float **ptrs,
99+ std::array<const float *, 1 > &prefetch_ptrs, size_t dimensionality,
100+ float *results);
101+
102+ void compute_one_to_many_inner_product_rvv_fp32_12 (
103+ const float *query, const float **ptrs,
104+ std::array<const float *, 12 > &prefetch_ptrs, size_t dimensionality,
105+ float *results);
106+ #endif
107+
108+ #if defined(__riscv_zvfh)
109+ void compute_one_to_many_inner_product_rvv_fp16_1 (
110+ const ailego::Float16 *query, const ailego::Float16 **ptrs,
111+ std::array<const ailego::Float16 *, 1 > &prefetch_ptrs,
112+ size_t dimensionality, float *results);
113+
114+ void compute_one_to_many_inner_product_rvv_fp16_12 (
115+ const ailego::Float16 *query, const ailego::Float16 **ptrs,
116+ std::array<const ailego::Float16 *, 12 > &prefetch_ptrs,
117+ size_t dimensionality, float *results);
118+ #endif
119+
120+ #if defined(__riscv_vector)
121+ void compute_one_to_many_inner_product_rvv_int8_1 (
122+ const int8_t *query, const int8_t **ptrs,
123+ std::array<const int8_t *, 1 > &prefetch_ptrs, size_t dimensionality,
124+ float *results);
125+
126+ void compute_one_to_many_inner_product_rvv_int8_12 (
127+ const int8_t *query, const int8_t **ptrs,
128+ std::array<const int8_t *, 12 > &prefetch_ptrs, size_t dimensionality,
129+ float *results);
130+ #endif
131+
96132void InnerProductDistanceBatchImpl<float , 1 >::compute_one_to_many(
97133 const ValueType *query, const ValueType **ptrs,
98134 std::array<const ValueType *, 1 > &prefetch_ptrs, size_t dim, float *sums) {
135+ #if defined(__riscv_vector)
136+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_VECTOR ) {
137+ return compute_one_to_many_inner_product_rvv_fp32_1 (
138+ query, ptrs, prefetch_ptrs, dim, sums);
139+ }
140+ #endif
99141#if defined(__AVX2__)
100142 if (zvec::ailego::internal::CpuFeatures::static_flags_.AVX2 ) {
101143 return compute_one_to_many_inner_product_avx2_fp32_1 (
@@ -110,6 +152,12 @@ void InnerProductDistanceBatchImpl<ailego::Float16, 1>::compute_one_to_many(
110152 const ailego::Float16 *query, const ailego::Float16 **ptrs,
111153 std::array<const ailego::Float16 *, 1 > &prefetch_ptrs, size_t dim,
112154 float *sums) {
155+ #if defined(__riscv_zvfh)
156+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_ZVFH ) {
157+ return compute_one_to_many_inner_product_rvv_fp16_1 (
158+ query, ptrs, prefetch_ptrs, dim, sums);
159+ }
160+ #endif
113161#if defined(__AVX512FP16__)
114162 if (zvec::ailego::internal::CpuFeatures::static_flags_.AVX512_FP16 ) {
115163 return compute_one_to_many_inner_product_avx512fp16_fp16_1 (
@@ -135,6 +183,12 @@ void InnerProductDistanceBatchImpl<ailego::Float16, 1>::compute_one_to_many(
135183void InnerProductDistanceBatchImpl<int8_t , 1 >::compute_one_to_many(
136184 const int8_t *query, const int8_t **ptrs,
137185 std::array<const int8_t *, 1 > &prefetch_ptrs, size_t dim, float *sums) {
186+ #if defined(__riscv_vector)
187+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_VECTOR ) {
188+ return compute_one_to_many_inner_product_rvv_int8_1 (
189+ query, ptrs, prefetch_ptrs, dim, sums);
190+ }
191+ #endif
138192// #if defined(__AVX512BW__) // TODO: this version is problematic
139193// return compute_one_to_many_avx512_int8<ValueType, BatchSize>(
140194// query, ptrs, prefetch_ptrs, dim, sums);
@@ -167,6 +221,12 @@ InnerProductDistanceBatchImpl<int8_t, 1>::GetQueryPreprocessFunc() {
167221void InnerProductDistanceBatchImpl<float , 12 >::compute_one_to_many(
168222 const ValueType *query, const ValueType **ptrs,
169223 std::array<const ValueType *, 12 > &prefetch_ptrs, size_t dim, float *sums) {
224+ #if defined(__riscv_vector)
225+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_VECTOR ) {
226+ return compute_one_to_many_inner_product_rvv_fp32_12 (
227+ query, ptrs, prefetch_ptrs, dim, sums);
228+ }
229+ #endif
170230#if defined(__AVX2__)
171231 if (zvec::ailego::internal::CpuFeatures::static_flags_.AVX2 ) {
172232 return compute_one_to_many_inner_product_avx2_fp32_12 (
@@ -181,6 +241,12 @@ void InnerProductDistanceBatchImpl<ailego::Float16, 12>::compute_one_to_many(
181241 const ailego::Float16 *query, const ailego::Float16 **ptrs,
182242 std::array<const ailego::Float16 *, 12 > &prefetch_ptrs, size_t dim,
183243 float *sums) {
244+ #if defined(__riscv_zvfh)
245+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_ZVFH ) {
246+ return compute_one_to_many_inner_product_rvv_fp16_12 (
247+ query, ptrs, prefetch_ptrs, dim, sums);
248+ }
249+ #endif
184250#if defined(__AVX512FP16__)
185251 if (zvec::ailego::internal::CpuFeatures::static_flags_.AVX512_FP16 ) {
186252 return compute_one_to_many_inner_product_avx512fp16_fp16_12 (
@@ -206,6 +272,12 @@ void InnerProductDistanceBatchImpl<ailego::Float16, 12>::compute_one_to_many(
206272void InnerProductDistanceBatchImpl<int8_t , 12 >::compute_one_to_many(
207273 const int8_t *query, const int8_t **ptrs,
208274 std::array<const int8_t *, 12 > &prefetch_ptrs, size_t dim, float *sums) {
275+ #if defined(__riscv_vector)
276+ if (zvec::ailego::internal::CpuFeatures::static_flags_.RISCV_VECTOR ) {
277+ return compute_one_to_many_inner_product_rvv_int8_12 (
278+ query, ptrs, prefetch_ptrs, dim, sums);
279+ }
280+ #endif
209281// #if defined(__AVX512BW__) // TODO: this version is problematic
210282// return compute_one_to_many_avx512_int8<ValueType, BatchSize>(
211283// query, ptrs, prefetch_ptrs, dim, sums);
0 commit comments