diff --git a/Src/Extern/HDF5/AMReX_PlotFileUtilHDF5.cpp b/Src/Extern/HDF5/AMReX_PlotFileUtilHDF5.cpp index 5dd901f6f5..19963bbc12 100644 --- a/Src/Extern/HDF5/AMReX_PlotFileUtilHDF5.cpp +++ b/Src/Extern/HDF5/AMReX_PlotFileUtilHDF5.cpp @@ -696,12 +696,24 @@ void WriteMultiLevelPlotfileHDF5SingleDset (const std::string& plotfilename, for(MFIter mfi(*data); mfi.isValid(); ++mfi) { const FArrayBox &fab = (*data)[mfi]; writeDataItems = fab.box().numPts() * (*data).nComp(); + Real const* fabdata = fab.dataPtr(); +#ifdef AMREX_USE_GPU + std::unique_ptr hostfab; + if (fab.arena()->isManaged() || fab.arena()->isDevice()) { + hostfab = std::make_unique(fab.box(), fab.nComp(), + The_Pinned_Arena()); + Gpu::dtoh_memcpy_async(hostfab->dataPtr(), fab.dataPtr(), + fab.size()*sizeof(Real)); + Gpu::streamSynchronize(); + fabdata = hostfab->dataPtr(); + } +#endif if(doConvert) { RealDescriptor::convertFromNativeFormat(static_cast (a_buffer.dataPtr()+writeDataSize), - writeDataItems, fab.dataPtr(), *whichRD); + writeDataItems, fabdata, *whichRD); } else { // ---- copy from the fab memcpy(static_cast (a_buffer.dataPtr()+writeDataSize), - fab.dataPtr(), writeDataItems * whichRDBytes); + fabdata, writeDataItems * whichRDBytes); } writeDataSize += writeDataItems; }