@@ -417,6 +417,102 @@ class LayoutComputeBufferChwToImage2DNw
417
417
std::string build_options_{" -DCL_DTYPE_float " };
418
418
};
419
419
420
+ // [ImageDefault] -> [ImageFolder]
421
+ class LayoutComputeImageDefaultToImageFolder
422
+ : public KernelLite<TARGET(kOpenCL ),
423
+ PRECISION (kAny ),
424
+ DATALAYOUT(kImageFolder )> {
425
+ public:
426
+ using param_t = operators::LayoutParam;
427
+
428
+ void PrepareForRun () override {
429
+ auto & param = Param<param_t >();
430
+ VLOG (1 ) << " kernel_func_name_:" << kernel_func_name_;
431
+ auto & context = ctx_->As <OpenCLContext>();
432
+ context.cl_context ()->AddKernel (kernel_func_name_,
433
+ " image/layout_kernel.cl" ,
434
+ build_options_,
435
+ time_stamp_);
436
+ }
437
+
438
+ #ifdef LITE_WITH_PROFILE
439
+ void SetProfileRuntimeKernelInfo (paddle::lite::profile::OpCharacter* ch) {
440
+ ch->kernel_func_name = kernel_func_name_;
441
+ ch->cl_event =
442
+ event_; // `event_` defined in `kernel.h`, valid after kernel::Run
443
+ }
444
+ #endif
445
+
446
+ void Run () override {
447
+ auto & param = Param<param_t >();
448
+ auto x_dims = param.x ->dims ();
449
+ auto y_dims = param.y ->dims ();
450
+
451
+ CLImageConverterDefault default_converter;
452
+ CLImageConverterFolder folder_converter;
453
+ auto x_image_shape = default_converter.InitImageDimInfoWith (x_dims);
454
+ auto y_image_shape = folder_converter.InitImageDimInfoWith (y_dims);
455
+
456
+ const cl::Image2D* y_data =
457
+ MUTABLE_DATA_GPU (param.y , y_image_shape[0 ], y_image_shape[1 ], nullptr );
458
+ auto * x_data = GET_DATA_GPU (param.x );
459
+
460
+ #ifdef LITE_WITH_LOG
461
+ VLOG (2 ) << " x_dims:" << x_dims;
462
+ VLOG (2 ) << " y_dims:" << y_dims;
463
+ VLOG (2 ) << " x_image_shape(w,h):" << x_image_shape[0 ] << " "
464
+ << x_image_shape[1 ];
465
+ VLOG (2 ) << " y_image_shape(w,h):" << y_image_shape[0 ] << " "
466
+ << y_image_shape[1 ];
467
+ #endif
468
+
469
+ auto & context = ctx_->As <OpenCLContext>();
470
+ CHECK (context.cl_context () != nullptr );
471
+ STL::stringstream kernel_key;
472
+ kernel_key << kernel_func_name_ << build_options_ << time_stamp_;
473
+ auto kernel = context.cl_context ()->GetKernel (kernel_key.str ());
474
+
475
+ int arg_idx = 0 ;
476
+ cl_int status;
477
+ status = kernel.setArg (arg_idx, *x_data);
478
+ CL_CHECK_FATAL (status);
479
+ status = kernel.setArg (++arg_idx, *y_data);
480
+ CL_CHECK_FATAL (status);
481
+ status = kernel.setArg (++arg_idx, static_cast <const int >(x_image_shape[0 ]));
482
+ CL_CHECK_FATAL (status);
483
+ status = kernel.setArg (++arg_idx, static_cast <const int >(x_image_shape[1 ]));
484
+ CL_CHECK_FATAL (status);
485
+
486
+ auto global_work_size =
487
+ cl::NDRange{static_cast <cl::size_type>(y_image_shape[0 ]),
488
+ static_cast <cl::size_type>(y_image_shape[1 ])};
489
+ #ifdef LITE_WITH_LOG
490
+ for (auto i = 0 ; i < global_work_size.dimensions (); i++) {
491
+ VLOG (2 ) << " global_work_size[" << i << " ]: " << global_work_size[i];
492
+ }
493
+ #endif
494
+
495
+ status = EnqueueNDRangeKernel (context,
496
+ kernel,
497
+ cl::NullRange,
498
+ global_work_size,
499
+ cl::NullRange,
500
+ nullptr ,
501
+ event_);
502
+ CL_CHECK_FATAL (status);
503
+ }
504
+
505
+ std::string doc () const override {
506
+ return " Trans Layout from cl::Image2D(ImageDefault/RGBA) to "
507
+ " cl::Image2D(ImageFolder)" ;
508
+ }
509
+
510
+ private:
511
+ std::string time_stamp_{GetTimeStamp ()};
512
+ std::string kernel_func_name_{" image2d_default_to_image2d_folder" };
513
+ std::string build_options_{" " };
514
+ };
515
+
420
516
// [ImageFolder] -> [ImageDefault]
421
517
class LayoutComputeImageFolderToImageDefault
422
518
: public KernelLite<TARGET(kOpenCL ),
@@ -698,6 +794,24 @@ REGISTER_LITE_KERNEL(
698
794
DATALAYOUT (kNCHW ))})
699
795
.Finalize();
700
796
797
+ // [ImageDefault] -> [ImageFolder]
798
+ REGISTER_LITE_KERNEL (
799
+ layout,
800
+ kOpenCL ,
801
+ kAny ,
802
+ kImageFolder ,
803
+ paddle::lite::kernels::opencl::LayoutComputeImageDefaultToImageFolder,
804
+ ImageDefault_to_ImageFolder)
805
+ .BindInput(" Input" ,
806
+ {LiteType::GetTensorTy (TARGET (kOpenCL ),
807
+ PRECISION (kAny ),
808
+ DATALAYOUT (kImageDefault ))})
809
+ .BindOutput(" Out" ,
810
+ {LiteType::GetTensorTy (TARGET (kOpenCL ),
811
+ PRECISION (kAny ),
812
+ DATALAYOUT (kImageFolder ))})
813
+ .Finalize();
814
+
701
815
// [ImageFolder] -> [ImageDefault]
702
816
REGISTER_LITE_KERNEL (
703
817
layout,
0 commit comments