Skip to content

Commit 07512af

Browse files
committed
Fix a crash on upsample if rheight / rwidth < 1 (not good result, but workable).
1 parent 2a59318 commit 07512af

File tree

1 file changed

+8
-16
lines changed

1 file changed

+8
-16
lines changed

lib/nnc/cmd/upsample/gpu/ccv_nnc_upsample_gpu_ref.cu

+8-16
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,6 @@ static int _ccv_nnc_upsample_nearest_forw(const ccv_nnc_cmd_t cmd, const ccv_nnc
214214
const int hw = bdim[2] * bdim[3];
215215
const float rheight = align_corners ? (float)(adim[2] - 1) / ccv_max(1, bdim[2] - 1) : (float)adim[2] / bdim[2];
216216
const float rwidth = align_corners ? (float)(adim[3] - 1) / ccv_max(1, bdim[3] - 1) : (float)adim[3] / bdim[3];
217-
assert(rheight <= 1);
218-
assert(rwidth <= 1);
219217
if (align_corners)
220218
{
221219
if (a->info.datatype == CCV_32F)
@@ -232,8 +230,6 @@ static int _ccv_nnc_upsample_nearest_forw(const ccv_nnc_cmd_t cmd, const ccv_nnc
232230
assert(a->info.format == CCV_TENSOR_FORMAT_NHWC || a->info.format == CCV_TENSOR_FORMAT_CHWN);
233231
const float rheight = align_corners ? (float)(adim[1] - 1) / ccv_max(1, bdim[1] - 1) : (float)adim[1] / bdim[1];
234232
const float rwidth = align_corners ? (float)(adim[2] - 1) / ccv_max(1, bdim[2] - 1) : (float)adim[2] / bdim[2];
235-
assert(rheight <= 1);
236-
assert(rwidth <= 1);
237233
const int hw = bdim[1] * bdim[2];
238234
if (align_corners)
239235
{
@@ -381,12 +377,12 @@ __global__ void _ccv_nnc_upsample_bilinear_forw_nchw(const int hw, const float r
381377
const NUM* ap = a;
382378
NUM* bp = b;
383379
const float xs = (xd + 0.5) * rwidth - 0.5;
384-
const int xsi0 = (int)xs;
380+
const int xsi0 = ccv_max((int)xs, 0);
385381
const int xsi1 = ccv_min((int)(xs + 1), adim3 - 1);
386382
const float xsc1 = xs - xsi0;
387383
const float xsc0 = 1.0 - xsc1;
388384
const float ys = (yd + 0.5) * rheight - 0.5;
389-
const int ysi0 = (int)ys;
385+
const int ysi0 = ccv_max((int)ys, 0);
390386
const int ysi1 = ccv_min((int)(ys + 1), adim2 - 1);
391387
const float ysc1 = ys - ysi0;
392388
const float ysc0 = 1.0 - ysc1;
@@ -408,12 +404,12 @@ __global__ void _ccv_nnc_upsample_bilinear_forw_nhwc(const int hw, const float r
408404
const NUM* ap = a;
409405
NUM* bp = b;
410406
const float xs = (xd + 0.5) * rwidth - 0.5;
411-
const int xsi0 = (int)xs;
407+
const int xsi0 = ccv_max((int)xs, 0);
412408
const int xsi1 = ccv_min((int)(xs + 1), adim2 - 1);
413409
const float xsc1 = xs - xsi0;
414410
const float xsc0 = 1.0 - xsc1;
415411
const float ys = (yd + 0.5) * rheight - 0.5;
416-
const int ysi0 = (int)ys;
412+
const int ysi0 = ccv_max((int)ys, 0);
417413
const int ysi1 = ccv_min((int)(ys + 1), adim1 - 1);
418414
const float ysc1 = ys - ysi0;
419415
const float ysc0 = 1.0 - ysc1;
@@ -497,12 +493,12 @@ __global__ void _ccv_nnc_upsample_bilinear_back_nchw(const size_t tensor_count,
497493
NUM* const ap = a + idx * ainc2;
498494
const NUM* const bp = b + idx * binc2;
499495
const float xs = (xd + 0.5) * rwidth - 0.5;
500-
const int xsi0 = (int)xs;
496+
const int xsi0 = ccv_max((int)xs, 0);
501497
const int xsi1 = ccv_min((int)(xs + 1), adim3 - 1);
502498
const float xsc1 = xs - xsi0;
503499
const float xsc0 = 1.0 - xsc1;
504500
const float ys = (yd + 0.5) * rheight - 0.5;
505-
const int ysi0 = (int)ys;
501+
const int ysi0 = ccv_max((int)ys, 0);
506502
const int ysi1 = ccv_min((int)(ys + 1), adim2 - 1);
507503
const float ysc1 = ys - ysi0;
508504
const float ysc0 = 1.0 - ysc1;
@@ -525,12 +521,12 @@ __global__ void _ccv_nnc_upsample_bilinear_back_nhwc(const size_t tensor_count,
525521
NUM* const ap = a + idx * ainc1;
526522
const NUM* const bp = b + idx * binc1;
527523
const float xs = (xd + 0.5) * rwidth - 0.5;
528-
const int xsi0 = (int)xs;
524+
const int xsi0 = ccv_max((int)xs, 0);
529525
const int xsi1 = ccv_min((int)(xs + 1), adim2 - 1);
530526
const float xsc1 = xs - xsi0;
531527
const float xsc0 = 1.0 - xsc1;
532528
const float ys = (yd + 0.5) * rheight - 0.5;
533-
const int ysi0 = (int)ys;
529+
const int ysi0 = ccv_max((int)ys, 0);
534530
const int ysi1 = ccv_min((int)(ys + 1), adim1 - 1);
535531
const float ysc1 = ys - ysi0;
536532
const float ysc0 = 1.0 - ysc1;
@@ -574,8 +570,6 @@ static int _ccv_nnc_upsample_bilinear_forw(const ccv_nnc_cmd_t cmd, const ccv_nn
574570
const int hw = bdim[2] * bdim[3];
575571
const float rheight = align_corners ? (float)(adim[2] - 1) / ccv_max(1, bdim[2] - 1) : (float)adim[2] / bdim[2];
576572
const float rwidth = align_corners ? (float)(adim[3] - 1) / ccv_max(1, bdim[3] - 1) : (float)adim[3] / bdim[3];
577-
assert(rheight <= 1);
578-
assert(rwidth <= 1);
579573
if (align_corners)
580574
{
581575
if (a->info.datatype == CCV_32F)
@@ -592,8 +586,6 @@ static int _ccv_nnc_upsample_bilinear_forw(const ccv_nnc_cmd_t cmd, const ccv_nn
592586
assert(a->info.format == CCV_TENSOR_FORMAT_NHWC || a->info.format == CCV_TENSOR_FORMAT_CHWN);
593587
const float rheight = align_corners ? (float)(adim[1] - 1) / ccv_max(1, bdim[1] - 1) : (float)adim[1] / bdim[1];
594588
const float rwidth = align_corners ? (float)(adim[2] - 1) / ccv_max(1, bdim[2] - 1) : (float)adim[2] / bdim[2];
595-
assert(rheight <= 1);
596-
assert(rwidth <= 1);
597589
const int hw = bdim[1] * bdim[2];
598590
if (align_corners)
599591
{

0 commit comments

Comments
 (0)