|
17 | 17 | #include <regex> |
18 | 18 | #include <random> |
19 | 19 |
|
| 20 | +#if defined(GGML_BIG_ENDIAN) |
| 21 | +#include <bit> |
| 22 | + |
| 23 | +template<typename T> |
| 24 | +static T byteswap(T value) { |
| 25 | + return std::byteswap(value); |
| 26 | +} |
| 27 | + |
| 28 | +template<> |
| 29 | +float byteswap(float value) { |
| 30 | + return std::bit_cast<float>(byteswap(std::bit_cast<std::uint32_t>(value))); |
| 31 | +} |
| 32 | + |
| 33 | +template<typename T> |
| 34 | +static void byteswap_tensor_data(ggml_tensor * tensor) { |
| 35 | + T * datum = reinterpret_cast<T *>(tensor->data); |
| 36 | + for (int i = 0; i < ggml_nelements(tensor); i++) { |
| 37 | + datum[i] = byteswap(datum[i]); |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | +static void byteswap_tensor(ggml_tensor * tensor) { |
| 42 | + switch (tensor->type) { |
| 43 | + case GGML_TYPE_I16: { |
| 44 | + byteswap_tensor_data<int16_t>(tensor); |
| 45 | + break; |
| 46 | + } |
| 47 | + case GGML_TYPE_F16: { |
| 48 | + byteswap_tensor_data<ggml_fp16_t>(tensor); |
| 49 | + break; |
| 50 | + } |
| 51 | + case GGML_TYPE_I32: { |
| 52 | + byteswap_tensor_data<int32_t>(tensor); |
| 53 | + break; |
| 54 | + } |
| 55 | + case GGML_TYPE_F32: { |
| 56 | + byteswap_tensor_data<float>(tensor); |
| 57 | + break; |
| 58 | + } |
| 59 | + default: { // GML_TYPE_I8 |
| 60 | + break; |
| 61 | + } |
| 62 | + } |
| 63 | +} |
| 64 | + |
| 65 | +#define BYTESWAP_VALUE(d) d = byteswap(d) |
| 66 | +#define BYTESWAP_VECTOR(v) \ |
| 67 | + do { \ |
| 68 | + for (auto & datum : v.data) { \ |
| 69 | + datum = byteswap(datum); \ |
| 70 | + } \ |
| 71 | + } while (0) |
| 72 | +#define BYTESWAP_TENSOR(t) \ |
| 73 | + do { \ |
| 74 | + byteswap_tensor(tensor); \ |
| 75 | + } while (0) |
| 76 | +#else |
| 77 | +#define BYTESWAP_VALUE(d) do {} while (0) |
| 78 | +#define BYTESWAP_VECTOR(v) do {} while (0) |
| 79 | +#define BYTESWAP_TENSOR(t) do {} while (0) |
| 80 | +#endif |
| 81 | + |
20 | 82 | #define WHISPER_ASSERT(x) \ |
21 | 83 | do { \ |
22 | 84 | if (!(x)) { \ |
@@ -521,6 +583,7 @@ struct whisper_context { |
521 | 583 | template<typename T> |
522 | 584 | static void read_safe(whisper_model_loader * loader, T & dest) { |
523 | 585 | loader->read(loader->context, &dest, sizeof(T)); |
| 586 | + BYTESWAP_VALUE(dest); |
524 | 587 | } |
525 | 588 |
|
526 | 589 | static bool kv_cache_init( |
@@ -733,6 +796,7 @@ static bool whisper_model_load(struct whisper_model_loader * loader, whisper_con |
733 | 796 |
|
734 | 797 | filters.data.resize(filters.n_mel * filters.n_fft); |
735 | 798 | loader->read(loader->context, filters.data.data(), filters.data.size() * sizeof(float)); |
| 799 | + BYTESWAP_VECTOR(filters); |
736 | 800 | } |
737 | 801 |
|
738 | 802 | // load vocab |
@@ -1196,6 +1260,7 @@ static bool whisper_model_load(struct whisper_model_loader * loader, whisper_con |
1196 | 1260 | } |
1197 | 1261 |
|
1198 | 1262 | loader->read(loader->context, tensor->data, ggml_nbytes(tensor)); |
| 1263 | + BYTESWAP_TENSOR(tensor); |
1199 | 1264 |
|
1200 | 1265 | //printf("%48s - [%5d, %5d, %5d], type = %6s, %6.2f MB\n", name.data(), ne[0], ne[1], ne[2], ftype == 0 ? "float" : "f16", ggml_nbytes(tensor)/1024.0/1024.0); |
1201 | 1266 | total_size += ggml_nbytes(tensor); |
|
0 commit comments