@@ -613,9 +613,20 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
613613 input_tile_size = tile_size * scale;
614614 output_tile_size = tile_size;
615615 }
616- int num_tiles_x = (input_width - (int )(input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
616+ int tile_overlap = (input_tile_size * tile_overlap_factor);
617+ int non_tile_overlap = input_tile_size - tile_overlap;
618+
619+ int num_tiles_x = (input_width - tile_overlap) / non_tile_overlap;
620+ int overshoot_x = ((num_tiles_x + 1 ) * non_tile_overlap + tile_overlap) % input_width;
621+
622+ if ((overshoot_x != non_tile_overlap) && (overshoot_x <= num_tiles_x * (input_tile_size / 2 - tile_overlap))) {
623+ // if tiles don't fit perfectly using the desired overlap
624+ // and there is enough room to squeeze an extra tile without overlap becoming >0.5
625+ num_tiles_x++;
626+ }
627+
617628 float tile_overlap_factor_x = (float )(input_tile_size * num_tiles_x - input_width) / (float )(input_tile_size * (num_tiles_x - 1 ));
618- if (num_tiles_x <= 1 ) {
629+ if (num_tiles_x <= 2 ) {
619630 if (input_width == input_tile_size) {
620631 num_tiles_x = 1 ;
621632 tile_overlap_factor_x = 0 ;
@@ -625,9 +636,17 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
625636 }
626637 }
627638
628- int num_tiles_y = (input_height - (int )(input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
639+ int num_tiles_y = (input_height - tile_overlap) / non_tile_overlap;
640+ int overshoot_y = ((num_tiles_y + 1 ) * non_tile_overlap + tile_overlap) % input_height;
641+
642+ if ((overshoot_y != non_tile_overlap) && (overshoot_y <= num_tiles_y * (input_tile_size / 2 - tile_overlap))) {
643+ // if tiles don't fit perfectly using the desired overlap
644+ // and there is enough room to squeeze an extra tile without overlap becoming >0.5
645+ num_tiles_y++;
646+ }
647+
629648 float tile_overlap_factor_y = (float )(input_tile_size * num_tiles_y - input_height) / (float )(input_tile_size * (num_tiles_y - 1 ));
630- if (num_tiles_y <= 1 ) {
649+ if (num_tiles_y <= 2 ) {
631650 if (input_height == input_tile_size) {
632651 num_tiles_y = 1 ;
633652 tile_overlap_factor_y = 0 ;
0 commit comments