Files
2026-07-13 13:33:03 +08:00

38 lines
1.1 KiB
C++

#include <climits>
#include <riscv_vector.h>
#define UNIT 4
void MNNVectorTop1Int32(int32_t* input, int32_t* maxValue, int32_t* maxIndex, size_t inputCountUnit) {
size_t n = inputCountUnit * UNIT;
int32_t maxV = INT32_MIN;
int32_t maxIdx = 0;
size_t vl;
for (size_t i = 0; i < n; ) {
vl = __riscv_vsetvl_e32m8(n - i);
vint32m8_t data = __riscv_vle32_v_i32m8(input + i, vl);
vint32m1_t scalar = __riscv_vmv_s_x_i32m1(maxV, vl);
vint32m1_t result = __riscv_vredmax_vs_i32m8_i32m1(data, scalar, vl);
maxV = __riscv_vmv_x_s_i32m1_i32(result);
i += vl;
}
for (size_t i = 0; i < n; ) {
vl = __riscv_vsetvl_e32m8(n - i);
vint32m8_t data = __riscv_vle32_v_i32m8(input + i, vl);
vbool4_t mask = __riscv_vmseq_vx_i32m8_b4(data, maxV, vl);
long first = __riscv_vfirst_m_b4(mask, vl);
if (first >= 0) {
maxIdx = i + first;
break;
}
i += vl;
}
maxValue[0] = maxV;
maxIndex[0] = maxIdx;
}