diff --git a/src/operators/dropout_op.cpp b/src/operators/dropout_op.cpp index 5a0d7cec07b5b7654b4e67dcd899dd425667be27..c0dafa424ea381f088df7a0f796bc57661286fee 100644 --- a/src/operators/dropout_op.cpp +++ b/src/operators/dropout_op.cpp @@ -30,6 +30,9 @@ namespace ops = paddle_mobile::operators; #ifdef PADDLE_MOBILE_CPU REGISTER_OPERATOR_CPU(dropout, ops::DropoutOp); #endif +#ifdef PADDLE_MOBILE_CL +REGISTER_OPERATOR_CL(dropout, ops::DropoutOp); +#endif #ifdef PADDLE_MOBILE_FPGA REGISTER_OPERATOR_FPGA(dropout, ops::DropoutOp); #endif diff --git a/src/operators/kernel/cl/cl_kernel/dropout_kernel.cl b/src/operators/kernel/cl/cl_kernel/dropout_kernel.cl new file mode 100644 index 0000000000000000000000000000000000000000..fc9dfc872691f9fb0ff4d547c78a4a3408197302 --- /dev/null +++ b/src/operators/kernel/cl/cl_kernel/dropout_kernel.cl @@ -0,0 +1,42 @@ +/* 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 dropout(__read_only image2d_t input_image, + __write_only image2d_t output_image, + __private const int out_W, + __private const float dropoutPro) { + + const int out_c = get_global_id(0); + const int out_w = get_global_id(1); + const int out_nh = get_global_id(2); + + int2 output_pos; + output_pos.x = out_c * out_W + out_w; + output_pos.y = out_nh; + + const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | + CLK_ADDRESS_CLAMP | + CLK_FILTER_NEAREST; + half4 input; + half4 output; + + input = read_imageh(input_image, sampler,output_pos); + half4 dropout = (half4)(1 - dropoutPro); + output = dropout * input; + + write_imageh(output_image, output_pos, output); +} + diff --git a/src/operators/kernel/cl/dropout_kernel.cpp b/src/operators/kernel/cl/dropout_kernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..db9437841b20e8afa3aeaae9e0282056dc8441a7 --- /dev/null +++ b/src/operators/kernel/cl/dropout_kernel.cpp @@ -0,0 +1,59 @@ +/* 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. */ + +#ifdef DROPOUT_OP + +#include "operators/kernel/dropout_kernel.h" + +namespace paddle_mobile { +namespace operators { + +template <> +bool DropoutKernel::Init(DropoutParam *param) { + this->cl_helper_.AddKernel("dropout", "dropout_kernel.cl"); + return true; +} + +template <> +void DropoutKernel::Compute(const DropoutParam ¶m) { + auto kernel = this->cl_helper_.KernelAt(0); + auto default_work_size = this->cl_helper_.DefaultWorkSize(*(param.Out())); + auto *input_image = param.InputX()->GetCLImage(); + auto *output_image = param.Out()->GetCLImage(); + const float dropoutProb = param.DropoutProb(); + const auto &inputDim = param.InputX()->dims(); + int input_dims[4] = {1, 1, 1, 1}; + // 1 1000 1 1 + for (int i = 0; i < inputDim.size(); i++) { + input_dims[4 - inputDim.size() + i] = inputDim[i]; + } + int out_W = input_dims[1]; + cl_int status; + status = clSetKernelArg(kernel, 0, sizeof(cl_mem), &input_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 1, sizeof(cl_mem), &output_image); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 2, sizeof(int), &out_W); + CL_CHECK_ERRORS(status); + status = clSetKernelArg(kernel, 3, sizeof(float), &dropoutProb); + CL_CHECK_ERRORS(status); + status = clEnqueueNDRangeKernel( + this->cl_helper_.CLCommandQueue(), kernel, default_work_size.size(), NULL, + default_work_size.data(), NULL, 0, NULL, NULL); + CL_CHECK_ERRORS(status); +} +} // namespace operators +} // namespace paddle_mobile + +#endif diff --git a/src/operators/kernel/cl/mul_kernel.cpp b/src/operators/kernel/cl/mul_kernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c59483c14fd957a4e3a0dbb2e2436ef8db6cfcd3 --- /dev/null +++ b/src/operators/kernel/cl/mul_kernel.cpp @@ -0,0 +1,35 @@ +/* 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. */ + +#ifdef MUL_OP + +#include "operators/kernel/mul_kernel.h" + +namespace paddle_mobile { +namespace operators { + +template <> +bool MulKernel::Init(MulParam *param) { + return true; +} + +template <> +void MulKernel::Compute(const MulParam ¶m) {} + +template class MulKernel; + +} // namespace operators +} // namespace paddle_mobile + +#endif diff --git a/src/operators/mul_op.cpp b/src/operators/mul_op.cpp index 69e3bb300d741e74ab8d6eea6c62052b4d0d8f1d..ec9c8e225422bc9c0cda0550775e67c962426490 100644 --- a/src/operators/mul_op.cpp +++ b/src/operators/mul_op.cpp @@ -58,6 +58,9 @@ namespace ops = paddle_mobile::operators; #ifdef PADDLE_MOBILE_CPU REGISTER_OPERATOR_CPU(mul, ops::MulOp); #endif +#ifdef PADDLE_MOBILE_CL +REGISTER_OPERATOR_CL(mul, ops::MulOp); +#endif #ifdef PADDLE_MOBILE_MALI_GPU REGISTER_OPERATOR_MALI_GPU(mul, ops::MulOp); #endif