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) {