Skip to content

Commit 3f06c3a

Browse files
stduhpfthxCode
authored andcommitted
Tiling: fix edge case
1 parent 7b58000 commit 3f06c3a

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

ggml_extend.hpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,9 @@ __STATIC_INLINE__ void ggml_merge_tensor_2d(struct ggml_tensor* input,
369369
int x,
370370
int y,
371371
int overlap_x,
372-
int overlap_y) {
372+
int overlap_y,
373+
int x_skip = 0,
374+
int y_skip = 0) {
373375
int64_t width = input->ne[0];
374376
int64_t height = input->ne[1];
375377
int64_t channels = input->ne[2];
@@ -378,16 +380,16 @@ __STATIC_INLINE__ void ggml_merge_tensor_2d(struct ggml_tensor* input,
378380
int64_t img_height = output->ne[1];
379381

380382
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++) {
383385
for (int k = 0; k < channels; k++) {
384386
float new_value = ggml_tensor_get_f32(input, ix, iy, k);
385387
if (overlap_x > 0 && overlap_y > 0) { // blend colors in overlapped area
386388
float old_value = ggml_tensor_get_f32(output, x + ix, y + iy, k);
387389

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;
389391
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;
391393
const float y_f_1 = (overlap_y > 0 && y < (img_height - height)) ? (height - iy) / float(overlap_y) : 1;
392394

393395
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
516518
input_tile_size = tile_size * scale;
517519
output_tile_size = tile_size;
518520
}
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));
520522
float tile_overlap_factor_x = (float)(input_tile_size * num_tiles_x - input_width) / (float)(input_tile_size * (num_tiles_x - 1));
521523

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));
523525
float tile_overlap_factor_y = (float)(input_tile_size * num_tiles_y - input_height) / (float)(input_tile_size * (num_tiles_y - 1));
524526

525527
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
559561
bool last_y = false, last_x = false;
560562
float last_time = 0.0f;
561563
for (int y = 0; y < input_height && !last_y; y += non_tile_overlap_y) {
564+
int dy = 0;
562565
if (y + input_tile_size >= input_height) {
566+
int _y = y;
563567
y = input_height - input_tile_size;
568+
dy = _y - y;
564569
last_y = true;
565570
}
566571
for (int x = 0; x < input_width && !last_x; x += non_tile_overlap_x) {
572+
int dx = 0;
567573
if (x + input_tile_size >= input_width) {
574+
int _x = x;
568575
x = input_width - input_tile_size;
576+
dx = _x - x;
569577
last_x = true;
570578
}
571579
int64_t t1 = ggml_time_ms();
572580
ggml_split_tensor_2d(input, input_tile, x, y);
573581
on_processing(input_tile, output_tile, false);
574582
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);
576584
} 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);
578586
}
579587
int64_t t2 = ggml_time_ms();
580588
last_time = (t2 - t1) / 1000.0f;

0 commit comments

Comments
 (0)