From 9584ea20bbd81f1d56dd095a336f1b676751662c Mon Sep 17 00:00:00 2001 From: Sergey V Maslov Date: Wed, 29 Apr 2020 11:44:57 -0700 Subject: [PATCH 1/2] [SYCL] Load PI plugins only once Signed-off-by: Sergey V Maslov --- sycl/source/detail/pi.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) mode change 100644 => 100755 sycl/source/detail/pi.cpp diff --git a/sycl/source/detail/pi.cpp b/sycl/source/detail/pi.cpp old mode 100644 new mode 100755 index a85590b30e843..ca1c7ceaa3031 --- a/sycl/source/detail/pi.cpp +++ b/sycl/source/detail/pi.cpp @@ -197,7 +197,12 @@ bool trace(TraceLevel Level) { // Initializes all available Plugins. vector_class initialize() { - vector_class Plugins; + static bool PluginsInitDone = false; + static vector_class Plugins; + if (PluginsInitDone) { + return Plugins; + } + vector_class> PluginNames; findPlugins(PluginNames); @@ -244,6 +249,7 @@ vector_class initialize() { << "Plugin found and successfully loaded: " << PluginNames[I].first << std::endl; } + PluginsInitDone = true; #ifdef XPTI_ENABLE_INSTRUMENTATION if (!(xptiTraceEnabled() && !XPTIInitDone)) From 5a3df8f826215d1760fcf89f69d5443156385635 Mon Sep 17 00:00:00 2001 From: Sergey V Maslov Date: Fri, 5 Jun 2020 00:07:01 -0700 Subject: [PATCH 2/2] [SYCL] Load PI plugins only once. Make pi::initialize return const reference to the global vector of plugins, not a temporary copy of it. Change-Id: Ic1373059c9697b0b4d318548b79be7bcb9d4f2a9 Signed-off-by: Sergey V Maslov --- sycl/include/CL/sycl/detail/pi.hpp | 2 +- sycl/source/detail/pi.cpp | 8 +++++++- sycl/source/detail/platform_impl.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) mode change 100755 => 100644 sycl/source/detail/pi.cpp diff --git a/sycl/include/CL/sycl/detail/pi.hpp b/sycl/include/CL/sycl/detail/pi.hpp index 113255d60beba..ee0a37a515e97 100644 --- a/sycl/include/CL/sycl/detail/pi.hpp +++ b/sycl/include/CL/sycl/detail/pi.hpp @@ -135,7 +135,7 @@ template To cast(From value); extern std::shared_ptr GlobalPlugin; // Performs PI one-time initialization. -vector_class initialize(); +const vector_class &initialize(); // Utility Functions to get Function Name for a PI Api. template struct PiFuncInfo {}; diff --git a/sycl/source/detail/pi.cpp b/sycl/source/detail/pi.cpp old mode 100755 new mode 100644 index 13fd2c3bdb3e0..17fc470f6407b --- a/sycl/source/detail/pi.cpp +++ b/sycl/source/detail/pi.cpp @@ -255,7 +255,13 @@ bool trace(TraceLevel Level) { } // Initializes all available Plugins. -vector_class initialize() { +// The returned reference lifetime is through the end of the process. +// +// TODO: make sure that the global Plugins is destroyed last, at least +// after other tear-down relying on plugins (like destructors of global +// buffers) is completed. +// +const vector_class &initialize() { static bool PluginsInitDone = false; static vector_class Plugins; if (PluginsInitDone) { diff --git a/sycl/source/detail/platform_impl.cpp b/sycl/source/detail/platform_impl.cpp index 6d10960664656..daabe5722f754 100644 --- a/sycl/source/detail/platform_impl.cpp +++ b/sycl/source/detail/platform_impl.cpp @@ -49,7 +49,7 @@ static bool IsBannedPlatform(platform Platform) { vector_class platform_impl::get_platforms() { vector_class Platforms; - vector_class Plugins = RT::initialize(); + const vector_class &Plugins = RT::initialize(); info::device_type ForcedType = detail::get_forced_type(); for (unsigned int i = 0; i < Plugins.size(); i++) {