Files
alibaba--mnn/source/backend/vulkan/buffer/execution/glsl/convolutionDepthwise.comp
T
2026-07-13 13:33:03 +08:00

78 lines
2.3 KiB
Plaintext

layout(set=0, binding=0) writeonly buffer destBuffer{
FLOAT4 data[];
} uOutput;
layout(set=0, binding=1) readonly buffer inputBuffer {
FLOAT4 data[];
} uInput;
layout(set=0, binding=2) readonly buffer KernelBuffer{
FLOAT4 data[];
} uKernel;
layout(set=0, binding=3) readonly buffer BiasBuffer{
FLOAT4 data[];
} uBias;
layout(set=0, binding=4) uniform constBuffer {
ivec2 pad;
ivec2 kernelSize;
ivec2 stride;
ivec2 dilate;
ivec4 inputSize;
ivec4 outputSize;
ivec4 offset;//batchOffset, hOffset, outputHeight, other
} uConstant;
#define UP_DIV(x, y) (((x)+(y)-1)/(y))
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
void main()
{
ivec3 pos = ivec3(gl_GlobalInvocationID);
ivec3 outputSize = uConstant.outputSize.xyz;
int oz = pos.z / uConstant.outputSize.w;
int ob = pos.z % uConstant.outputSize.w;
if (all(lessThan(pos.xy, outputSize.xy)))
{
ivec3 inputSize = uConstant.inputSize.xyz;
ivec2 s0 = pos.xy*uConstant.stride-uConstant.pad;
ivec2 sta = max(ivec2(0, 0), (UP_DIV(-s0, uConstant.dilate)));
ivec2 end = min(uConstant.kernelSize, UP_DIV(uConstant.inputSize.xy - s0, uConstant.dilate));
int fx, fy, fz;
FLOAT4 color = uBias.data[oz];
for (fy=sta.y; fy<end.y; ++fy)
{
int sy = fy*uConstant.dilate.y + s0.y;
for (fx=sta.x; fx<end.x; ++fx)
{
int sx = fx*uConstant.dilate.x + s0.x;
int iPos = sx
+ sy * uConstant.inputSize.x
+ oz * uConstant.inputSize.x * uConstant.inputSize.y * uConstant.outputSize.w
+ ob * uConstant.inputSize.x * uConstant.inputSize.y
;
FLOAT4 inputValue = uInput.data[iPos];
FLOAT4 k = uKernel.data[fx+fy*uConstant.kernelSize.x + oz * uConstant.kernelSize.x * uConstant.kernelSize.y];
color += k*inputValue;
}
}
#ifdef RELU
color = max(color, FLOAT4(0));
#endif
#ifdef RELU6
color = clamp(color, FLOAT4(0), FLOAT4(6));
#endif
int oPos = pos.x
+ pos.y * uConstant.outputSize.x
+ pos.z * uConstant.outputSize.x * uConstant.outputSize.y
;
uOutput.data[oPos] = color;
}
}