From 47e14c052998e9fe10b227c74f63031ce8cfe0be Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons Date: Tue, 25 Feb 2025 09:38:13 +0000 Subject: [PATCH] whisper : restore big endian support (#2816) * whisper : fix BYTESWAP whitespace * whisper : make byteswap useable with C++17 * cmake : define WHISPER_BIG_ENDIAN for big-endian targets * ci : fix (again) arm64 build fails * docker : attempt fixing arm64 build on ci * qemu v7.0.0-28 [imported from https://github.com/ggml-org/llama.cpp /commit/818a340ea8be55b3706e1772527cb8738e90a8c7 (#11895)] --------- Co-authored-by: Xuan-Son Nguyen --- .github/workflows/docker.yml | 2 ++ src/CMakeLists.txt | 4 ++++ src/whisper.cpp | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 30887e32..55f75f0c 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -28,6 +28,8 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 + with: + image: tonistiigi/binfmt:qemu-v7.0.0-28 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff54d645..ea3161db 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -94,6 +94,10 @@ set_target_properties(whisper PROPERTIES target_include_directories(whisper PUBLIC . ../include) target_compile_features (whisper PUBLIC cxx_std_11) # don't bump +if (CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN") + set(WHISPER_EXTRA_FLAGS ${WHISPER_EXTRA_FLAGS} -DWHISPER_BIG_ENDIAN) +endif() + if (WHISPER_EXTRA_FLAGS) target_compile_options(whisper PRIVATE ${WHISPER_EXTRA_FLAGS}) endif() diff --git a/src/whisper.cpp b/src/whisper.cpp index 069aa6e7..447846c9 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -39,17 +39,17 @@ #pragma warning(disable: 4244 4267) // possible loss of data #endif -#if defined(GGML_BIG_ENDIAN) -#include - +#if defined(WHISPER_BIG_ENDIAN) template static T byteswap(T value) { - return std::byteswap(value); -} - -template<> -float byteswap(float value) { - return std::bit_cast(byteswap(std::bit_cast(value))); + T value_swapped; + char * source = reinterpret_cast(&value); + char * target = reinterpret_cast(&value_swapped); + int size = sizeof(T); + for (int i = 0; i < size; i++) { + target[size - 1 - i] = source[i]; + } + return value_swapped; } template @@ -85,14 +85,14 @@ static void byteswap_tensor(ggml_tensor * tensor) { } #define BYTESWAP_VALUE(d) d = byteswap(d) -#define BYTESWAP_FILTERS(f) \ +#define BYTESWAP_FILTERS(f) \ do { \ for (auto & datum : f.data) { \ datum = byteswap(datum); \ } \ } while (0) -#define BYTESWAP_TENSOR(t) \ - do { \ +#define BYTESWAP_TENSOR(t) \ + do { \ byteswap_tensor(t); \ } while (0) #else