@@ -211,13 +211,11 @@ __global__ void KeAvgPoolForward(const int nthreads,
211211
212212 int hstart = ph * strideH - padH;
213213 int wstart = pw * strideW - padW;
214- int hend = min (hstart + sizeY, height + padH);
215- int wend = min (wstart + sizeX, width + padW);
216- int pool_size = (hend - hstart) * (wend - wstart);
214+ int hend = min (hstart + sizeY, height);
215+ int wend = min (wstart + sizeX, width);
217216 hstart = max (hstart, 0 );
218217 wstart = max (wstart, 0 );
219- hend = min (hend, height);
220- wend = min (wend, width);
218+ int pool_size = (hend - hstart) * (wend - wstart);
221219
222220 real aveval = 0 ;
223221 inputData += (frameNum * channels + c) * height * width;
@@ -299,12 +297,14 @@ __global__ void KeAvgPoolBackward(const int nthreads,
299297 outGrad += (frameNum * outStride + offsetC * pooledH * pooledW);
300298
301299 for (int ph = phstart; ph < phend; ++ph) {
300+ int hstart = ph * strideH - padH;
301+ int hend = min (hstart + sizeY, height);
302+ hstart = max (hstart, 0 );
302303 for (int pw = pwstart; pw < pwend; ++pw) {
303304 // figure out the pooling size
304- int hstart = ph * strideH - padH;
305305 int wstart = pw * strideW - padW;
306- int hend = min (hstart + sizeY, height + padH );
307- int wend = min (wstart + sizeX, width + padW );
306+ int wend = min (wstart + sizeX, width );
307+ wstart = max (wstart, 0 );
308308 int poolsize = (hend - hstart) * (wend - wstart);
309309 gradient += outGrad[ph * pooledW + pw] / poolsize;
310310 }
@@ -600,16 +600,13 @@ __global__ void KeAvgPool3DForward(const int nthreads,
600600 int dstart = pd * strideD - padD;
601601 int hstart = ph * strideH - padH;
602602 int wstart = pw * strideW - padW;
603- int dend = min (dstart + sizeZ, depth + padD);
604- int hend = min (hstart + sizeY, height + padH);
605- int wend = min (wstart + sizeX, width + padW);
606- int pool_size = (dend - dstart) * (hend - hstart) * (wend - wstart);
603+ int dend = min (dstart + sizeZ, depth);
604+ int hend = min (hstart + sizeY, height);
605+ int wend = min (wstart + sizeX, width);
607606 dstart = max (dstart, 0 );
608607 hstart = max (hstart, 0 );
609608 wstart = max (wstart, 0 );
610- dend = min (dend, depth);
611- hend = min (hend, height);
612- wend = min (wend, width);
609+ int pool_size = (dend - dstart) * (hend - hstart) * (wend - wstart);
613610
614611 real aveval = 0 ;
615612 inputData += (frameNum * channels + c) * depth * height * width;
@@ -712,15 +709,18 @@ __global__ void KeAvgPool3DBackward(const int nthreads,
712709 outGrad += (frameNum * channels + offsetC) * pooledD * pooledH * pooledW;
713710
714711 for (int pd = pdstart; pd < pdend; ++pd) {
712+ int dstart = pd * strideD - padD;
713+ int dend = min (dstart + sizeZ, depth);
714+ dstart = max (dstart, 0 );
715715 for (int ph = phstart; ph < phend; ++ph) {
716+ int hstart = ph * strideH - padH;
717+ int hend = min (hstart + sizeY, height);
718+ hstart = max (hstart, 0 );
716719 for (int pw = pwstart; pw < pwend; ++pw) {
717720 // figure out the pooling size
718- int dstart = pd * strideD - padD;
719- int hstart = ph * strideH - padH;
720721 int wstart = pw * strideW - padW;
721- int dend = min (dstart + sizeZ, depth + padD);
722- int hend = min (hstart + sizeY, height + padH);
723- int wend = min (wstart + sizeX, width + padW);
722+ int wend = min (wstart + sizeX, width);
723+ wstart = max (wstart, 0 );
724724 int poolsize = (dend - dstart) * (hend - hstart) * (wend - wstart);
725725 gradient += outGrad[(pd * pooledH + ph) * pooledW + pw] / poolsize;
726726 }
0 commit comments