Ejemplo n.º 1
0
 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);
         }
     }
 }
Ejemplo n.º 2
0
 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);
     }
 }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
        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);
            }
        }