From 60e95dbab87ad91abd7a1c2402138a2481c7c5c1 Mon Sep 17 00:00:00 2001 From: Sun Yuechi Date: Wed, 3 Sep 2025 15:29:18 +0800 Subject: [PATCH] inline_memory: optimize mem_is_zero for riscv using RISC-V Vector (RVV) intrinsics On the bpi-f3 device, the output of running ctest -V -R unittest_memory is as follows: size | default | v intrinsic -------------------------------------------- 1024 | 332ms | 92ms -------------------------------------------- 2048 | 657ms | 186ms -------------------------------------------- 4096 | 1290ms | 366ms -------------------------------------------- 8192 | 2572ms | 733ms -------------------------------------------- 65536 | 24836ms | 10004ms Signed-off-by: Sun Yuechi --- src/include/inline_memory.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/include/inline_memory.h b/src/include/inline_memory.h index e2283830103c4..f5378d317dcd2 100644 --- a/src/include/inline_memory.h +++ b/src/include/inline_memory.h @@ -4,6 +4,7 @@ * Ceph - scalable distributed file system * * Copyright (C) 2004-2006 Sage Weil + * Copyright (C) 2025 Sun Yuechi * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -170,6 +171,31 @@ static inline bool mem_is_zero(const char *data, size_t len) { return true; } +#elif defined(__riscv_v_intrinsic) + +#include + +static inline bool mem_is_zero(const char *data, size_t len) { + const uint8_t *p = reinterpret_cast(data); + + while (len > 0) { + size_t vector_len = __riscv_vsetvl_e8m8(len); + + vuint8m8_t v = __riscv_vle8_v_u8m8(p, vector_len); + vbool1_t mask = __riscv_vmsne_vx_u8m8_b1(v, 0, vector_len); + + long idx = __riscv_vfirst_m_b1(mask, vector_len); + if (idx >= 0) { + return false; + } + + p += vector_len; + len -= vector_len; + } + + return true; +} + #else // gcc and x86_64 static inline bool mem_is_zero(const char *data, size_t len) { -- 2.39.5