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); } }
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; } }
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; } }
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; } }