@@ -21,6 +21,7 @@ limitations under the License. */
21
21
#include " paddle/fluid/operators/conv_cudnn_helper.h"
22
22
#include " paddle/fluid/operators/conv_cudnn_op_cache.h"
23
23
#include " paddle/fluid/operators/conv_op.h"
24
+ #include " paddle/fluid/operators/math/padding.h"
24
25
#include " paddle/fluid/platform/cudnn_helper.h"
25
26
#include " paddle/fluid/platform/cudnn_workspace_helper.h"
26
27
#include " paddle/fluid/platform/float16.h"
@@ -59,44 +60,6 @@ static inline void GetNCDHW(const framework::DDim& dims,
59
60
}
60
61
}
61
62
62
- static inline bool IsSymmetricPadding (const std::vector<int >& paddings,
63
- const int data_dim) {
64
- bool is_sys_pad = true ;
65
- if (paddings.size () == data_dim * 2 ) {
66
- for (size_t i = 0 ; i < data_dim; ++i) {
67
- if (paddings[2 * i] != paddings[2 * i + 1 ]) {
68
- is_sys_pad = false ;
69
- return is_sys_pad;
70
- }
71
- }
72
- }
73
- return is_sys_pad;
74
- }
75
-
76
- template <typename T, size_t D, int MajorType = Eigen::RowMajor,
77
- typename IndexType = Eigen::DenseIndex>
78
- using EigenTensor = framework::EigenTensor<T, D, MajorType, IndexType>;
79
-
80
- template <typename DeviceContext, typename T, size_t D>
81
- static void PadFunction (const framework::ExecutionContext& context,
82
- const std::vector<int >& pads,
83
- const framework::Tensor& src, T pad_value,
84
- framework::Tensor* out) {
85
- Eigen::array<std::pair<int , int >, D> paddings;
86
-
87
- for (size_t i = 0 ; i < paddings.size (); ++i) {
88
- paddings[i].first = pads[i * 2 ];
89
- paddings[i].second = pads[i * 2 + 1 ];
90
- }
91
-
92
- auto src_tensor = EigenTensor<T, D>::From (src);
93
- auto out_tensor = EigenTensor<T, D>::From (*out);
94
-
95
- auto & place =
96
- *context.template device_context <DeviceContext>().eigen_device ();
97
- out_tensor.device (place) = src_tensor.pad (paddings, pad_value);
98
- }
99
-
100
63
template <typename DeviceContext, typename T, size_t D>
101
64
static void Slice_2 (const framework::ExecutionContext& context,
102
65
const Tensor* input, Tensor* out,
@@ -192,7 +155,7 @@ class CUDNNConvOpKernel : public framework::OpKernel<T> {
192
155
in_data_dims, strides, ksize);
193
156
194
157
int data_dim = strides.size (); // 2d or 3d
195
- bool is_sys_pad = IsSymmetricPadding (paddings, data_dim);
158
+ bool is_sys_pad = math:: IsSymmetricPadding (paddings, data_dim);
196
159
197
160
Tensor transformed_input;
198
161
std::vector<int > padding_common (data_dim, 0 );
@@ -225,12 +188,12 @@ class CUDNNConvOpKernel : public framework::OpKernel<T> {
225
188
T pad_value (0.0 );
226
189
switch (rank) {
227
190
case 4 : {
228
- PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
191
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
229
192
ctx, input_pad, transformed_input_channel, pad_value,
230
193
&transformed_input);
231
194
} break ;
232
195
case 5 : {
233
- PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
196
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
234
197
ctx, input_pad, transformed_input_channel, pad_value,
235
198
&transformed_input);
236
199
} break ;
@@ -404,7 +367,7 @@ class CUDNNConvGradOpKernel : public framework::OpKernel<T> {
404
367
// cuDNN only supports padding the same amount on every dimension.
405
368
// So we create a new padded input tensor.
406
369
int data_dim = strides.size (); // 2d or 3d
407
- bool is_sys_pad = IsSymmetricPadding (paddings, data_dim);
370
+ bool is_sys_pad = math:: IsSymmetricPadding (paddings, data_dim);
408
371
Tensor transformed_input (input->type ());
409
372
Tensor transformed_input_grad (input->type ());
410
373
std::vector<int > padding_common (data_dim, 0 );
@@ -446,12 +409,12 @@ class CUDNNConvGradOpKernel : public framework::OpKernel<T> {
446
409
T pad_value (0.0 );
447
410
switch (rank) {
448
411
case 4 : {
449
- PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
412
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
450
413
ctx, input_pad, transformed_input_channel, pad_value,
451
414
&transformed_input);
452
415
} break ;
453
416
case 5 : {
454
- PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
417
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
455
418
ctx, input_pad, transformed_input_channel, pad_value,
456
419
&transformed_input);
457
420
} break ;
@@ -737,7 +700,7 @@ class CUDNNConvDoubleGradOpKernel : public framework::OpKernel<T> {
737
700
in_data_dims, strides, ksize);
738
701
739
702
int data_dim = strides.size (); // 2d or 3d
740
- bool is_sys_pad = IsSymmetricPadding (paddings, data_dim);
703
+ bool is_sys_pad = math:: IsSymmetricPadding (paddings, data_dim);
741
704
Tensor transformed_X (X->type ());
742
705
Tensor transformed_ddX (X->type ());
743
706
@@ -786,16 +749,16 @@ class CUDNNConvDoubleGradOpKernel : public framework::OpKernel<T> {
786
749
T pad_value (0.0 );
787
750
switch (rank) {
788
751
case 4 : {
789
- PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
752
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
790
753
ctx, input_pad, transformed_X_channel, pad_value, &transformed_X);
791
- PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
754
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 4 >(
792
755
ctx, input_pad, transformed_ddX_channel, pad_value,
793
756
&transformed_ddX);
794
757
} break ;
795
758
case 5 : {
796
- PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
759
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
797
760
ctx, input_pad, transformed_X_channel, pad_value, &transformed_X);
798
- PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
761
+ math:: PadFunction<paddle::platform::CUDADeviceContext, T, 5 >(
799
762
ctx, input_pad, transformed_ddX_channel, pad_value,
800
763
&transformed_ddX);
801
764
} break ;
0 commit comments