| 923 | } |
| 924 | |
| 925 | static int dist_write_activation_payload( |
| 926 | int fd, |
| 927 | const float *src, |
| 928 | uint64_t values, |
| 929 | uint32_t bits) { |
| 930 | bits = dist_activation_bits_or_default(bits); |
| 931 | if (!dist_activation_bits_valid(bits)) return -1; |
| 932 | if (values == 0) return 0; |
| 933 | if (!src) return -1; |
| 934 | if (bits == 32u) { |
| 935 | uint32_t bytes = 0; |
| 936 | if (!dist_activation_wire_bytes(bits, values, &bytes)) return -1; |
| 937 | return dist_write_full(fd, src, bytes); |
| 938 | } |
| 939 | |
| 940 | const uint64_t max_values = 1024u * 1024u; |
| 941 | uint64_t cap = values < max_values ? values : max_values; |
| 942 | void *buf = malloc((size_t)cap * (size_t)(bits / 8u)); |
| 943 | if (!buf) return -1; |
| 944 | uint64_t done = 0; |
| 945 | int rc = 0; |
| 946 | while (done < values) { |
| 947 | uint64_t n = values - done; |
| 948 | if (n > cap) n = cap; |
| 949 | if (bits == 16u) { |
| 950 | uint16_t *dst = buf; |
| 951 | for (uint64_t i = 0; i < n; i++) dst[i] = dist_f32_to_f16(src[done + i]); |
| 952 | } else { |
| 953 | uint8_t *dst = buf; |
| 954 | for (uint64_t i = 0; i < n; i++) dst[i] = dist_f32_to_f8_e4m3(src[done + i]); |
| 955 | } |
| 956 | if (dist_write_full(fd, buf, (size_t)n * (size_t)(bits / 8u)) != 0) { |
| 957 | rc = -1; |
| 958 | break; |
| 959 | } |
| 960 | done += n; |
| 961 | } |
| 962 | free(buf); |
| 963 | return rc; |
| 964 | } |
| 965 | |
| 966 | static int dist_decode_activation_payload( |
| 967 | const void *wire, |
no test coverage detected