Skip to content

Commit b0e9343

Browse files
hex-repack: get_tensor_2d fixes for non-zero offsets
1 parent 1a1ef62 commit b0e9343

1 file changed

Lines changed: 81 additions & 25 deletions

File tree

ggml/src/ggml-hexagon/ggml-hexagon.cpp

Lines changed: 81 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -741,17 +741,31 @@ static void repack_tiled_q4_0(void * data, const ggml_tensor * t, size_t offset,
741741
const size_t matrix_size = n_col_tiles * n_k_tiles * tile_size;
742742

743743
size_t slice_size = ne1 * ggml_row_size(t->type, ne0);
744+
size_t row_size_bytes = ggml_row_size(t->type, ne0);
744745
int64_t start_slice = offset / slice_size;
745746
int64_t end_slice = (offset + size + slice_size - 1) / slice_size;
746747
if (end_slice > ne2 * ne3) {
747748
end_slice = ne2 * ne3;
748749
}
749750

750751
for (int64_t slice_idx = start_slice; slice_idx < end_slice; slice_idx++) {
751-
block_q4_0 * dst_expert = dst_matrix + (slice_idx - start_slice) * (ne1 * (ne0 / 32));
752+
size_t cur_start_byte = (std::max)(offset, (size_t) slice_idx * slice_size);
753+
size_t cur_end_byte = (std::min)(offset + size, (size_t) (slice_idx + 1) * slice_size);
754+
size_t slice_offset_start = cur_start_byte - (size_t) slice_idx * slice_size;
755+
size_t slice_offset_end = cur_end_byte - (size_t) slice_idx * slice_size;
756+
757+
int64_t start_row = slice_offset_start / row_size_bytes;
758+
int64_t end_row = (slice_offset_end + row_size_bytes - 1) / row_size_bytes;
759+
end_row = (std::min)(end_row, ne1);
760+
761+
int start_ct = start_row / 32;
762+
int end_ct = (end_row + 31) / 32;
763+
end_ct = (std::min)(end_ct, n_col_tiles);
764+
765+
block_q4_0 * dst_slice = dst_matrix + (cur_start_byte - offset) / sizeof(block_q4_0);
752766
const uint8_t * matrix_src = (const uint8_t *) t->data + slice_idx * matrix_size;
753767

754-
for (int ct = 0; ct < n_col_tiles; ct++) {
768+
for (int ct = start_ct; ct < end_ct; ct++) {
755769
for (int kt = 0; kt < n_k_tiles; kt++) {
756770
const uint8_t * tile_src = matrix_src + (ct * n_k_tiles + kt) * tile_size;
757771

@@ -766,16 +780,16 @@ static void repack_tiled_q4_0(void * data, const ggml_tensor * t, size_t offset,
766780

767781
for (int row = 0; row < 32; row++) {
768782
int64_t r = ct * 32 + row;
769-
if (r < ne1 && kt < ne0 / 32) {
770-
pack_q4_0_quants(&dst_expert[r * (ne0 / 32) + kt], tile_quants[row], 0);
783+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
784+
pack_q4_0_quants(&dst_slice[(r - start_row) * (ne0 / 32) + kt], tile_quants[row], 0);
771785
}
772786
}
773787

774788
const ggml_half * scale_src = (const ggml_half *)(tile_src + 512);
775789
for (int row = 0; row < 32; row++) {
776790
int64_t r = ct * 32 + row;
777-
if (r < ne1 && kt < ne0 / 32) {
778-
dst_expert[r * (ne0 / 32) + kt].d = scale_src[row];
791+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
792+
dst_slice[(r - start_row) * (ne0 / 32) + kt].d = scale_src[row];
779793
}
780794
}
781795
}
@@ -861,17 +875,31 @@ static void repack_tiled_q4_1(void * data, const ggml_tensor * t, size_t offset,
861875
const size_t matrix_size = n_col_tiles * n_k_tiles * tile_size;
862876

863877
size_t slice_size = ne1 * ggml_row_size(t->type, ne0);
878+
size_t row_size_bytes = ggml_row_size(t->type, ne0);
864879
int64_t start_slice = offset / slice_size;
865880
int64_t end_slice = (offset + size + slice_size - 1) / slice_size;
866881
if (end_slice > ne2 * ne3) {
867882
end_slice = ne2 * ne3;
868883
}
869884

870885
for (int64_t slice_idx = start_slice; slice_idx < end_slice; slice_idx++) {
871-
block_q4_1 * dst_expert = dst_matrix + (slice_idx - start_slice) * (ne1 * (ne0 / 32));
886+
size_t cur_start_byte = (std::max)(offset, (size_t) slice_idx * slice_size);
887+
size_t cur_end_byte = (std::min)(offset + size, (size_t) (slice_idx + 1) * slice_size);
888+
size_t slice_offset_start = cur_start_byte - (size_t) slice_idx * slice_size;
889+
size_t slice_offset_end = cur_end_byte - (size_t) slice_idx * slice_size;
890+
891+
int64_t start_row = slice_offset_start / row_size_bytes;
892+
int64_t end_row = (slice_offset_end + row_size_bytes - 1) / row_size_bytes;
893+
end_row = (std::min)(end_row, ne1);
894+
895+
int start_ct = start_row / 32;
896+
int end_ct = (end_row + 31) / 32;
897+
end_ct = (std::min)(end_ct, n_col_tiles);
898+
899+
block_q4_1 * dst_slice = dst_matrix + (cur_start_byte - offset) / sizeof(block_q4_1);
872900
const uint8_t * matrix_src = (const uint8_t *) t->data + slice_idx * matrix_size;
873901

874-
for (int ct = 0; ct < n_col_tiles; ct++) {
902+
for (int ct = start_ct; ct < end_ct; ct++) {
875903
for (int kt = 0; kt < n_k_tiles; kt++) {
876904
const uint8_t * tile_src = matrix_src + (ct * n_k_tiles + kt) * tile_size;
877905

@@ -886,17 +914,17 @@ static void repack_tiled_q4_1(void * data, const ggml_tensor * t, size_t offset,
886914

887915
for (int row = 0; row < 32; row++) {
888916
int64_t r = ct * 32 + row;
889-
if (r < ne1 && kt < ne0 / 32) {
890-
pack_q4_1_quants(&dst_expert[r * (ne0 / 32) + kt], tile_quants[row], 0);
917+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
918+
pack_q4_1_quants(&dst_slice[(r - start_row) * (ne0 / 32) + kt], tile_quants[row], 0);
891919
}
892920
}
893921

894922
const ggml_half * scale_src = (const ggml_half *)(tile_src + 512);
895923
for (int row = 0; row < 32; row++) {
896924
int64_t r = ct * 32 + row;
897-
if (r < ne1 && kt < ne0 / 32) {
898-
dst_expert[r * (ne0 / 32) + kt].d = scale_src[2 * row];
899-
dst_expert[r * (ne0 / 32) + kt].m = scale_src[2 * row + 1];
925+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
926+
dst_slice[(r - start_row) * (ne0 / 32) + kt].d = scale_src[2 * row];
927+
dst_slice[(r - start_row) * (ne0 / 32) + kt].m = scale_src[2 * row + 1];
900928
}
901929
}
902930
}
@@ -971,17 +999,31 @@ static void repack_tiled_q8_0(void * data, const ggml_tensor * t, size_t offset,
971999
const size_t matrix_size = n_col_tiles * n_k_tiles * tile_size;
9721000

9731001
size_t slice_size = ne1 * ggml_row_size(t->type, ne0);
1002+
size_t row_size_bytes = ggml_row_size(t->type, ne0);
9741003
int64_t start_slice = offset / slice_size;
9751004
int64_t end_slice = (offset + size + slice_size - 1) / slice_size;
9761005
if (end_slice > ne2 * ne3) {
9771006
end_slice = ne2 * ne3;
9781007
}
9791008

9801009
for (int64_t slice_idx = start_slice; slice_idx < end_slice; slice_idx++) {
981-
block_q8_0 * dst_expert = dst_matrix + (slice_idx - start_slice) * (ne1 * (ne0 / 32));
1010+
size_t cur_start_byte = (std::max)(offset, (size_t) slice_idx * slice_size);
1011+
size_t cur_end_byte = (std::min)(offset + size, (size_t) (slice_idx + 1) * slice_size);
1012+
size_t slice_offset_start = cur_start_byte - (size_t) slice_idx * slice_size;
1013+
size_t slice_offset_end = cur_end_byte - (size_t) slice_idx * slice_size;
1014+
1015+
int64_t start_row = slice_offset_start / row_size_bytes;
1016+
int64_t end_row = (slice_offset_end + row_size_bytes - 1) / row_size_bytes;
1017+
end_row = (std::min)(end_row, ne1);
1018+
1019+
int start_ct = start_row / 32;
1020+
int end_ct = (end_row + 31) / 32;
1021+
end_ct = (std::min)(end_ct, n_col_tiles);
1022+
1023+
block_q8_0 * dst_slice = dst_matrix + (cur_start_byte - offset) / sizeof(block_q8_0);
9821024
const uint8_t * matrix_src = (const uint8_t *) t->data + slice_idx * matrix_size;
9831025

984-
for (int ct = 0; ct < n_col_tiles; ct++) {
1026+
for (int ct = start_ct; ct < end_ct; ct++) {
9851027
for (int kt = 0; kt < n_k_tiles; kt++) {
9861028
const uint8_t * tile_src = matrix_src + (ct * n_k_tiles + kt) * tile_size;
9871029

@@ -990,8 +1032,8 @@ static void repack_tiled_q8_0(void * data, const ggml_tensor * t, size_t offset,
9901032
int col1 = col0 + 1;
9911033
for (int row = 0; row < 32; row++) {
9921034
int64_t r = ct * 32 + row;
993-
if (r < ne1 && kt < ne0 / 32) {
994-
block_q8_0 & b = dst_expert[r * (ne0 / 32) + kt];
1035+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
1036+
block_q8_0 & b = dst_slice[(r - start_row) * (ne0 / 32) + kt];
9951037
b.qs[col0] = tile_src[cp * 64 + 2 * row + 0];
9961038
b.qs[col1] = tile_src[cp * 64 + 2 * row + 1];
9971039
}
@@ -1001,8 +1043,8 @@ static void repack_tiled_q8_0(void * data, const ggml_tensor * t, size_t offset,
10011043
const ggml_half * scale_src = (const ggml_half *)(tile_src + 1024);
10021044
for (int row = 0; row < 32; row++) {
10031045
int64_t r = ct * 32 + row;
1004-
if (r < ne1 && kt < ne0 / 32) {
1005-
dst_expert[r * (ne0 / 32) + kt].d = scale_src[row];
1046+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
1047+
dst_slice[(r - start_row) * (ne0 / 32) + kt].d = scale_src[row];
10061048
}
10071049
}
10081050
}
@@ -1082,17 +1124,31 @@ static void repack_tiled_mxfp4(void * data, const ggml_tensor * t, size_t offset
10821124
const size_t matrix_size = n_col_tiles * n_k_tiles * tile_size;
10831125

10841126
size_t slice_size = ne1 * ggml_row_size(t->type, ne0);
1127+
size_t row_size_bytes = ggml_row_size(t->type, ne0);
10851128
int64_t start_slice = offset / slice_size;
10861129
int64_t end_slice = (offset + size + slice_size - 1) / slice_size;
10871130
if (end_slice > ne2 * ne3) {
10881131
end_slice = ne2 * ne3;
10891132
}
10901133

10911134
for (int64_t slice_idx = start_slice; slice_idx < end_slice; slice_idx++) {
1092-
block_mxfp4 * dst_expert = dst_matrix + (slice_idx - start_slice) * (ne1 * (ne0 / 32));
1135+
size_t cur_start_byte = (std::max)(offset, (size_t) slice_idx * slice_size);
1136+
size_t cur_end_byte = (std::min)(offset + size, (size_t) (slice_idx + 1) * slice_size);
1137+
size_t slice_offset_start = cur_start_byte - (size_t) slice_idx * slice_size;
1138+
size_t slice_offset_end = cur_end_byte - (size_t) slice_idx * slice_size;
1139+
1140+
int64_t start_row = slice_offset_start / row_size_bytes;
1141+
int64_t end_row = (slice_offset_end + row_size_bytes - 1) / row_size_bytes;
1142+
end_row = (std::min)(end_row, ne1);
1143+
1144+
int start_ct = start_row / 32;
1145+
int end_ct = (end_row + 31) / 32;
1146+
end_ct = (std::min)(end_ct, n_col_tiles);
1147+
1148+
block_mxfp4 * dst_slice = dst_matrix + (cur_start_byte - offset) / sizeof(block_mxfp4);
10931149
const uint8_t * matrix_src = (const uint8_t *) t->data + slice_idx * matrix_size;
10941150

1095-
for (int ct = 0; ct < n_col_tiles; ct++) {
1151+
for (int ct = start_ct; ct < end_ct; ct++) {
10961152
for (int kt = 0; kt < n_k_tiles; kt++) {
10971153
const uint8_t * tile_src = matrix_src + (ct * n_k_tiles + kt) * tile_size;
10981154

@@ -1107,16 +1163,16 @@ static void repack_tiled_mxfp4(void * data, const ggml_tensor * t, size_t offset
11071163

11081164
for (int row = 0; row < 32; row++) {
11091165
int64_t r = ct * 32 + row;
1110-
if (r < ne1 && kt < ne0 / 32) {
1111-
pack_mxfp4_quants(&dst_expert[r * (ne0 / 32) + kt], tile_quants[row], 0);
1166+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
1167+
pack_mxfp4_quants(&dst_slice[(r - start_row) * (ne0 / 32) + kt], tile_quants[row], 0);
11121168
}
11131169
}
11141170

11151171
const uint8_t * scale_src = tile_src + 512;
11161172
for (int row = 0; row < 32; row++) {
11171173
int64_t r = ct * 32 + row;
1118-
if (r < ne1 && kt < ne0 / 32) {
1119-
dst_expert[r * (ne0 / 32) + kt].e = scale_src[row];
1174+
if (r >= start_row && r < end_row && kt < ne0 / 32) {
1175+
dst_slice[(r - start_row) * (ne0 / 32) + kt].e = scale_src[row];
11201176
}
11211177
}
11221178
}

0 commit comments

Comments
 (0)