public static ArrayView <T> Allocate <T>(int extent) where T : unmanaged { Trace.Assert(extent >= 0, "Invalid extent"); int elementSize = Interop.SizeOf <T>(); return(new ArrayView <T>( CPUMemoryBuffer.Create(extent * elementSize, elementSize), 0, extent)); }
/// <summary> /// Initializes a new basic exchange buffer. /// </summary> /// <param name="gpuBuffer">The parent GPU buffer to use.</param> /// <param name="mode">The exchange buffer mode to use.</param> /// <remarks> /// CAUTION: The ownership of the <paramref name="gpuBuffer"/> is transferred to /// this instance. /// </remarks> protected internal ExchangeBuffer( MemoryBuffer <ArrayView1D <T, Stride1D.Dense> > gpuBuffer, ExchangeBufferMode mode) : base(gpuBuffer.Accelerator) { GPUBuffer = gpuBuffer; CPUBuffer = Accelerator is CudaAccelerator && mode == ExchangeBufferMode.PreferPageLockedMemory ? CPUMemoryBuffer.CreatePinned( Accelerator, gpuBuffer.LengthInBytes, gpuBuffer.ElementSize) : CPUMemoryBuffer.Create(gpuBuffer.LengthInBytes, gpuBuffer.ElementSize); CPUView = new ArrayView <T>(CPUBuffer, 0, gpuBuffer.Length); }
/// <summary> /// Initializes this page locked array. /// </summary> /// <param name="accelerator">The parent accelerator.</param> /// <param name="ptr">The pinned host pointer.</param> /// <param name="length">The total number of elements.</param> protected unsafe void Initialize( Accelerator accelerator, IntPtr ptr, long length) { if (length < 0L) { throw new ArgumentNullException(nameof(length)); } if (length > 0L) { MemoryBuffer = CPUMemoryBuffer.Create( accelerator, ptr, length, Interop.SizeOf <T>()); ArrayView = MemoryBuffer.AsArrayView <T>(0L, MemoryBuffer.Length); Scope = accelerator.CreatePageLockFromPinned <T>(ptr, length); } }