From f15275d1a39da9865da7227f12122711ebab7ffe Mon Sep 17 00:00:00 2001 From: yangfei Date: Tue, 16 Oct 2018 15:08:24 +0800 Subject: [PATCH] imp add op kernel --- .../kernel/cl/cl_kernel/channel_add_kernel.cl | 29 +++++++++ .../cl/cl_kernel/elementwise_add_kernel.cl | 16 +++-- .../kernel/cl/cl_kernel/feed_kernel.cl | 4 +- .../kernel/cl/elementwise_add_kernel.cpp | 60 ++++++++++++++++++- src/operators/kernel/cl/feed_kernel.cpp | 3 +- 5 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 src/operators/kernel/cl/cl_kernel/channel_add_kernel.cl diff --git a/src/operators/kernel/cl/cl_kernel/channel_add_kernel.cl b/src/operators/kernel/cl/cl_kernel/channel_add_kernel.cl new file mode 100644 index 0000000000..f3065844f8 --- /dev/null +++ b/src/operators/kernel/cl/cl_kernel/channel_add_kernel.cl @@ -0,0 +1,29 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +__kernel void channel_add(__global image2d_t input, __global image2d_t bias,__write_only image2d_t outputImage,int w) { + int x = get_global_id(0); + int y = get_global_id(1); + const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + int2 coords; + coords.x = x; + coords.y = y; + int2 coords_bias; + coords_bias.x = x/w; + coords_bias.y = 1; + half4 in = read_imageh(input, sampler, coords); + half4 biase = read_imageh(bias, sampler, coords_bias); + half4 output = in + biase; + write_imageh(outputImage,coords,output); + } diff --git a/src/operators/kernel/cl/cl_kernel/elementwise_add_kernel.cl b/src/operators/kernel/cl/cl_kernel/elementwise_add_kernel.cl index f731a61a82..642ec025e1 100644 --- a/src/operators/kernel/cl/cl_kernel/elementwise_add_kernel.cl +++ b/src/operators/kernel/cl/cl_kernel/elementwise_add_kernel.cl @@ -11,8 +11,16 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ - -__kernel void elementwise_add(__global float* in, __global float* out) { - int num = get_global_id(0); - out[num] = in[num] * 0.1 + 102; +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +__kernel void elementwise_add(__global image2d_t input, __global image2d_t bias,__write_only image2d_t outputImage) { + int x = get_global_id(0); + int y = get_global_id(1); + const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + int2 coords; + coords.x = x; + coords.y = y; + half4 in = read_imageh(input, sampler, coords); + half4 biase = read_imageh(bias, sampler, coords); + half4 output = in + biase; + write_imageh(outputImage,coords,output); } diff --git a/src/operators/kernel/cl/cl_kernel/feed_kernel.cl b/src/operators/kernel/cl/cl_kernel/feed_kernel.cl index 693ec2be0e..32d93ad93e 100644 --- a/src/operators/kernel/cl/cl_kernel/feed_kernel.cl +++ b/src/operators/kernel/cl/cl_kernel/feed_kernel.cl @@ -1,8 +1,8 @@ #pragma OPENCL EXTENSION cl_khr_fp16 : enable __kernel void feed(__global float *in, __write_only image2d_t outputImage,int h,int w) { - int j = get_global_id(0); - int i = get_global_id(1); + int i = get_global_id(0); + int j = get_global_id(1); half4 pixel; pixel.x = convert_half(in[(i * w + j)]); pixel.y = convert_half(in[h * w + (i * w + j)]); diff --git a/src/operators/kernel/cl/elementwise_add_kernel.cpp b/src/operators/kernel/cl/elementwise_add_kernel.cpp index f68373677b..6cc7b819b1 100644 --- a/src/operators/kernel/cl/elementwise_add_kernel.cpp +++ b/src/operators/kernel/cl/elementwise_add_kernel.cpp @@ -22,14 +22,68 @@ namespace operators { template <> bool ElementwiseAddKernel::Init( ElementwiseAddParam *param) { - // this->cl_helper_.AddKernel("elementwise_add", - // "elementwise_add_kernel.cl"); + CLImage *bias = (CLImage*)param->InputY(); + bias->InitCLImage(cl_helper_.CLContext()); + if(bias->dims().size()==4){ + this->cl_helper_.AddKernel("elementwise_add", "elementwise_add_kernel.cl"); + }else if(param->InputY()->dims().size()==1){ + DLOG<<"-----init add-----"; + this->cl_helper_.AddKernel("channel_add", "channel_add_kernel.cl"); + }else{ + DLOG << "error:bias dims is error"; + } + return true; } template <> void ElementwiseAddKernel::Compute( - const ElementwiseAddParam ¶m) {} + const ElementwiseAddParam ¶m) { + auto input = param.InputX(); + auto bias = param.InputY(); + auto output = param.Out(); + cl_int status; + auto kernel = this->cl_helper_.KernelAt(0); + if(bias->dims().size()==4){ + cl_mem input_image = input->GetCLImage(); + cl_mem bias_image = bias->GetCLImage(); + cl_mem output_image = output->GetCLImage(); + status = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&input_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&bias_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&output_image); + CL_CHECK_ERRORS(status); + int width = input->ImageWidth(); + int height = input->ImageHeight(); + size_t global_work_size[2] = {width, height}; + status = clEnqueueNDRangeKernel(this->cl_helper_.CLCommandQueue(), kernel, 2, + NULL, global_work_size, NULL, 0, NULL, NULL); + CL_CHECK_ERRORS(status); + }else if(bias->dims().size()==1){ + cl_mem input_image = input->GetCLImage(); + cl_mem bias_image = bias->GetCLImage(); + cl_mem output_image = output->GetCLImage(); + int tensor_w = input->dims()[4]; + status = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&input_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&bias_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&output_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&tensor_w); + CL_CHECK_ERRORS(status); + int width = input->ImageWidth(); + int height = input->ImageHeight(); + size_t global_work_size[2] = {width, height}; + status = clEnqueueNDRangeKernel(this->cl_helper_.CLCommandQueue(), kernel, 2, + NULL, global_work_size, NULL, 0, NULL, NULL); + CL_CHECK_ERRORS(status); + }else{ + DLOG << "error:bias dims is error"; + } + +} template class ElementwiseAddKernel; diff --git a/src/operators/kernel/cl/feed_kernel.cpp b/src/operators/kernel/cl/feed_kernel.cpp index eac8446f57..6b4d883733 100644 --- a/src/operators/kernel/cl/feed_kernel.cpp +++ b/src/operators/kernel/cl/feed_kernel.cpp @@ -49,7 +49,7 @@ void FeedKernel::Compute(const FeedParam ¶m) { status = clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&height); CL_CHECK_ERRORS(status); - size_t global_work_size[2] = {height, width}; + size_t global_work_size[2] = {width, height}; status = clEnqueueNDRangeKernel(this->cl_helper_.CLCommandQueue(), kernel, 2, NULL, global_work_size, NULL, 0, NULL, NULL); CL_CHECK_ERRORS(status); @@ -61,7 +61,6 @@ void FeedKernel::Compute(const FeedParam ¶m) { size_t region[3] = {height, width, 1}; clEnqueueReadImage(commandQueue, cl_image, CL_TRUE, origin, region, 0, 0, out, 0, NULL, NULL); - } template class FeedKernel; -- GitLab