@@ -27,6 +27,18 @@ void ConvTransposeImageCompute::PrepareForRun() {
2727 const bool is_mali = context.cl_context ()->IsArmMali ();
2828
2929 conv_param_ = param_.get_mutable <param_t >();
30+ auto x_dims = conv_param_->x ->dims ();
31+ input_tensor_n_ = x_dims[0 ];
32+ input_tensor_c_ = x_dims[1 ];
33+ input_tensor_h_ = x_dims[2 ];
34+ input_tensor_w_ = x_dims[3 ];
35+
36+ auto output_dims = conv_param_->output ->dims ();
37+ output_tensor_n_ = output_dims[0 ];
38+ output_tensor_c_ = output_dims[1 ];
39+ output_tensor_h_ = output_dims[2 ];
40+ output_tensor_w_ = output_dims[3 ];
41+
3042 auto filter_dims = conv_param_->filter ->dims ();
3143 filter_tensor_c_ = filter_dims[1 ];
3244 filter_tensor_h_ = filter_dims[2 ];
@@ -56,14 +68,14 @@ void ConvTransposeImageCompute::PrepareForRun() {
5668 std::vector<float > filter_cpu_trans (conv_param_->filter ->numel ());
5769 DDimLite filter_trans_dims{
5870 {filter_dims[1 ], filter_dims[0 ], filter_dims[2 ], filter_dims[3 ]}};
71+
5972 // Convert filter layout from IOHW to OIHW
6073 IOHW2OIHW <float , int64_t >(filter_cpu,
6174 filter_cpu_trans.data (),
6275 filter_trans_dims[0 ],
6376 filter_trans_dims[1 ],
6477 filter_trans_dims[2 ],
6578 filter_trans_dims[3 ]);
66-
6779 filter_gpu_image_ = std::unique_ptr<Tensor>(new Tensor);
6880 tensor_hold_filter_image_ = std::unique_ptr<Tensor>(new Tensor);
6981 tensor_hold_bias_image_ = std::unique_ptr<Tensor>(new Tensor);
@@ -72,6 +84,23 @@ void ConvTransposeImageCompute::PrepareForRun() {
7284 std::string kernel_name = " conv2d_transpose" ;
7385 kernel_func_names_.push_back (kernel_name);
7486
87+ CLImageConverterNBlock converter;
88+ const DDim& filter_image_dims =
89+ converter.InitImageDimInfoWith (filter_trans_dims);
90+ filter_image_w_ = filter_image_dims[0 ]; // ((C + 3) / 4) * 4;
91+ filter_image_h_ = filter_image_dims[1 ]; // ((N + 3) / 4) * H * W;
92+ tensor_hold_filter_image_->Resize ({1 , filter_image_w_, filter_image_h_, 4 });
93+ auto * filter_image_data = MUTABLE_DATA_CPU (tensor_hold_filter_image_);
94+
95+ converter.NCHWToImage (
96+ filter_cpu_trans.data (), filter_image_data, filter_trans_dims);
97+ MUTABLE_DATA_GPU (
98+ filter_gpu_image_, filter_image_w_, filter_image_h_, filter_image_data);
99+ } else if ((groups_ == input_tensor_c_) && (groups_ == output_tensor_c_)) {
100+ // for depthwsie conv transpose
101+ std::string kernel_name = " depthwise_conv2d_transpose" ;
102+ kernel_func_names_.push_back (kernel_name);
103+
75104 CLImageConverterNBlock converter;
76105 const DDim& filter_image_dims =
77106 converter.InitImageDimInfoWith (filter_trans_dims);
@@ -86,7 +115,8 @@ void ConvTransposeImageCompute::PrepareForRun() {
86115 filter_gpu_image_, filter_image_w_, filter_image_h_, filter_image_data);
87116 } else {
88117 LOG (FATAL )
89- << " conv2d_transpose image compute not support this condition yet!" ;
118+ << " conv2d_transpose image compute not support this condition yet! "
119+ << groups_ << " " << input_tensor_c_ << " " << output_tensor_c_;
90120 }
91121
92122 // build options
@@ -180,7 +210,11 @@ void ConvTransposeImageCompute::PrepareForRun() {
180210 << conv_param_->scale_activation_type ;
181211 }
182212
183- kernel_func_paths_.push_back (" image/conv2d_transpose_kernel.cl" );
213+ if (groups_ == 1 ) {
214+ kernel_func_paths_.push_back (" image/conv2d_transpose_kernel.cl" );
215+ } else if ((groups_ == input_tensor_c_) && (groups_ == output_tensor_c_)) {
216+ kernel_func_paths_.push_back (" image/depthwise_conv2d_transpose_kernel.cl" );
217+ }
184218 VLOG (1 ) << " kernel_func_names_[0]:" << kernel_func_names_[0 ]
185219 << " kernel_func_paths_[0]:" << kernel_func_paths_[0 ];
186220 build_options_.push_back (build_options_single);
@@ -209,19 +243,11 @@ void ConvTransposeImageCompute::ReInitWhenNeeded() {
209243 is_first_epoch_for_run_ = false ;
210244 last_input_dims_ = x_dims;
211245
212- input_tensor_n_ = x_dims[0 ];
213- input_tensor_c_ = x_dims[1 ];
214- input_tensor_h_ = x_dims[2 ];
215- input_tensor_w_ = x_dims[3 ];
216246 auto x_image_shape = InitImageDimInfoWith (x_dims);
217247 input_image_h_ = x_image_shape[" height" ];
218248 input_image_w_ = x_image_shape[" width" ];
219249
220250 auto output_dims = conv_param_->output ->dims ();
221- output_tensor_n_ = output_dims[0 ];
222- output_tensor_c_ = output_dims[1 ];
223- output_tensor_h_ = output_dims[2 ];
224- output_tensor_w_ = output_dims[3 ];
225251 auto output_image_shape = InitImageDimInfoWith (output_dims);
226252 output_image_h_ = output_image_shape[" height" ];
227253 output_image_w_ = output_image_shape[" width" ];
@@ -247,13 +273,17 @@ void ConvTransposeImageCompute::SetGlobalWorkSize() {
247273 global_work_size_ = cl::NDRange{static_cast <size_t >(gws[0 ]),
248274 static_cast <size_t >(gws[1 ]),
249275 static_cast <size_t >(gws[2 ])};
276+ LOG (INFO ) << " global_work_size_: " << gws[0 ] << " " << gws[1 ] << " "
277+ << gws[2 ];
250278}
251279
252280void ConvTransposeImageCompute::SetArgs () {
253281 const int pad_w = filter_tensor_w_ - 1 - pad_left_;
254282 const int pad_h = filter_tensor_h_ - 1 - pad_up_;
255283 const int align_w = stride_w_ - 1 - pad_w;
256284 const int align_h = stride_h_ - 1 - pad_h;
285+ LOG (INFO ) << " pad_w, pad_h: " << pad_w << " " << pad_h;
286+ LOG (INFO ) << " align_w, align_h: " << align_w << " " << align_h;
257287 cl_int2 pad_wh = {pad_w, pad_h};
258288 cl_int2 align_wh = {align_w, align_h};
259289
@@ -371,3 +401,22 @@ REGISTER_LITE_KERNEL(conv2d_transpose,
371401 DATALAYOUT (kImageDefault ))})
372402 .BindPaddleOpVersion(" conv2d_transpose" , 1 )
373403 .Finalize();
404+
405+ REGISTER_LITE_KERNEL (depthwise_conv2d_transpose,
406+ kOpenCL ,
407+ kFP16 ,
408+ kImageDefault ,
409+ paddle::lite::kernels::opencl::ConvTransposeImageCompute,
410+ image2d)
411+ .BindInput(" Input" ,
412+ {LiteType::GetTensorTy (TARGET (kOpenCL ),
413+ PRECISION (kFP16 ),
414+ DATALAYOUT (kImageDefault ))})
415+ .BindInput(" Bias" , {LiteType::GetTensorTy (TARGET (kARM ))})
416+ .BindInput(" Filter" , {LiteType::GetTensorTy (TARGET (kARM ))})
417+ .BindOutput(" Output" ,
418+ {LiteType::GetTensorTy (TARGET (kOpenCL ),
419+ PRECISION (kFP16 ),
420+ DATALAYOUT (kImageDefault ))})
421+ .BindPaddleOpVersion(" depthwise_conv2d_transpose" , 1 )
422+ .Finalize();
0 commit comments