Spaces:
Runtime error
Runtime error
// device subgroup size | |
layout (local_size_x_id = 0) in; | |
layout(binding = 0) readonly buffer tensorInA { float inA[]; }; | |
layout(binding = 1) readonly buffer tensorInB { float inB[]; }; | |
layout(binding = 2) writeonly buffer tensorOut { float out_[]; }; | |
layout(push_constant) uniform parameter { | |
uint inAOff; | |
uint inBOff; | |
uint outOff; | |
int ne00; | |
int ne01; | |
int ne02; | |
int ne11; | |
int ne12; | |
uint nb01; | |
uint nb02; | |
uint nb11; | |
uint nb12; | |
uint nb1; | |
uint nb2; | |
} | |
pcs; | |
void main() { | |
uvec3 gid = gl_WorkGroupID; | |
uint bc_ab = pcs.ne12 > pcs.ne02 ? gid.z / (pcs.ne12 / pcs.ne02) : gid.z; | |
uint bc_ba = pcs.ne02 > pcs.ne12 ? gid.z / (pcs.ne02 / pcs.ne12) : gid.z; | |
const uint x = (gid.x*pcs.nb01 + bc_ab*pcs.nb02) / 4 + pcs.inAOff; // Based from inA | |
const uint y = (gid.y*pcs.nb11 + bc_ba*pcs.nb12) / 4 + pcs.inBOff; // based from inB | |
float sum = 0.0f; | |
for (uint i = gl_SubgroupInvocationID.x; i < pcs.ne00; i += gl_SubgroupSize) { | |
sum += float(inA[x+i]) * float(inB[y+i]); | |
} | |
const float all_sum = subgroupAdd(sum); | |
if (subgroupElect()) { | |
out_[gid.z*(pcs.nb2/4) + gid.y*(pcs.nb1/4) + gid.x + pcs.outOff] = all_sum; | |
} | |
} | |