From f0da69b41b1d8aa963887c743ce2ff981691b8db Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Fri, 8 Jul 2016 22:16:27 +0900 Subject: opencl: OpenCLZone, detect CL device change and disable CL on crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Guard OpenCL calls with OpenCLZone, so if a OpenCL call crashes we detect this and disable OpenCL so next time the user doesn't encounter the crash at the same calculation because he has a broken OpenCL drivers. Similar has been implemented for OpenGL with good results. Additionaly we persistently remember a known good OpenCL device ID and driver version so we can match this and perform calculation tests when they change. This is to ensure that the selected OpenCL device performs as we expect. In this commit the calculation tests aren't included yet. Remove complex static initializer in opencl wrapper library. Change-Id: I1a8b81ee31298731efcf63dc6a476955afc035e9 Reviewed-on: https://gerrit.libreoffice.org/27064 Reviewed-by: Tomaž Vajngerl Tested-by: Tomaž Vajngerl (cherry picked from commit f41eb66302208f384a475fb20c98b6d1b0676cb6) Reviewed-on: https://gerrit.libreoffice.org/27099 Tested-by: Jenkins Reviewed-by: Michael Meeks Reviewed-on: https://gerrit.libreoffice.org/27144 Reviewed-by: Jan Holesovsky Tested-by: Michael Meeks --- sc/source/core/tool/formulagroup.cxx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'sc') diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx index e382e7a6ab60..49415042dd9c 100644 --- a/sc/source/core/tool/formulagroup.cxx +++ b/sc/source/core/tool/formulagroup.cxx @@ -32,7 +32,7 @@ #include #if HAVE_FEATURE_OPENCL -#include +# include #endif namespace sc { @@ -327,12 +327,25 @@ bool FormulaGroupInterpreter::switchOpenCLDevice(const OUString& rDeviceId, bool return false; } - bool bSuccess = ::opencl::switchOpenCLDevice(&rDeviceId, bAutoSelect, bForceEvaluation); + OUString aSelectedCLDeviceVersionID; + bool bSuccess = ::opencl::switchOpenCLDevice(&rDeviceId, bAutoSelect, bForceEvaluation, aSelectedCLDeviceVersionID); + if (!bSuccess) return false; delete msInstance; msInstance = new sc::opencl::FormulaGroupInterpreterOpenCL(); + + if (aSelectedCLDeviceVersionID != officecfg::Office::Common::Misc::SelectedOpenCLDeviceIdentifier::get()) + { + // perform OpenCL calculation tests + + // save the device + std::shared_ptr xBatch(comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Misc::SelectedOpenCLDeviceIdentifier::set(aSelectedCLDeviceVersionID, xBatch); + xBatch->commit(); + } + return true; } -- cgit