Skip to content

Commit 76b5619

Browse files
committed
Fix int32 overflow in max_pool3d backward kernel
Widen stride variables in `MaxPool3dBackwardKernelFunctor` from `int` to `int64_t` to prevent overflow when `batch * in_nbatch_stride` exceeds `INT_MAX`. This caused incorrect gradient writes for large tensors (e.g. shape `[70, 32, 100, 100, 100]`). Fixes test case: `test_pool3d_large_size_int64`
1 parent 16fc8d7 commit 76b5619

1 file changed

Lines changed: 14 additions & 13 deletions

File tree

src/ATen/native/xpu/sycl/DilatedMaxPool3d.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -347,10 +347,10 @@ struct MaxPool3dBackwardKernelFunctor {
347347
const int64_t* indicesData,
348348
int features,
349349
int64_t gradOutputSize,
350-
int out_cf_channel_stride,
351-
int in_cf_channel_stride,
352-
int out_nbatch_stride,
353-
int in_nbatch_stride)
350+
int64_t out_cf_channel_stride,
351+
int64_t in_cf_channel_stride,
352+
int64_t out_nbatch_stride,
353+
int64_t in_nbatch_stride)
354354
: gradInputData_(gradInputData),
355355
gradOutputData_(gradOutputData),
356356
indicesData_(indicesData),
@@ -367,10 +367,10 @@ struct MaxPool3dBackwardKernelFunctor {
367367
const int64_t* indicesData_;
368368
int features_;
369369
int64_t gradOutputSize_;
370-
int out_cf_channel_stride_;
371-
int in_cf_channel_stride_;
372-
int out_nbatch_stride_;
373-
int in_nbatch_stride_;
370+
int64_t out_cf_channel_stride_;
371+
int64_t in_cf_channel_stride_;
372+
int64_t out_nbatch_stride_;
373+
int64_t in_nbatch_stride_;
374374
};
375375

376376
template <typename scalar_t, bool channels_last>
@@ -386,12 +386,13 @@ void max_pool3d_with_indices_backward_template(
386386
int otime,
387387
int oheight,
388388
int owidth) {
389-
int64_t gradOutputSize = obatch * features * otime * oheight * owidth;
389+
int64_t gradOutputSize =
390+
(int64_t)obatch * features * otime * oheight * owidth;
390391

391-
auto out_cf_channel_stride = otime * oheight * owidth;
392-
auto in_cf_channel_stride = itime * iheight * iwidth;
393-
auto out_nbatch_stride = features * out_cf_channel_stride;
394-
auto in_nbatch_stride = features * in_cf_channel_stride;
392+
int64_t out_cf_channel_stride = (int64_t)otime * oheight * owidth;
393+
int64_t in_cf_channel_stride = (int64_t)itime * iheight * iwidth;
394+
int64_t out_nbatch_stride = (int64_t)features * out_cf_channel_stride;
395+
int64_t in_nbatch_stride = (int64_t)features * in_cf_channel_stride;
395396
MaxPool3dBackwardKernelFunctor<scalar_t, channels_last> kfn(
396397
gradInputData,
397398
gradOutputData,

0 commit comments

Comments
 (0)