in blocksparse/matmul.py [0:0]
def blocksparse_matmul_grad(op, dy, temp):
blocks = op.get_attr("blocks")
bsize = op.get_attr("bsize")
axis = op.get_attr("axis")
C = op.get_attr("C")
K = op.get_attr("K")
segments = op.get_attr("segments_dx")
shared = op.get_attr("shared_dx")
locks = op.get_attr("locks_dx")
gated_dw = op.get_attr("gated_dw")
gate_grad = op.get_attr("gate_grad")
bench = op.get_attr("bench")
x = op.inputs[0]
w = op.inputs[1]
lut_dx = op.inputs[3]
lut_dw = op.inputs[4]
gate = [op.inputs[5]] if len(op.inputs) > 5 else []
name = op.name.split('/')[-1]
dx, _ = blocksparse_matmul_dx(
dy, w, lut_dx, gate, gated_dw=gated_dw, gate_grad=gate_grad,
blocks=blocks, bsize=bsize, axis=axis, C=K, K=C, # swap C,K
segments=segments, locks=locks, shared=shared,
bench=bench, name=name+"_bprop")
dw = blocksparse_matmul_dw(
[x], [dy], lut_dw, gate, gated_dw=gated_dw, gate_grad=gate_grad,
blocks=blocks, bsize=bsize, axis=axis, C=C, K=K,
bench=bench, name=name+"_updat")
# print(dx.op.name, dx.op.device)
# print(dw.op.name, dw.op.device)
if len(gate) == 0:
return (dx, dw, None, None, None)
elif gate_grad:
dw, dg = blocksparse_matmul_dg(dw, w, gate[0])
else:
dg = None
return (dx, dw, None, None, None, dg)