@Override
    public void memcpySpecial(DataBuffer dstBuffer, Pointer srcPointer, long length, long dstOffset) {
        CudaContext context = getCudaContext();
        AllocationPoint point = ((BaseCudaDataBuffer) dstBuffer).getAllocationPoint();

        Pointer dP = new CudaPointer((point.getPointers().getHostPointer().address()) + dstOffset);

        val profH = PerformanceTracker.getInstance().helperStartTransaction();

        if (nativeOps.memcpyAsync(dP, srcPointer, length, CudaConstants.cudaMemcpyHostToHost, context.getOldStream()) == 0)
            throw new ND4JIllegalStateException("memcpyAsync failed");

        PerformanceTracker.getInstance().helperRegisterTransaction(point.getDeviceId(), profH, point.getNumberOfBytes(),MemcpyDirection.HOST_TO_HOST);

        if (point.getAllocationStatus() == AllocationStatus.DEVICE) {
            Pointer rDP = new CudaPointer(point.getPointers().getDevicePointer().address() + dstOffset);

            val profD = PerformanceTracker.getInstance().helperStartTransaction();

            if (nativeOps.memcpyAsync(rDP, dP, length, CudaConstants.cudaMemcpyHostToDevice, context.getOldStream()) == 0)
                throw new ND4JIllegalStateException("memcpyAsync failed");

            context.syncOldStream();

            PerformanceTracker.getInstance().helperRegisterTransaction(point.getDeviceId(), profD, point.getNumberOfBytes(),MemcpyDirection.HOST_TO_DEVICE);
        }

        context.syncOldStream();


        point.tickDeviceWrite();
    }
@ Override public void memcpySpecial ( DataBuffer dstBuffer , Pointer srcPointer , long length , long dstOffset ) { CudaContext context = getCudaContext ( ) ; AllocationPoint point = ( ( BaseCudaDataBuffer ) dstBuffer ) . getAllocationPoint ( ) ; Pointer dP = new CudaPointer ( ( point . getPointers ( ) . getHostPointer ( ) . address ( ) ) + dstOffset ) ; val profH = PerformanceTracker . getInstance ( ) . helperStartTransaction ( ) ; if ( nativeOps . memcpyAsync ( dP , srcPointer , length , CudaConstants . cudaMemcpyHostToHost , context . getOldStream ( ) ) == 0 ) throw new ND4JIllegalStateException ( "memcpyAsync failed" ) ; PerformanceTracker . getInstance ( ) . helperRegisterTransaction ( point . getDeviceId ( ) , profH , point . getNumberOfBytes ( ) , MemcpyDirection . HOST_TO_HOST ) ; if ( point . getAllocationStatus ( ) == AllocationStatus . DEVICE ) { Pointer rDP = new CudaPointer ( point . getPointers ( ) . getDevicePointer ( ) . address ( ) + dstOffset ) ; val profD = PerformanceTracker . getInstance ( ) . helperStartTransaction ( ) ; if ( nativeOps . memcpyAsync ( rDP , dP , length , CudaConstants . cudaMemcpyHostToDevice , context . getOldStream ( ) ) == 0 ) throw new ND4JIllegalStateException ( "memcpyAsync failed" ) ; context . syncOldStream ( ) ; PerformanceTracker . getInstance ( ) . helperRegisterTransaction ( point . getDeviceId ( ) , profD , point . getNumberOfBytes ( ) , MemcpyDirection . HOST_TO_DEVICE ) ; } context . syncOldStream ( ) ; point . tickDeviceWrite ( ) ; }
Special memcpy version, addressing shapeInfoDataBuffer copies

PLEASE NOTE: Blocking H->H, Async H->D

@param dstBuffer
@param srcPointer
@param length
@param dstOffset