Implement write byteswap for tests
This commit is contained in:
parent
088f9a6c32
commit
27c19c4eb7
2 changed files with 158 additions and 2 deletions
|
@ -1184,7 +1184,13 @@ struct gguf_writer {
|
|||
template <typename T>
|
||||
void write(const T & val) const {
|
||||
for (size_t i = 0; i < sizeof(val); ++i) {
|
||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
buf.push_back(reinterpret_cast<const int8_t *>(&val)[i]);
|
||||
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
buf.push_back(reinterpret_cast<const int8_t *>(&val)[sizeof(val) - i - 1]);
|
||||
#else
|
||||
#error Unexpected or undefined __BYTE_ORDER__
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1233,6 +1239,7 @@ struct gguf_writer {
|
|||
}
|
||||
|
||||
switch (kv.get_type()) {
|
||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
case GGUF_TYPE_UINT8:
|
||||
case GGUF_TYPE_INT8:
|
||||
case GGUF_TYPE_UINT16:
|
||||
|
@ -1245,6 +1252,60 @@ struct gguf_writer {
|
|||
case GGUF_TYPE_FLOAT64: {
|
||||
write(kv.data);
|
||||
} break;
|
||||
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
case GGUF_TYPE_UINT8: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<uint8_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_INT8: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<int8_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_UINT16: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<uint16_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_INT16: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<int16_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_UINT32: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<uint32_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_INT32: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<int32_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_FLOAT32: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<float>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_UINT64: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<uint64_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_INT64: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<int64_t>(i));
|
||||
}
|
||||
} break;
|
||||
case GGUF_TYPE_FLOAT64: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<double>(i));
|
||||
}
|
||||
} break;
|
||||
#else
|
||||
#error Unexpected or undefined __BYTE_ORDER__
|
||||
#endif
|
||||
case GGUF_TYPE_BOOL: {
|
||||
for (size_t i = 0; i < ne; ++i) {
|
||||
write(kv.get_val<bool>(i));
|
||||
|
@ -1295,6 +1356,13 @@ struct gguf_writer {
|
|||
memcpy(buf.data() + offset, info.t.data, nbytes);
|
||||
}
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
auto byteswap = ggml_get_type_traits(info.t.type)->byteswap;
|
||||
if (byteswap != nullptr) {
|
||||
byteswap(buf.data() + offset, ggml_nelements(&(info.t)) / ggml_blck_size(info.t.type));
|
||||
}
|
||||
#endif
|
||||
|
||||
pad(alignment);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -10,6 +10,43 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#if defined(__gnu_linux__)
|
||||
#include <endian.h>
|
||||
#else
|
||||
#define le64toh(x) (x)
|
||||
#define le32toh(x) (x)
|
||||
#define le16toh(x) (x)
|
||||
#endif
|
||||
|
||||
// endianness conversion
|
||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
#define convert_to_le(x)
|
||||
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
#include <type_traits>
|
||||
|
||||
template <typename T, std::enable_if_t<sizeof(T) == 1, int> = 0>
|
||||
static inline void convert_to_le(T * /*value*/)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename T, std::enable_if_t<sizeof(T) == 2, int> = 0>
|
||||
static inline void convert_to_le(T * value) {
|
||||
*((uint16_t*)value) = htole16(*((uint16_t*)value));
|
||||
}
|
||||
|
||||
template <typename T, std::enable_if_t<sizeof(T) == 4, int> = 0>
|
||||
static inline void convert_to_le(T * value) {
|
||||
*((uint32_t*)value) = htole32(*((uint32_t*)value));
|
||||
}
|
||||
|
||||
template <typename T, std::enable_if_t<sizeof(T) == 8, int> = 0>
|
||||
static inline void convert_to_le(T * value) {
|
||||
*((uint64_t*)value) = htole64(*((uint64_t*)value));
|
||||
}
|
||||
#else
|
||||
#error Unexpected or undefined __BYTE_ORDER__
|
||||
#endif
|
||||
|
||||
constexpr int offset_has_kv = 1000;
|
||||
constexpr int offset_has_tensors = 2000;
|
||||
constexpr int offset_has_data = 3000;
|
||||
|
@ -146,7 +183,8 @@ static std::vector<std::pair<enum gguf_type, enum gguf_type>> get_kv_types(std::
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
static void helper_write(FILE * file, const T & val) {
|
||||
static void helper_write(FILE * file, T val) {
|
||||
convert_to_le(&val);
|
||||
GGML_ASSERT(fwrite(&val, 1, sizeof(val), file) == sizeof(val));
|
||||
}
|
||||
|
||||
|
@ -363,7 +401,9 @@ static FILE * get_handcrafted_file(const unsigned int seed, const enum handcraft
|
|||
helper_write(file, big_dim);
|
||||
}
|
||||
} else {
|
||||
helper_write(file, shape.data(), n_dims*sizeof(int64_t));
|
||||
for (uint32_t j = 0; j < n_dims; ++j) {
|
||||
helper_write(file, shape[j]);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -533,6 +573,33 @@ static bool handcrafted_check_kv(const gguf_context * gguf_ctx, const unsigned i
|
|||
continue;
|
||||
}
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
switch (type_arr) {
|
||||
case GGUF_TYPE_UINT16:
|
||||
case GGUF_TYPE_INT16:
|
||||
for (size_t j = 0; j < arr_n; ++j) {
|
||||
convert_to_le((uint16_t*)(data8 + j * 2));
|
||||
}
|
||||
break;
|
||||
|
||||
case GGUF_TYPE_UINT32:
|
||||
case GGUF_TYPE_INT32:
|
||||
case GGUF_TYPE_FLOAT32:
|
||||
for (size_t j = 0; j < arr_n; ++j) {
|
||||
convert_to_le((uint32_t*)(data8 + j * 4));
|
||||
}
|
||||
break;
|
||||
|
||||
case GGUF_TYPE_UINT64:
|
||||
case GGUF_TYPE_INT64:
|
||||
case GGUF_TYPE_FLOAT64:
|
||||
for (size_t j = 0; j < arr_n; ++j) {
|
||||
convert_to_le((uint64_t*)(data8 + j * 8));
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!std::equal(data8, data8 + arr_n*type_size, data_gguf)) {
|
||||
ok = false;
|
||||
}
|
||||
|
@ -548,6 +615,27 @@ static bool handcrafted_check_kv(const gguf_context * gguf_ctx, const unsigned i
|
|||
continue;
|
||||
}
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
switch (type) {
|
||||
case GGUF_TYPE_UINT16:
|
||||
case GGUF_TYPE_INT16:
|
||||
convert_to_le((uint16_t*)(data8));
|
||||
break;
|
||||
|
||||
case GGUF_TYPE_UINT32:
|
||||
case GGUF_TYPE_INT32:
|
||||
case GGUF_TYPE_FLOAT32:
|
||||
convert_to_le((uint32_t*)(data8));
|
||||
break;
|
||||
|
||||
case GGUF_TYPE_UINT64:
|
||||
case GGUF_TYPE_INT64:
|
||||
case GGUF_TYPE_FLOAT64:
|
||||
convert_to_le((uint64_t*)(data8));
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!std::equal(data8, data8 + gguf_type_size(type), data_gguf)) {
|
||||
ok = false;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue