From 3f91d6b5294d7bf39bfef788ad1ffaee548d821c Mon Sep 17 00:00:00 2001 From: nihui Date: Mon, 11 Feb 2019 22:16:08 +0800 Subject: [PATCH] add innerproduct pack1to4 pack4to1 shader --- src/layer/shader/innerproduct_pack1to4.comp | 75 +++++++++++++++++++++ src/layer/shader/innerproduct_pack4to1.comp | 75 +++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 src/layer/shader/innerproduct_pack1to4.comp create mode 100644 src/layer/shader/innerproduct_pack4to1.comp diff --git a/src/layer/shader/innerproduct_pack1to4.comp b/src/layer/shader/innerproduct_pack1to4.comp new file mode 100644 index 000000000..a9bf21ed8 --- /dev/null +++ b/src/layer/shader/innerproduct_pack1to4.comp @@ -0,0 +1,75 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// 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. + +#version 450 + +layout (constant_id = 0) const int bias_term = 0; + +layout (local_size_x_id = 233) in; +layout (local_size_y_id = 234) in; +layout (local_size_z_id = 235) in; + +layout (binding = 0) readonly buffer bottom_blob { float bottom_blob_data[]; }; +layout (binding = 1) writeonly buffer top_blob { vec4 top_blob_data[]; }; +layout (binding = 2) readonly buffer weight { vec4 weight_data[]; }; +layout (binding = 3) readonly buffer bias { vec4 bias_data[]; }; + +layout (push_constant) uniform parameter +{ + int dims; + int w; + int h; + int c; + int cstep; + + int outdims; + int outw; + int outh; + int outc; + int outcstep; +} p; + +void main() +{ + int gx = int(gl_GlobalInvocationID.x); + int gy = int(gl_GlobalInvocationID.y); + int gz = int(gl_GlobalInvocationID.z); + + if (gx >= p.outw || gy >= 1 || gz >= 1) + return; + + vec4 sum; + + if (bias_term == 1) + { + sum = bias_data[gx]; + } + else + { + sum = vec4(0.0); + } + + int w_offset = gx * p.w; + + for (int i = 0; i < p.w; i++) + { + float v = bottom_blob_data[i]; + + vec4 k = weight_data[w_offset + i]; + + sum += v * k; + } + + top_blob_data[gx] = sum; +} diff --git a/src/layer/shader/innerproduct_pack4to1.comp b/src/layer/shader/innerproduct_pack4to1.comp new file mode 100644 index 000000000..cbd27881d --- /dev/null +++ b/src/layer/shader/innerproduct_pack4to1.comp @@ -0,0 +1,75 @@ +// Tencent is pleased to support the open source community by making ncnn available. +// +// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// +// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/licenses/BSD-3-Clause +// +// 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. + +#version 450 + +layout (constant_id = 0) const int bias_term = 0; + +layout (local_size_x_id = 233) in; +layout (local_size_y_id = 234) in; +layout (local_size_z_id = 235) in; + +layout (binding = 0) readonly buffer bottom_blob { vec4 bottom_blob_data[]; }; +layout (binding = 1) writeonly buffer top_blob { float top_blob_data[]; }; +layout (binding = 2) readonly buffer weight { vec4 weight_data[]; }; +layout (binding = 3) readonly buffer bias { float bias_data[]; }; + +layout (push_constant) uniform parameter +{ + int dims; + int w; + int h; + int c; + int cstep; + + int outdims; + int outw; + int outh; + int outc; + int outcstep; +} p; + +void main() +{ + int gx = int(gl_GlobalInvocationID.x); + int gy = int(gl_GlobalInvocationID.y); + int gz = int(gl_GlobalInvocationID.z); + + if (gx >= p.outw || gy >= 1 || gz >= 1) + return; + + float sum; + + if (bias_term == 1) + { + sum = bias_data[gx]; + } + else + { + sum = 0.f; + } + + int w_offset = gx * p.w; + + for (int i = 0; i < p.w; i++) + { + vec4 v = bottom_blob_data[i]; + + vec4 k = weight_data[w_offset + i]; + + sum += dot(v, k); + } + + top_blob_data[gx] = sum; +}