128 lines
2.8 KiB
Plaintext
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;
|
|
}
|
|
}
|