public void Copy(IFrontend <T> trgt, IFrontend <T> src) { if (Layout.HasContiguousMemory(trgt.Layout) && Layout.HasContiguousMemory(src.Layout) && Enumerable.SequenceEqual(trgt.Layout.Stride, src.Layout.Stride)) { // use array block copy for contiguous memory block var(t, s) = ElemwiseDataAndLayout(trgt, src); if (t.FastAccess.NumElements > 0) { Array.Copy(s.Data, s.FastAccess.Offset, t.Data, t.FastAccess.Offset, t.FastAccess.NumElements); } } else { var(t, s) = ElemwiseDataAndLayout(trgt, src); if (VectorOps.CanUse(t, s)) { VectorOps.Copy(t, s); } else { ScalarOps.Copy(t, s); } } }
public void Sqrt(IFrontend <T> trgt, IFrontend <T> src) { var(dataLayoutTrgt, dataLayout) = ElemwiseDataAndLayout(trgt, src); if (VectorOps.CanUse(dataLayoutTrgt, dataLayout)) { VectorOps.Sqrt(dataLayoutTrgt, dataLayout); } else { ScalarOps.Sqrt(dataLayoutTrgt, dataLayout); } }
public void Multiply(IFrontend <T> trgt, IFrontend <T> a, IFrontend <T> b) { var(dataLayoutTrgt, dataLayoutA, dataLayoutB) = ElemwiseDataAndLayout <T, T, T>(trgt, a, b); if (VectorOps.CanUse(dataLayoutTrgt, dataLayoutA, dataLayoutB)) { VectorOps.Multiply(dataLayoutTrgt, dataLayoutA, dataLayoutB); } else { ScalarOps.Multiply(dataLayoutTrgt, dataLayoutA, dataLayoutB); } }
public void Subtract(IFrontend <T> trgt, IFrontend <T> src1, IFrontend <T> src2) { var(dataLayoutTrgt, dataLayoutA, dataLayoutB) = ElemwiseDataAndLayout <T, T, T>(trgt, src1, src2); if (VectorOps.CanUse(dataLayoutTrgt, dataLayoutA, dataLayoutB)) { VectorOps.Subtract(dataLayoutTrgt, dataLayoutA, dataLayoutB); } else { ScalarOps.Subtract(dataLayoutTrgt, dataLayoutA, dataLayoutB); } }
public void Minimum(IFrontend <T> trgt, IFrontend <T> lhs, IFrontend <T> rhs) { var(dataLayoutTrgt, dataLayoutA, dataLayoutB) = ElemwiseDataAndLayout <T, T, T>(trgt, lhs, rhs); if (VectorOps.CanUse(dataLayoutTrgt, dataLayoutA, dataLayoutB)) { VectorOps.Minimum(dataLayoutTrgt, dataLayoutA, dataLayoutB); } else { ScalarOps.Minimum(dataLayoutTrgt, dataLayoutA, dataLayoutB); } }
public void Divide(IFrontend <T> trgt, IFrontend <T> a, IFrontend <T> b) { var(dataLayoutTrgt, dataLayoutA, dataLayoutB) = ElemwiseDataAndLayout <T, T, T>(trgt, a, b); if (VectorOps.CanUse(dataLayoutTrgt, dataLayoutA, dataLayoutB) && VectorOps.AlignedWith(dataLayoutA, dataLayoutB)) { VectorOps.Divide(dataLayoutTrgt, dataLayoutA, dataLayoutB); } else { ScalarOps.Divide(dataLayoutTrgt, dataLayoutA, dataLayoutB); } }
public void FillConst(T value, IFrontend <T> trgt) { var dataAndLayout = ElemwiseDataAndLayout(trgt); if (VectorOps.CanUse(dataAndLayout)) { VectorOps.Fill(value, dataAndLayout); } else { ScalarOps.Fill(value, dataAndLayout); } }