layout(set=0, binding=0) writeonly buffer d0{ FLOAT data[]; } uOutput; layout(set=0, binding=1) readonly buffer s0{ FLOAT data[]; } uInputA; layout(set=0, binding=2) readonly buffer s1{ FLOAT data[]; } uInputB; layout(set=0, binding=3) readonly buffer s3{ int data[]; } uOOffset; layout(set=0, binding=4) readonly buffer s4{ int data[]; } uAOffset; layout(set=0, binding=5) readonly buffer s5{ int data[]; } uBOffset; layout(set=0, binding=6) uniform constBuffer{ ivec4 size; ivec4 stride_o; ivec4 stride_a; ivec4 stride_b; ivec4 stride_c; // Bias ivec4 step; ivec4 iter; } uConstant; layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in; void main() { ivec3 posTmp = ivec3(gl_GlobalInvocationID); int e = uConstant.size.x; int l = uConstant.size.y; int h = uConstant.size.z; int n = uConstant.size.w; int eh = e * h; if (posTmp.x < eh * n) { int regionInsideIndex = posTmp.x % eh; int regionOutsideIndex = posTmp.x / eh; int X = regionInsideIndex % e; int Y = regionInsideIndex / e; int srcBasicOffset, dstBasicOffset; ivec4 index = ivec4(regionOutsideIndex, regionOutsideIndex, regionOutsideIndex, regionOutsideIndex); if (uConstant.iter.x >= 0) { index.x = int(uOOffset.data[regionOutsideIndex]); } if (uConstant.iter.y >= 0) { index.y = int(uAOffset.data[regionOutsideIndex]); } if (uConstant.iter.z >= 0) { index.z = int(uBOffset.data[regionOutsideIndex]); } ivec4 offset = index * uConstant.step; FLOAT value = FLOAT(0.0); int aOffset = offset.y + uConstant.stride_a.w + X * uConstant.stride_a.x; int bOffset = offset.z + uConstant.stride_b.w + Y * uConstant.stride_b.z; for (int i=0; i