X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=blobdiff_plain;f=src%2Fgromacs%2Ftaskassignment%2Fdecidegpuusage.cpp;h=62010fe2697772148bdcdb604511933f4c06209b;hb=8073360f849809b7ce4fa5b5f14ae16209ca087f;hp=36c4650f0649311fe23d213ec27e7a66f737e389;hpb=a20b5229871421b24c2a604bdd2603843f8b734f;p=alexxy%2Fgromacs.git diff --git a/src/gromacs/taskassignment/decidegpuusage.cpp b/src/gromacs/taskassignment/decidegpuusage.cpp index 36c4650f06..62010fe269 100644 --- a/src/gromacs/taskassignment/decidegpuusage.cpp +++ b/src/gromacs/taskassignment/decidegpuusage.cpp @@ -157,6 +157,7 @@ bool decideWhetherToUseGpusForNonbondedWithThreadMpi(const TaskTarget non bool decideWhetherToUseGpusForPmeWithThreadMpi(const bool useGpuForNonbonded, const TaskTarget pmeTarget, + const TaskTarget pmeFftTarget, const int numDevicesToUse, const std::vector& userGpuTaskAssignment, const gmx_hw_info_t& hardwareInfo, @@ -168,8 +169,15 @@ bool decideWhetherToUseGpusForPmeWithThreadMpi(const bool useGpuFor if ((pmeTarget == TaskTarget::Cpu) || !useGpuForNonbonded || !pme_gpu_supports_build(nullptr) || !pme_gpu_supports_hardware(hardwareInfo, nullptr) || !pme_gpu_supports_input(inputrec, nullptr)) { - // PME can't run on a GPU. If the user required that, we issue - // an error later. + // PME can't run on a GPU. If the user required that, we issue an error later. + return false; + } + + if (pmeFftTarget == TaskTarget::Cpu && !pme_gpu_mixed_mode_supports_input(inputrec, nullptr)) + { + /* User requested PME FFT on CPU, but the current system is not compatible with Mixed mode, + * so we don't use GPUs at all. + * If the user had -pme gpu, we issue an error later. */ return false; } @@ -330,6 +338,7 @@ bool decideWhetherToUseGpusForNonbonded(const TaskTarget nonbondedTarge bool decideWhetherToUseGpusForPme(const bool useGpuForNonbonded, const TaskTarget pmeTarget, + const TaskTarget pmeFftTarget, const std::vector& userGpuTaskAssignment, const gmx_hw_info_t& hardwareInfo, const t_inputrec& inputrec, @@ -377,6 +386,16 @@ bool decideWhetherToUseGpusForPme(const bool useGpuForNonbonded, } return false; } + if (pmeFftTarget == TaskTarget::Cpu && !pme_gpu_mixed_mode_supports_input(inputrec, &message)) + { + /* User requested PME FFT on CPU, but the current system is not compatible with Mixed mode, + * so we don't use GPUs at all. */ + if (pmeTarget == TaskTarget::Gpu) + { + GMX_THROW(NotImplementedError("Cannot compute PME interactions in Mixed mode, because " + message)); + } + return false; + } if (pmeTarget == TaskTarget::Cpu) {