/// <inheritdoc /> protected override Util.ISigmaDiffDataBuffer <T> _InternalDeepCopy() { T[] copyData = SigmaDiffSharpBackendProvider.Instance.GetBackend <T>(BackendTag).BackendHandle.CreateUninitialisedArray((int)Length); CudaSigmaDiffDataBuffer <T> copy = new CudaSigmaDiffDataBuffer <T>(copyData, 0L, Length, BackendTag, CudaContext, Type); if (_initialisedInContext && !_flagHostModified) { copy.InitialiseCudaBuffer(copyHostToDevice: false); copy._cudaBuffer.AsyncCopyToDevice(_cudaBuffer, CudaFloat32Handler.GetStreamForContext(CudaContext)); copy._flagHostModified = false; copy._flagDeviceModified = true; } else { OnReadAccess(); Buffer.BlockCopy(_data, (int)(Offset * Type.SizeBytes), copyData, 0, (int)(Length * Type.SizeBytes)); copy._flagHostModified = true; } return(copy); }
/// <inheritdoc /> public override IDataBuffer <T> GetValues(long startIndex, long length) { if (_initialisedInContext && !_flagHostModified) { CudaSigmaDiffDataBuffer <T> vData = new CudaSigmaDiffDataBuffer <T>(_data, startIndex, length, BackendTag, CudaContext); vData.InitialiseCudaBuffer(copyHostToDevice: false); vData._cudaBuffer.AsyncCopyToDevice(_cudaBuffer.DevicePointer, new SizeT(startIndex * sizeof(float)), vData._cudaZero, vData._cudaLengthBytes, CudaFloat32Handler.GetStreamForContext(CudaContext)); vData._flagHostModified = false; vData._flagDeviceModified = false; return(vData); } else { OnReadAccess(); return(new CudaSigmaDiffDataBuffer <T>(this, startIndex, length, BackendTag, CudaContext)); } }