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 0000000000000000000000000000000000000000..f3065844f886b40b6a4e6672e197abdab9341987 --- /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 f731a61a82f9d1e7d44e760037512157c4ffef19..642ec025e151be0f2eafb457a3fa20ed2d292e8b 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 693ec2be0e45cf7536467e89f787275e7324b6ff..32d93ad93e3e181d8f8b2470d18968842236a595 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 f68373677bbd383d42bf6b3920e567a0118be254..6cc7b819b104ad3819065df3fe0d42fa923189bf 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 eac8446f572bb3398461fa386dd8c94c39597179..6b4d883733634401f293ff304d63bfb3d913e134 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;