Skip to content

Commit 71ec3d8

Browse files
committed
add [ImageDefault] -> [ImageFolder] test=develop
1 parent 43407f8 commit 71ec3d8

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed

lite/backends/opencl/cl_kernel/image/layout_kernel.cl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,42 @@ __kernel void image2d_to_buffer_with_post255(__read_only image2d_t input,
312312
}
313313
}
314314

315+
////////////////////////////////////////////////////////
316+
// image2d_default -> image2d_folder
317+
////////////////////////////////////////////////////////
318+
__kernel void image2d_default_to_image2d_folder(__read_only image2d_t input,
319+
__write_only image2d_t output,
320+
__private const int in_img_w,
321+
__private const int in_img_h) {
322+
const int pos_x = get_global_id(0);
323+
const int pos_y = get_global_id(1);
324+
325+
CL_DTYPE4 in =
326+
READ_IMG_TYPE(CL_DTYPE_CHAR, input, SAMPLER, (int2)(pos_x, pos_y));
327+
328+
CL_DTYPE4 in0 = 0.f;
329+
CL_DTYPE4 in1 = 0.f;
330+
CL_DTYPE4 in2 = 0.f;
331+
CL_DTYPE4 in3 = 0.f;
332+
333+
in0 = READ_IMG_TYPE(CL_DTYPE_CHAR, input, SAMPLER, (int2)(pos_x * 4, pos_y));
334+
if (pos_x * 4 + 1 < in_img_w) {
335+
in1 = READ_IMG_TYPE(
336+
CL_DTYPE_CHAR, input, SAMPLER, (int2)(pos_x * 4 + 1, pos_y));
337+
}
338+
if (pos_x * 4 + 2 < in_img_w) {
339+
in2 = READ_IMG_TYPE(
340+
CL_DTYPE_CHAR, input, SAMPLER, (int2)(pos_x * 4 + 2, pos_y));
341+
}
342+
if (pos_x * 4 + 3 < in_img_w) {
343+
in3 = READ_IMG_TYPE(
344+
CL_DTYPE_CHAR, input, SAMPLER, (int2)(pos_x * 4 + 3, pos_y));
345+
}
346+
347+
CL_DTYPE4 out = (CL_DTYPE4)(in0.x, in1.x, in2.x, in3.x);
348+
WRITE_IMG_TYPE(CL_DTYPE_CHAR, output, (int2)(pos_x, pos_y), out);
349+
}
350+
315351
////////////////////////////////////////////////////////
316352
// image2d_folder -> image2d_default
317353
////////////////////////////////////////////////////////

lite/kernels/opencl/layout_image_compute.cc

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,102 @@ class LayoutComputeBufferChwToImage2DNw
417417
std::string build_options_{"-DCL_DTYPE_float "};
418418
};
419419

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+
420516
// [ImageFolder] -> [ImageDefault]
421517
class LayoutComputeImageFolderToImageDefault
422518
: public KernelLite<TARGET(kOpenCL),
@@ -698,6 +794,24 @@ REGISTER_LITE_KERNEL(
698794
DATALAYOUT(kNCHW))})
699795
.Finalize();
700796

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+
701815
// [ImageFolder] -> [ImageDefault]
702816
REGISTER_LITE_KERNEL(
703817
layout,

0 commit comments

Comments
 (0)