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