Browse Source

add innerproduct pack1to4 pack4to1 shader

tags/20190320
nihui 7 years ago
parent
commit
3f91d6b529
2 changed files with 150 additions and 0 deletions
  1. +75
    -0
      src/layer/shader/innerproduct_pack1to4.comp
  2. +75
    -0
      src/layer/shader/innerproduct_pack4to1.comp

+ 75
- 0
src/layer/shader/innerproduct_pack1to4.comp View File

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

+ 75
- 0
src/layer/shader/innerproduct_pack4to1.comp View File

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

Loading…
Cancel
Save