Spaces:
Runtime error
Runtime error
layout (binding = 0) readonly buffer A {A_TYPE data_a[];}; | |
layout (binding = 1) readonly buffer B {B_TYPE data_b[];}; | |
layout (binding = 2) writeonly buffer D {D_TYPE data_d[];}; | |
layout (binding = 3) readonly buffer IDS {int data_ids[];}; | |
layout (push_constant) uniform parameter | |
{ | |
uint ncols; | |
uint stride_a; | |
uint stride_b; | |
uint stride_d; | |
uint batch_stride_a; | |
uint batch_stride_b; | |
uint batch_stride_d; | |
uint nei0; | |
uint ne11; | |
uint ne02; | |
uint ne12; | |
uint broadcast2; | |
uint broadcast3; | |
} p; | |
void get_offsets(out uint a_offset, out uint b_offset, out uint d_offset) { | |
const uint expert_idx = gl_GlobalInvocationID.y; | |
const uint batch_idx = gl_GlobalInvocationID.y; | |
const uint i13 = batch_idx / p.ne12; | |
const uint i12 = batch_idx % p.ne12; | |
const uint i03 = i13 / p.broadcast3; | |
const uint i02 = i12 / p.broadcast2; | |
const uint batch_idx_a = i03 * p.ne02 + i02; | |
const uint expert_id = data_ids[expert_idx]; | |
a_offset = | |
expert_id * p.batch_stride_a; | |
batch_idx_a * p.batch_stride_a; | |
b_offset = | |
(expert_idx % p.ne11) * p.stride_b; | |
batch_idx * p.batch_stride_b; | |
d_offset = | |
expert_idx * p.stride_d; | |
batch_idx * p.batch_stride_d; | |
} | |