]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
inline_memory: optimize mem_is_zero for riscv using RISC-V Vector (RVV) intrinsics 65354/head
authorSun Yuechi <sunyuechi@iscas.ac.cn>
Wed, 3 Sep 2025 07:29:18 +0000 (15:29 +0800)
committerSun Yuechi <hlefthleft@gmail.com>
Fri, 5 Sep 2025 02:34:09 +0000 (10:34 +0800)
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 <sunyuechi@iscas.ac.cn>
src/include/inline_memory.h

index e2283830103c49c857b7528fe3d3f31770013883..f5378d317dcd2926b0de2caff630ded18c1b6477 100644 (file)
@@ -4,6 +4,7 @@
  * Ceph - scalable distributed file system
  *
  * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
+ * Copyright (C) 2025 Sun Yuechi <sunyuechi@iscas.ac.cn>
  *
  * 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 <riscv_vector.h>
+
+static inline bool mem_is_zero(const char *data, size_t len) {
+  const uint8_t *p = reinterpret_cast<const uint8_t *>(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) {