internal static void Alloc(MemoryBuffer buffer) { Debug.Assert(buffer.pointer == 0); switch (buffer.memorySpace) { case MemorySpace.Null: throw new ArgumentNullException(); case MemorySpace.Host: MemoryManagerApi.AllocHost(buffer); break; case MemorySpace.Device: MemoryManagerApi.Alloc(buffer); break; default: throw new NotImplementedException(); } }
public virtual T[] GetRaw <T>() where T : struct, IEquatable <T>, IFormattable { Debug.Assert(Buffer.pointer != 0); // prepare a buffer host-side MemoryBuffer hostBuffer = new MemoryBuffer(0, (uint)Buffer.size, MemorySpace.Host, mathDomain); MemoryManagerApi.AllocHost(hostBuffer); MemoryManagerApi.AutoCopy(hostBuffer, Buffer); object ret = null; switch (mathDomain) { case MathDomain.Null: throw new ArgumentNullException(); case MathDomain.Int: ret = new int[hostBuffer.size]; Marshal.Copy((IntPtr)hostBuffer.pointer, (int[])ret, 0, (int)hostBuffer.size); break; case MathDomain.Float: ret = new float[hostBuffer.size]; Marshal.Copy((IntPtr)hostBuffer.pointer, (float[])ret, 0, (int)hostBuffer.size); break; case MathDomain.Double: ret = new double[hostBuffer.size]; Marshal.Copy((IntPtr)hostBuffer.pointer, (double[])ret, 0, (int)hostBuffer.size); break; default: throw new NotImplementedException(); } return((T[])Convert.ChangeType(ret, typeof(T[]))); }