From 33618fccef0cd476f8cd1abf844cb0c272f1cb62 Mon Sep 17 00:00:00 2001 From: Anna Wellmann <a.wellmann@tu-braunschweig.de> Date: Mon, 6 Sep 2021 14:13:20 +0200 Subject: [PATCH] Use new f to c kernel in upgradeGrid27 --- .../Calculation/UpdateGrid27.cpp | 75 +++++++++++++++++-- .../Calculation/UpdateGrid27.h | 4 + 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp index 75b7f65da..af0511662 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp @@ -48,6 +48,7 @@ void updateGrid27(Parameter *para, vf::gpu::Communicator *comm, CudaMemoryManage para->getParD(level)->numberOfFluidNodes, -1); else collision(para, pm, level, t, kernels); + prepareExchangeMultiGPU(para, level, -1); exchangeMultiGPU(para, comm, cudaManager, level, -1); } @@ -70,15 +71,27 @@ void updateGrid27(Parameter *para, vf::gpu::Communicator *comm, CudaMemoryManage preCollisionBC(para, cudaManager, level, t); ////////////////////////////////////////////////////////////////////////// - if( level != para->getFine() ) { - fineToCoarse(para, level); + if (para->getUseStreams() && para->getNumprocs() > 1) { + } else { + if (para->getKernelNeedsFluidNodeIndicesToRun()) { + fineToCoarseUsingIndex(para, level, para->getParD(level)->fluidNodeIndices, + para->getParD(level)->numberOfFluidNodes, -1); - prepareExchangeMultiGPU(para, level, -1); - exchangeMultiGPU(para, comm, cudaManager, level, -1); + prepareExchangeMultiGPU(para, level, -1); + exchangeMultiGPU(para, comm, cudaManager, level, -1); + + coarseToFine(para, level); + } else { + fineToCoarse(para, level); - coarseToFine(para, level); + prepareExchangeMultiGPU(para, level, -1); + exchangeMultiGPU(para, comm, cudaManager, level, -1); + + coarseToFine(para, level); + } + } } } @@ -1126,6 +1139,58 @@ void fineToCoarse(Parameter* para, int level) } +void fineToCoarseUsingIndex(Parameter *para, int level, uint *fluidNodeIndices, uint numberOfFluidNodes, + int streamIndex) +{ + cudaStream_t stream = (streamIndex == -1) ? CU_STREAM_LEGACY : para->getStreamManager()->getStream(streamIndex); + ScaleFC_RhoSq_comp_27_Stream( + para->getParD(level)->d0SP.f[0], para->getParD(level + 1)->d0SP.f[0], para->getParD(level)->neighborX_SP, + para->getParD(level)->neighborY_SP, para->getParD(level)->neighborZ_SP, para->getParD(level + 1)->neighborX_SP, + para->getParD(level + 1)->neighborY_SP, para->getParD(level + 1)->neighborZ_SP, + para->getParD(level)->size_Mat_SP, para->getParD(level + 1)->size_Mat_SP, para->getParD(level)->evenOrOdd, + para->getParD(level)->intFC.ICellFCC, para->getParD(level)->intFC.ICellFCF, para->getParD(level)->K_FC, + para->getParD(level)->omega, para->getParD(level + 1)->omega, para->getParD(level)->vis, + para->getParD(level)->nx, para->getParD(level)->ny, para->getParD(level + 1)->nx, para->getParD(level + 1)->ny, + para->getParD(level)->offFC, fluidNodeIndices, numberOfFluidNodes, stream); + getLastCudaError("ScaleFC27_RhoSq_comp_Stream execution failed"); + + ////////////////////////////////////////////////////////////////////////// + // A D V E C T I O N D I F F U S I O N + ////////////////////////////////////////////////////////////////////////// + + if (para->getDiffOn()) { + if (para->getDiffMod() == 7) { + // TODO + printf("fineToCoarseUsingIndex Advection Diffusion not implemented"); + //ScaleFCThSMG7(para->getParD(level)->d0SP.f[0], para->getParD(level + 1)->d0SP.f[0], + // para->getParD(level)->d7.f[0], para->getParD(level + 1)->d7.f[0], + // para->getParD(level)->neighborX_SP, para->getParD(level)->neighborY_SP, + // para->getParD(level)->neighborZ_SP, para->getParD(level + 1)->neighborX_SP, + // para->getParD(level + 1)->neighborY_SP, para->getParD(level + 1)->neighborZ_SP, + // para->getParD(level)->size_Mat_SP, para->getParD(level + 1)->size_Mat_SP, + // para->getParD(level)->evenOrOdd, para->getParD(level)->intFC.ICellFCC, + // para->getParD(level)->intFC.ICellFCF, para->getParD(level)->K_FC, para->getParD(level)->vis, + // para->getParD(level)->diffusivity, para->getParD(level)->numberofthreads, + // para->getParD(level)->offFC); + //getLastCudaError("ScaleFCTh7 execution failed"); + } else if (para->getDiffMod() == 27) { + // TODO + printf("fineToCoarseUsingIndex Advection Diffusion not implemented"); + //ScaleFCThS27(para->getParD(level)->d0SP.f[0], para->getParD(level + 1)->d0SP.f[0], + // para->getParD(level)->d27.f[0], para->getParD(level + 1)->d27.f[0], + // para->getParD(level)->neighborX_SP, para->getParD(level)->neighborY_SP, + // para->getParD(level)->neighborZ_SP, para->getParD(level + 1)->neighborX_SP, + // para->getParD(level + 1)->neighborY_SP, para->getParD(level + 1)->neighborZ_SP, + // para->getParD(level)->size_Mat_SP, para->getParD(level + 1)->size_Mat_SP, + // para->getParD(level)->evenOrOdd, para->getParD(level)->intFC.ICellFCC, + // para->getParD(level)->intFC.ICellFCF, para->getParD(level)->K_FC, para->getParD(level)->vis, + // para->getParD(level)->diffusivity, para->getParD(level)->numberofthreads, + // para->getParD(level)->offFC); + //getLastCudaError("ScaleFCTh27 execution failed"); + } + } +} + void coarseToFine(Parameter* para, int level) { //ScaleCF_comp_D3Q27F3(para->getParD(level)->d0SP.f[0], para->getParD(level+1)->d0SP.f[0], para->getParD(level+1)->g6.g[0], diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h index 39a985435..ef3cfab2d 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h @@ -40,7 +40,11 @@ extern "C" void calcMacroscopicQuantities(Parameter* para, int level); extern "C" void preCollisionBC(Parameter* para, CudaMemoryManager* cudaManager, int level, unsigned int t); extern "C" void fineToCoarse(Parameter* para, int level); +extern "C" void fineToCoarseUsingIndex(Parameter *para, int level, uint *fluidNodeIndices = nullptr, + uint numberOfFluidNodes = 0, int stream = -1); extern "C" void coarseToFine(Parameter* para, int level); +extern "C" void coarseToFineUsingIndex(Parameter *para, int level, uint *fluidNodeIndices = nullptr, + uint numberOfFluidNodes = 0, int stream = -1); #endif -- GitLab