Files
2026-07-13 13:33:03 +08:00

128 lines
2.8 KiB
Plaintext

layout(set=0, binding=0) writeonly buffer destBuffer{
FLOAT4 data[];
} uOutput;
layout(set=0, binding=1) readonly buffer sourceBuffer0{
FLOAT4 data[];
} uInput;
layout(set=0, binding=2) uniform constBuffer{
ivec4 size; // x: limit, y: channelC4*b, z:height, w:width
vec4 slope;
} uConstant;
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
void main()
{
ivec3 posTmp = ivec3(gl_GlobalInvocationID);
if (posTmp.x < uConstant.size.x) {
FLOAT4 value = uInput.data[posTmp.x];
#ifdef NEG
value = -value;
#endif
#ifdef EXP
value = exp(value);
#endif
#ifdef SIGN
value = sign(value);
#endif
#ifdef SQRT
value = sqrt(value);
#endif
#ifdef RSQRT
value = inversesqrt(value);
#endif
#ifdef ABS
value = abs(value);
#endif
#ifdef TANH
value = tanh(value);
#endif
#ifdef SQUARE
value = value * value;
#endif
#ifdef LOG
value = log(value + FLOAT4(0.0000001));
#endif
#ifdef SIGMOID
value = FLOAT4(1.f) / (FLOAT4(1.f) + exp(-value));
#endif
#ifdef TAN
value = tan(value);
#endif
#ifdef COS
value = cos(value);
#endif
#ifdef SIN
value = sin(value);
#endif
#ifdef CEIL
value = ceil(value);
#endif
#ifdef FLOOR
value = floor(value);
#endif
#ifdef EXPM1
value = exp(value) - FLOAT4(1);
#endif
#ifdef RECIPROCAL
value = FLOAT4(1) / value;
#endif
#ifdef SINH
value = sinh(value);
#endif
#ifdef ASINH
value = asinh(value);
#endif
#ifdef ASIN
value = asin(value);
#endif
#ifdef COSH
value = cosh(value);
#endif
#ifdef ACOSH
value = acosh(value);
#endif
#ifdef ACOS
value = acos(value);
#endif
#ifdef ATAN
value = atan(value);
#endif
#ifdef ATANH
value = atanh(value);
#endif
#ifdef LOG1P
value = log(FLOAT4(1) + value);
#endif
#ifdef ROUND
value = round(value);
#endif
#ifdef RELU
bvec4 lessZero = bvec4(lessThan(value, FLOAT4(0.0)));
FLOAT4 dataTemp = value * FLOAT4(uConstant.slope.x);
value = mix(value, dataTemp, lessZero);
#endif
#ifdef CLAMP
value = clamp(value, FLOAT4(uConstant.slope.x), FLOAT4(uConstant.slope.y));
#endif
#ifdef HARDSWISH
const FLOAT4 leftMask = FLOAT4(greaterThan(value, FLOAT4(-3.0f)));
const FLOAT4 rightMask = FLOAT4(lessThan(value, FLOAT4(3.0f)));
value = leftMask*value*(rightMask*((value+FLOAT4(3.0f))/FLOAT4(6.0f)) + FLOAT4(1.0f) - rightMask);
#endif
#ifdef GELU
vec4 temp = FLOAT4(0.044715) * value * value * value;
temp = FLOAT4(0.79788458) * (temp + value);
value = (FLOAT4(1.0) + FLOAT4(tanh(temp))) * value * FLOAT4(0.5);
#endif
#ifdef SILU
value = value / (FLOAT4(1.f) + exp(-value));
#endif
uOutput.data[posTmp.x] = value;
}
}