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