示例#1
0
 private void ReplayBufferCopy(MyMemoryBlock <float> source, MyMemoryBlock <float> destination, int sourceOffset, int destOffset, int count)
 {
     if (Owner.BufferStorage == MyReplayBufferStorage.Host)
     {
         Buffer.BlockCopy(source.Host, sourceOffset * sizeof(float), destination.Host, destOffset * sizeof(float), count * sizeof(float));
     }
     else if (Owner.BufferStorage == MyReplayBufferStorage.Device)
     {
         source.CopyToMemoryBlock(destination, sourceOffset, destOffset, count);
     }
 }
示例#2
0
            public override void Execute()
            {
                switch (Owner.Operation)
                {
                case MyJoinOperation.StackInputs:
                    for (int i = 0; i < Owner.InputBranches; i++)
                    {
                        MyMemoryBlock <float> ai = Owner.GetInput(i);
                        if (ai != null)
                        {
                            ai.CopyToMemoryBlock(out0, 0, Owner.m_offsets[i], ai.Count);
                        }
                    }
                    break;

                case MyJoinOperation.AddToIdcs:
                    if (in0 != out0)
                    {
                        in0.CopyToMemoryBlock(out0, 0, 0, in0.Count);
                    }

                    m_kernel.Run(in1, Owner.GetInput(2), out0, (int)MyJoinOperation.Addition, in1.Count);
                    break;

                case MyJoinOperation.AddToIdcs_Normalize:
                    var in2  = Owner.GetInput(2);
                    var temp = Owner.Temp;

                    if (in0 != out0)
                    {
                        in0.CopyToMemoryBlock(out0, 0, 0, in0.Count);
                    }

                    m_kernel.Run(in0, in2, temp, (int)MyJoinOperation.Permutation, in2.Count);
                    m_kernel.Run(in1, temp, temp, (int)MyJoinOperation.Addition, in1.Count);
                    //ZCX m_dotKernel.Run(temp, in1.Count, temp, temp, in1.Count, /* distributed: */ 0);
                    m_dotKernel.size      = in1.Count;
                    m_dotKernel.outOffset = in1.Count;
                    m_dotKernel.Run(temp, temp, temp);
                    m_mapToIdcsKernel.Run(temp, temp.GetDevicePtr(Owner.GPU, in1.Count), in2, out0, in2.Count);
                    break;

                case MyJoinOperation.GatherFromIdcs:
                    m_kernel.Run(in0, in1, out0, (int)MyJoinOperation.Permutation, in1.Count);
                    break;

                case MyJoinOperation.DistanceSquared:
                    m_kernel.Run(in0, in1, Owner.Temp, (int)MyJoinOperation.Subtraction, in0.Count, in1.Count);
                    //ZXC m_dotKernel.Run(out0, 0, Owner.Temp, Owner.Temp, Owner.Temp.Count, /* distributed: */ 0);
                    m_dotKernel.Run(out0, Owner.Temp, Owner.Temp);
                    break;

                case MyJoinOperation.CosineDistance:
                case MyJoinOperation.DotProduct:
                    //ZXC m_dotKernel.Run(out0, 0, in0, in1, in0.Count, /* distributed: */ 0);
                    m_dotKernel.Run(out0, in0, in1);
                    break;

                case MyJoinOperation.MatMultiplication:
                    m_kernel.Run(in0, in1, out0, in0.ColumnHint, in1.ColumnHint, out0.Count);
                    break;

                default:
                    if (Owner.InputBranches == 2)
                    {
                        m_kernel.Run(in0, in1, out0, (int)Owner.Operation, in0.Count, in1.Count);
                    }
                    else
                    {
                        m_kernel.Run(
                            Owner.InputBlocksPointers,
                            Owner.InputBranches,
                            out0,
                            (int)Owner.Operation,
                            out0.Count);
                    }
                    break;
                }
            }
示例#3
0
        public void Run(VectorOperation operation,
            MyMemoryBlock<float> a,
            MyMemoryBlock<float> b,
            MyMemoryBlock<float> result)
        {
            if (!Validate(operation, a.Count, b.Count))
                return;

            switch (operation)
            {
                case VectorOperation.Rotate:
                {
                    b.SafeCopyToHost();
                    float rads = DegreeToRadian(b.Host[0]);
                    float[] transform = { (float)Math.Cos(rads), -(float)Math.Sin(rads), (float)Math.Sin(rads), (float)Math.Cos(rads) };
                    Array.Copy(transform, m_temp.Host, transform.Length);
                    m_temp.SafeCopyToDevice();
                    m_matOperation.Run(MatOperation.Multiplication, m_temp, a, result);
                }
                break;

                case VectorOperation.Angle:
                {
                    m_matOperation.Run(MatOperation.DotProd, a, b, result);
                    result.SafeCopyToHost();
                    float dotProd = result.Host[0];
                    float angle = RadianToDegree((float)Math.Acos(dotProd));
                    result.Fill(0);
                    result.Host[0] = angle;
                    result.SafeCopyToDevice();
                }
                break;

                case VectorOperation.DirectedAngle:
                {
                    result.Host[0] = -90;
                    result.SafeCopyToDevice();
                    Run(VectorOperation.Rotate, a, result, result);
                    result.CopyToMemoryBlock(m_temp, 0, 0, result.Count);

                    m_matOperation.Run(MatOperation.DotProd, a, b, result);
                    result.SafeCopyToHost();
                    float dotProd = result.Host[0];
                    float angle;
                    if (Math.Abs(Math.Abs(dotProd) - 1) < 1E-4)
                        angle = 0;
                    else
                        angle = RadianToDegree((float)Math.Acos(dotProd));

                    m_matOperation.Run(MatOperation.DotProd, m_temp, b, result);
                    result.SafeCopyToHost();
                    float perpDotProd = result.Host[0];

                    if (perpDotProd > 0)
                        angle *= -1;
                    result.Fill(0);
                    result.Host[0] = angle;
                    result.SafeCopyToDevice();
                }
                break;
            }
        }
示例#4
0
        public void Run(VectorOperation operation,
                        MyMemoryBlock <float> a,
                        MyMemoryBlock <float> b,
                        MyMemoryBlock <float> result)
        {
            if (!Validate(operation, a.Count, b.Count))
            {
                return;
            }

            switch (operation)
            {
            case VectorOperation.Rotate:
            {
                b.SafeCopyToHost();
                float   rads      = DegreeToRadian(b.Host[0]);
                float[] transform = { (float)Math.Cos(rads), -(float)Math.Sin(rads), (float)Math.Sin(rads), (float)Math.Cos(rads) };
                Array.Copy(transform, m_temp.Host, transform.Length);
                m_temp.SafeCopyToDevice();
                m_matOperation.Run(MatOperation.Multiplication, m_temp, a, result);
            }
            break;

            case VectorOperation.Angle:
            {
                m_matOperation.Run(MatOperation.DotProd, a, b, result);
                result.SafeCopyToHost();
                float dotProd = result.Host[0];
                float angle   = RadianToDegree((float)Math.Acos(dotProd));
                result.Fill(0);
                result.Host[0] = angle;
                result.SafeCopyToDevice();
            }
            break;

            case VectorOperation.DirectedAngle:
            {
                result.Host[0] = -90;
                result.SafeCopyToDevice();
                Run(VectorOperation.Rotate, a, result, result);
                result.CopyToMemoryBlock(m_temp, 0, 0, result.Count);

                m_matOperation.Run(MatOperation.DotProd, a, b, result);
                result.SafeCopyToHost();
                float dotProd = result.Host[0];
                float angle;
                if (Math.Abs(Math.Abs(dotProd) - 1) < 1E-4)
                {
                    angle = 0;
                }
                else
                {
                    angle = RadianToDegree((float)Math.Acos(dotProd));
                }

                m_matOperation.Run(MatOperation.DotProd, m_temp, b, result);
                result.SafeCopyToHost();
                float perpDotProd = result.Host[0];

                if (perpDotProd > 0)
                {
                    angle *= -1;
                }
                result.Fill(0);
                result.Host[0] = angle;
                result.SafeCopyToDevice();
            }
            break;
            }
        }