From 0cbdcdda59de0129dfd423dcaf7e5c31bc7d7722 Mon Sep 17 00:00:00 2001 From: ronnywang Date: Mon, 7 Nov 2022 12:40:45 +0800 Subject: [PATCH] call InitDevices only once (#47678) --- paddle/fluid/platform/init.cc | 84 ++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/paddle/fluid/platform/init.cc b/paddle/fluid/platform/init.cc index 6e28c775a3..1917591410 100644 --- a/paddle/fluid/platform/init.cc +++ b/paddle/fluid/platform/init.cc @@ -164,61 +164,65 @@ void LoadCustomDevice(const std::string &library_dir) { } #endif +static std::once_flag init_devices_flag; + void InitDevices() { - // set name at the entry point of Paddle - platform::SetCurrentThreadName("MainThread"); + std::call_once(init_devices_flag, []() { + // set name at the entry point of Paddle + platform::SetCurrentThreadName("MainThread"); // CUPTI attribute should be set before any CUDA context is created (see CUPTI // documentation about CUpti_ActivityAttribute). #ifdef PADDLE_WITH_CUDA - InitCupti(); + InitCupti(); #endif - /*Init all available devices by default */ - std::vector devices; + /*Init all available devices by default */ + std::vector devices; #if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP) - try { - // use user specified GPUs in single-node multi-process mode. - devices = platform::GetSelectedDevices(); - } catch (const std::exception &exp) { - LOG(WARNING) << "Compiled with WITH_GPU, but no GPU found in runtime."; - } + try { + // use user specified GPUs in single-node multi-process mode. + devices = platform::GetSelectedDevices(); + } catch (const std::exception &exp) { + LOG(WARNING) << "Compiled with WITH_GPU, but no GPU found in runtime."; + } #endif #ifdef PADDLE_WITH_XPU - try { - // use user specified XPUs in single-node multi-process mode. - devices = platform::GetXPUSelectedDevices(); - } catch (const std::exception &exp) { - LOG(WARNING) << "Compiled with WITH_XPU, but no XPU found in runtime."; - } + try { + // use user specified XPUs in single-node multi-process mode. + devices = platform::GetXPUSelectedDevices(); + } catch (const std::exception &exp) { + LOG(WARNING) << "Compiled with WITH_XPU, but no XPU found in runtime."; + } #endif #ifdef PADDLE_WITH_ASCEND_CL - // NOTE(zhiqiu): use singleton to explicitly init and finalize ACL - platform::AclInstance::Instance(); // NOLINT - try { - // use user specified XPUs in single-node multi-process mode. - devices = platform::GetSelectedNPUDevices(); - } catch (const std::exception &exp) { - LOG(WARNING) - << "Compiled with PADDLE_WITH_ASCEND_CL, but no NPU found in runtime."; - } + // NOTE(zhiqiu): use singleton to explicitly init and finalize ACL + platform::AclInstance::Instance(); // NOLINT + try { + // use user specified XPUs in single-node multi-process mode. + devices = platform::GetSelectedNPUDevices(); + } catch (const std::exception &exp) { + LOG(WARNING) << "Compiled with PADDLE_WITH_ASCEND_CL, but no NPU found " + "in runtime."; + } #endif #ifdef PADDLE_WITH_IPU - try { - // use user specified IPUs. - devices = platform::GetSelectedIPUDevices(); - } catch (const std::exception &exp) { - LOG(WARNING) - << "Compiled with PADDLE_WITH_IPU, but no IPU found in runtime."; - } + try { + // use user specified IPUs. + devices = platform::GetSelectedIPUDevices(); + } catch (const std::exception &exp) { + LOG(WARNING) + << "Compiled with PADDLE_WITH_IPU, but no IPU found in runtime."; + } #endif #ifdef PADDLE_WITH_MLU - try { - // use user specified MLUs in single-node multi-process mode. - devices = platform::GetMLUSelectedDevices(); - } catch (const std::exception &exp) { - LOG(WARNING) << "Compiled with WITH_MLU, but no MLU found in runtime."; - } + try { + // use user specified MLUs in single-node multi-process mode. + devices = platform::GetMLUSelectedDevices(); + } catch (const std::exception &exp) { + LOG(WARNING) << "Compiled with WITH_MLU, but no MLU found in runtime."; + } #endif - InitDevices(devices); + InitDevices(devices); + }); } void InitDevices(const std::vector devices) { -- GitLab