@@ -369,7 +369,9 @@ __STATIC_INLINE__ void ggml_merge_tensor_2d(struct ggml_tensor* input,
369
369
int x,
370
370
int y,
371
371
int overlap_x,
372
- int overlap_y) {
372
+ int overlap_y,
373
+ int x_skip = 0 ,
374
+ int y_skip = 0 ) {
373
375
int64_t width = input->ne [0 ];
374
376
int64_t height = input->ne [1 ];
375
377
int64_t channels = input->ne [2 ];
@@ -378,16 +380,16 @@ __STATIC_INLINE__ void ggml_merge_tensor_2d(struct ggml_tensor* input,
378
380
int64_t img_height = output->ne [1 ];
379
381
380
382
GGML_ASSERT (input->type == GGML_TYPE_F32 && output->type == GGML_TYPE_F32);
381
- for (int iy = 0 ; iy < height; iy++) {
382
- for (int ix = 0 ; ix < width; ix++) {
383
+ for (int iy = y_skip ; iy < height; iy++) {
384
+ for (int ix = x_skip ; ix < width; ix++) {
383
385
for (int k = 0 ; k < channels; k++) {
384
386
float new_value = ggml_tensor_get_f32 (input, ix, iy, k);
385
387
if (overlap_x > 0 && overlap_y > 0 ) { // blend colors in overlapped area
386
388
float old_value = ggml_tensor_get_f32 (output, x + ix, y + iy, k);
387
389
388
- const float x_f_0 = (overlap_x > 0 && x > 0 ) ? ix / float (overlap_x) : 1 ;
390
+ const float x_f_0 = (overlap_x > 0 && x > 0 ) ? (ix - x_skip) / float (overlap_x) : 1 ;
389
391
const float x_f_1 = (overlap_x > 0 && x < (img_width - width)) ? (width - ix) / float (overlap_x) : 1 ;
390
- const float y_f_0 = (overlap_y > 0 && y > 0 ) ? iy / float (overlap_y) : 1 ;
392
+ const float y_f_0 = (overlap_y > 0 && y > 0 ) ? (iy - y_skip) / float (overlap_y) : 1 ;
391
393
const float y_f_1 = (overlap_y > 0 && y < (img_height - height)) ? (height - iy) / float (overlap_y) : 1 ;
392
394
393
395
const float x_f = std::min (std::min (x_f_0, x_f_1), 1 .f );
@@ -516,10 +518,10 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
516
518
input_tile_size = tile_size * scale;
517
519
output_tile_size = tile_size;
518
520
}
519
- int num_tiles_x = (float )( input_width - input_tile_size * tile_overlap_factor) / (float )(input_tile_size * (1 - tile_overlap_factor));
521
+ int num_tiles_x = (input_width - ( int )( input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
520
522
float tile_overlap_factor_x = (float )(input_tile_size * num_tiles_x - input_width) / (float )(input_tile_size * (num_tiles_x - 1 ));
521
523
522
- int num_tiles_y = (float )( input_height - input_tile_size * tile_overlap_factor) / (float )(input_tile_size * (1 - tile_overlap_factor));
524
+ int num_tiles_y = (input_height - ( int )( input_tile_size * tile_overlap_factor)) / (int )(input_tile_size * (1 - tile_overlap_factor));
523
525
float tile_overlap_factor_y = (float )(input_tile_size * num_tiles_y - input_height) / (float )(input_tile_size * (num_tiles_y - 1 ));
524
526
525
527
LOG_DEBUG (" optimal overlap : %f, %f (targeting %f)" , tile_overlap_factor_x, tile_overlap_factor_y, tile_overlap_factor);
@@ -559,22 +561,28 @@ __STATIC_INLINE__ void sd_tiling(ggml_tensor* input, ggml_tensor* output, const
559
561
bool last_y = false , last_x = false ;
560
562
float last_time = 0 .0f ;
561
563
for (int y = 0 ; y < input_height && !last_y; y += non_tile_overlap_y) {
564
+ int dy = 0 ;
562
565
if (y + input_tile_size >= input_height) {
566
+ int _y = y;
563
567
y = input_height - input_tile_size;
568
+ dy = _y - y;
564
569
last_y = true ;
565
570
}
566
571
for (int x = 0 ; x < input_width && !last_x; x += non_tile_overlap_x) {
572
+ int dx = 0 ;
567
573
if (x + input_tile_size >= input_width) {
574
+ int _x = x;
568
575
x = input_width - input_tile_size;
576
+ dx = _x - x;
569
577
last_x = true ;
570
578
}
571
579
int64_t t1 = ggml_time_ms ();
572
580
ggml_split_tensor_2d (input, input_tile, x, y);
573
581
on_processing (input_tile, output_tile, false );
574
582
if (scaled_out) {
575
- ggml_merge_tensor_2d (output_tile, output, x * scale, y * scale, tile_overlap_x * scale, tile_overlap_y * scale);
583
+ ggml_merge_tensor_2d (output_tile, output, x * scale, y * scale, tile_overlap_x * scale, tile_overlap_y * scale, dx * scale, dy * scale );
576
584
} else {
577
- ggml_merge_tensor_2d (output_tile, output, x / scale, y / scale, tile_overlap_x / scale, tile_overlap_y / scale);
585
+ ggml_merge_tensor_2d (output_tile, output, x / scale, y / scale, tile_overlap_x / scale, tile_overlap_y / scale, dx / scale, dy / scale );
578
586
}
579
587
int64_t t2 = ggml_time_ms ();
580
588
last_time = (t2 - t1) / 1000 .0f ;
0 commit comments