| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||