You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2022/08/30 15:11:07 UTC

[pulsar] branch master updated: Unify arm crc32c hw checksum provider interface (#17271)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new a3488ac0938 Unify arm crc32c hw checksum provider interface (#17271)
a3488ac0938 is described below

commit a3488ac0938e1ea5d9ba8b39b9c6ddea80937dea
Author: Kai Wang <kw...@streamnative.io>
AuthorDate: Tue Aug 30 23:10:56 2022 +0800

    Unify arm crc32c hw checksum provider interface (#17271)
---
 pulsar-client-cpp/lib/checksum/ChecksumProvider.cc | 44 ++++++++--------------
 pulsar-client-cpp/lib/checksum/ChecksumProvider.h  |  2 -
 pulsar-client-cpp/lib/checksum/crc32c_arm.cc       |  2 +-
 pulsar-client-cpp/tests/ClientTest.cc              | 14 +------
 4 files changed, 17 insertions(+), 45 deletions(-)

diff --git a/pulsar-client-cpp/lib/checksum/ChecksumProvider.cc b/pulsar-client-cpp/lib/checksum/ChecksumProvider.cc
index b8836aa5f65..390e55c7c6b 100644
--- a/pulsar-client-cpp/lib/checksum/ChecksumProvider.cc
+++ b/pulsar-client-cpp/lib/checksum/ChecksumProvider.cc
@@ -19,21 +19,21 @@
 #include "ChecksumProvider.h"
 
 #include <assert.h>
-#include "crc32c_sse42.h"
+#if defined(__ARM_FEATURE_CRC32)
 #include "crc32c_arm.h"
+#else
+#include "crc32c_sse42.h"
+#endif
 #include "crc32c_sw.h"
 
 namespace pulsar {
 bool isCrc32cSupported = crc32cSupported();
 
-#if defined(HAVE_ARM64_CRC)
-
-bool isCrc32ArmSupported = crc32cArmSupported();
-
-bool crc32cArmSupported() { return crc32c_arm64_initialize(); }
-#endif
-
+#if defined(__ARM_FEATURE_CRC32)
+bool crc32cSupported() { return crc32c_arm64_initialize(); }
+#else
 bool crc32cSupported() { return crc32c_initialize(); }
+#endif
 
 /**
  *  computes crc32c checksum: uses sse4.2 hardware-instruction to compute crc32c if machine supports else it
@@ -47,38 +47,24 @@ bool crc32cSupported() { return crc32c_initialize(); }
 uint32_t computeChecksum(uint32_t previousChecksum, const void* data, int length) {
     if (isCrc32cSupported) {
         return crc32cHw(previousChecksum, data, length);
-    }
-#ifdef HAVE_ARM64_CRYPTO
-    else if (isCrc32ArmSupported) {
-        return crc32cHwArm(previousChecksum, data, length);
-    }
-#endif
-    else {
+    } else {
         return crc32cSw(previousChecksum, data, length);
     }
 }
 
 /**
- * Computes crc32c using hardware sse4.2 instruction
+ * Computes crc32c using hardware instruction
  */
 uint32_t crc32cHw(uint32_t previousChecksum, const void* data, int length) {
     assert(isCrc32cSupported);
-    return crc32c(previousChecksum, data, length, 0);
-}
-
-#if defined(HAVE_ARM64_CRC)
-/**
- * Computes crc32c using hardware neon instruction
- */
-uint32_t crc32cHwArm(uint32_t previousChecksum, const void* data, int length) {
-    assert(isCrc32ArmSupported);
+#if defined(__ARM_FEATURE_CRC32)
+    // Use hardware nano instruction
     return crc32c_arm64(previousChecksum, data, length);
-}
 #else
-uint32_t crc32cHwArm(uint32_t previousChecksum, const void* data, int length) {
-    return crc32c_sw(previousChecksum, data, length);  // fallback to the software implementation
-}
+    // Use hardware sse4.2 instruction
+    return crc32c(previousChecksum, data, length, 0);
 #endif
+}
 
 /**
  * Computes crc32c using sw crc-table algo
diff --git a/pulsar-client-cpp/lib/checksum/ChecksumProvider.h b/pulsar-client-cpp/lib/checksum/ChecksumProvider.h
index af4fe3ea2b7..378b32175dd 100644
--- a/pulsar-client-cpp/lib/checksum/ChecksumProvider.h
+++ b/pulsar-client-cpp/lib/checksum/ChecksumProvider.h
@@ -25,10 +25,8 @@
 namespace pulsar {
 
 PULSAR_PUBLIC bool crc32cSupported();
-PULSAR_PUBLIC bool crc32cArmSupported();
 PULSAR_PUBLIC uint32_t computeChecksum(uint32_t previousChecksum, const void *data, int length);
 PULSAR_PUBLIC uint32_t crc32cHw(uint32_t previousChecksum, const void *data, int length);
-PULSAR_PUBLIC uint32_t crc32cHwArm(uint32_t previousChecksum, const void *data, int length);
 PULSAR_PUBLIC uint32_t crc32cSw(uint32_t previousChecksum, const void *data, int length);
 }  // namespace pulsar
 
diff --git a/pulsar-client-cpp/lib/checksum/crc32c_arm.cc b/pulsar-client-cpp/lib/checksum/crc32c_arm.cc
index d9e465ac232..d937a16756c 100644
--- a/pulsar-client-cpp/lib/checksum/crc32c_arm.cc
+++ b/pulsar-client-cpp/lib/checksum/crc32c_arm.cc
@@ -206,4 +206,4 @@ uint32_t crc32c_arm64(uint32_t crc, const void *data, size_t len) {
 }
 
 }  // namespace pulsar
-#endif
\ No newline at end of file
+#endif
diff --git a/pulsar-client-cpp/tests/ClientTest.cc b/pulsar-client-cpp/tests/ClientTest.cc
index 58c889f074a..cac6a81a561 100644
--- a/pulsar-client-cpp/tests/ClientTest.cc
+++ b/pulsar-client-cpp/tests/ClientTest.cc
@@ -61,15 +61,10 @@ TEST(ClientTest, testSwHwChecksum) {
     // (b) SW
     uint32_t swChecksum1 = crc32cSw(0, (char *)data.c_str(), data.length());
     uint32_t swChecksum2 = crc32cSw(0, (char *)doubleData.c_str() + 4, 4);
-    // (c) HW ARM
-    uint32_t hwArmChecksum1 = crc32cHwArm(0, (char *)data.c_str(), data.length());
-    uint32_t hwArmChecksum2 = crc32cHwArm(0, (char *)doubleData.c_str() + 4, 4);
 
     ASSERT_EQ(hwChecksum1, hwChecksum2);
     ASSERT_EQ(hwChecksum1, swChecksum1);
     ASSERT_EQ(hwChecksum2, swChecksum2);
-    ASSERT_EQ(hwArmChecksum1, swChecksum1);
-    ASSERT_EQ(hwArmChecksum2, swChecksum2);
 
     //(2) compute incremental checksum
     // (a.1) hw: checksum on full data
@@ -85,14 +80,7 @@ TEST(ClientTest, testSwHwChecksum) {
     uint32_t swIncrementalChecksum = crc32cSw(swChecksum1, (char *)data.c_str(), data.length());
     ASSERT_EQ(hwIncrementalChecksum, hwDoubleChecksum);
     ASSERT_EQ(hwIncrementalChecksum, swIncrementalChecksum);
-    // (c.1) hw arm: checksum on full data
-    uint32_t hwArmDoubleChecksum = crc32cHwArm(0, (char *)doubleData.c_str(), doubleData.length());
-    // (c.2) hw arm: incremental checksum on multiple partial data
-    hwArmChecksum1 = crc32cHwArm(0, (char *)data.c_str(), data.length());
-    uint32_t hwArmIncrementalChecksum = crc32cHw(hwArmChecksum1, (char *)data.c_str(), data.length());
-    ASSERT_EQ(swDoubleChecksum, hwArmDoubleChecksum);
-    ASSERT_EQ(hwArmIncrementalChecksum, hwArmDoubleChecksum);
-    ASSERT_EQ(hwArmIncrementalChecksum, swIncrementalChecksum);
+    ASSERT_EQ(hwIncrementalChecksum, swIncrementalChecksum);
 }
 
 TEST(ClientTest, testServerConnectError) {