コード例 #1
0
ファイル: Expr.cs プロジェクト: ingted/AleaTK
        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);
        }
コード例 #2
0
ファイル: Expr.cs プロジェクト: ingted/AleaTK
 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();
 }
コード例 #3
0
ファイル: Expr.cs プロジェクト: ingted/AleaTK
        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);
        }
コード例 #4
0
ファイル: Expr.cs プロジェクト: ingted/AleaTK
        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);
        }