docs: @Override
      public void memcpy(DataBuffer dstBuffer, DataBuffer srcBuffer) {
          //log.info("Buffer MemCpy called");
          //log.info("Memcpy buffer: {} bytes ", dstBuffer.length() * dstBuffer.getElementSize());
          CudaContext context = getCudaContext();
          AllocationPoint dstPoint = ((BaseCudaDataBuffer) dstBuffer).getAllocationPoint();
          AllocationPoint srcPoint = ((BaseCudaDataBuffer) srcBuffer).getAllocationPoint();
  
          Pointer dP = null; //new CudaPointer(dstPoint.getPointers().getHostPointer().address());
          Pointer sP = null;
          MemcpyDirection direction = null;
  
          val profDH = PerformanceTracker.getInstance().helperStartTransaction();
  
  
  
          Nd4j.getExecutioner().push();
  
          if (srcPoint.isActualOnDeviceSide()) {
              sP = AtomicAllocator.getInstance().getPointer(srcBuffer, context);
              dP = AtomicAllocator.getInstance().getPointer(dstBuffer, context);
  
              if (nativeOps.memcpyAsync(dP, sP, srcBuffer.length() * srcBuffer.getElementSize(),
                      CudaConstants.cudaMemcpyDeviceToDevice, context.getOldStream()) == 0) {
                  throw new ND4JIllegalStateException("memcpyAsync failed");
              }
  
              dstPoint.tickDeviceWrite();
              direction = MemcpyDirection.DEVICE_TO_DEVICE;
          } else {
              sP = AtomicAllocator.getInstance().getHostPointer(srcBuffer);
              dP = AtomicAllocator.getInstance().getPointer(dstBuffer, context);
  
              if (nativeOps.memcpyAsync(dP, sP, srcBuffer.length() * srcBuffer.getElementSize(),
                      CudaConstants.cudaMemcpyHostToDevice, context.getOldStream()) == 0) {
                  throw new ND4JIllegalStateException("memcpyAsync failed");
              }
  
              direction = MemcpyDirection.HOST_TO_DEVICE;
          }
  
          dstPoint.tickDeviceWrite();
  
          // it has to be blocking call
          context.syncOldStream();
  
          PerformanceTracker.getInstance().helperRegisterTransaction(srcPoint.getDeviceId(), profDH / 2, dstPoint.getNumberOfBytes(), direction);
  //        PerformanceTracker.getInstance().helperRegisterTransaction(dstPoint.getDeviceId(), profDH / 2, dstPoint.getNumberOfBytes(), MemcpyDirection.HOST_TO_DEVICE);
      }