@@ -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