public bool AssignByRank2 <T>(ILValue <T> lValue, IRValue <T> rValue) { var rows = lValue.Layout.Shape[0]; var cols = lValue.Layout.Shape[1]; var read = rValue.BufferReader.GetReader2(lValue.Layout.Shape); var write = lValue.Buffer.Writer2; if (Context.Type == ContextType.Gpu) { var stream = Context.ToGpuContext().Stream; stream.For(0L, rows * cols, i => { var row = i / cols; var col = i % cols; write(row, col, read(row, col)); }); return(true); } if (Context.Type == ContextType.Cpu) { for (var i = 0L; i < rows; ++i) { for (var j = 0L; j < cols; ++j) { write(i, j, read(i, j)); } } return(true); } return(false); }
public void Assign <T>(ILValue <T> lValue, IRValue <T> rValue) { if (lValue == rValue) { return; } Util.EnsureTrue(Shape.Broadcast(rValue.Layout.Shape, lValue.Layout.Shape).SequenceEqual(lValue.Layout.Shape)); if (Layout.CanFullyUnitStrideMapping(rValue.Layout, lValue.Layout) && AssignByFlat1(lValue, rValue)) { return; } if (rValue.Layout.Rank == 2 && lValue.Layout.Rank == 2 && AssignByRank2(lValue, rValue)) { return; } if (rValue.Layout.Rank == 3 && lValue.Layout.Rank == 3 && AssignByRank3(lValue, rValue)) { return; } throw new NotImplementedException(); }
public bool AssignByRank3 <T>(ILValue <T> lValue, IRValue <T> rValue) { var l0 = lValue.Layout.Shape[0]; var l1 = lValue.Layout.Shape[1]; var l2 = lValue.Layout.Shape[2]; var read = rValue.BufferReader.GetReader3(lValue.Layout.Shape); var write = lValue.Buffer.Writer3; if (Context.Type == ContextType.Gpu) { var stream = Context.ToGpuContext().Stream; stream.For(0L, l0 * l1 * l2, i => { var i0 = i / (l1 * l2); var i1 = (i % (l1 * l2)) / l2; var i2 = (i % (l1 * l2)) % l2; write(i0, i1, i2, read(i0, i1, i2)); }); return(true); } if (Context.Type == ContextType.Cpu) { for (var i = 0L; i < l0; ++i) { for (var j = 0L; j < l1; ++j) { for (var k = 0L; k < l2; ++k) { write(i, j, k, read(i, j, k)); } } } return(true); } return(false); }
public bool AssignByFlat1 <T>(ILValue <T> lValue, IRValue <T> rValue) { var length = lValue.Layout.Shape.Length; var read = rValue.BufferReader.GetFlatReader1(lValue.Layout.Shape); var write = lValue.Buffer.FlatWriter1; if (Context.Type == ContextType.Gpu) { var stream = Context.ToGpuContext().Stream; stream.For(0L, length, i => write(i, read(i))); return(true); } if (Context.Type == ContextType.Cpu) { for (var i = 0L; i < length; ++i) { write(i, read(i)); } return(true); } return(false); }