sc/source/core/opencl/formulagroupcl.cxx |   13 +++++++++++++
 1 file changed, 13 insertions(+)

New commits:
commit 449a599109f4c16a384dba4df6cd953518396395
Author: Tor Lillqvist <t...@collabora.com>
Date:   Mon Jun 27 12:36:22 2016 +0300

    tdf#98515: Bail out early if kernel would have ridiculously many parameters
    
    The Right Thing to do would be to compare the accumulated kernel
    parameter size against the CL_DEVICE_MAX_PARAMETER_SIZE of the device,
    but let's just do this sanity check for now. Bail out if the kernel
    would have more than 50 parameters.
    
    Calculating the accumulated kernel parameter size would be more
    complicated and I don't want to touch this code more than
    necessary. The kernel compilation will fail anyway if the size of
    parameters exceeds the limit and this sanity check is just to make us
    bail out a bit earlier.
    
    In tdf#98515 the slowness seems to indeed be caused by the OpenCL code
    generation , and there the number of parameters was 999, so this
    sanity check does fix the slow loading issue (I checked).
    
    Change-Id: Iead6dfb94ec8e7b2968ffed9423f0f9522a10ce9
    (cherry picked from commit a48aefcae40663b63005d49a04fc7b89a473d613)
    Reviewed-on: https://gerrit.libreoffice.org/26701
    Reviewed-by: Tor Lillqvist <t...@collabora.com>
    Tested-by: Tor Lillqvist <t...@collabora.com>
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>

diff --git a/sc/source/core/opencl/formulagroupcl.cxx 
b/sc/source/core/opencl/formulagroupcl.cxx
index c3167e3..fbd4b0a 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -2628,6 +2628,19 @@ 
DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
                     const formula::DoubleVectorRefToken* pDVR =
                         static_cast<const 
formula::DoubleVectorRefToken*>(pChild);
 
+                    // FIXME: The Right Thing to do would be to compare the 
accumulated kernel
+                    // parameter size against the CL_DEVICE_MAX_PARAMETER_SIZE 
of the device, but
+                    // let's just do this sanity check for now. The kernel 
compilation will
+                    // hopefully fail anyway if the size of parameters exceeds 
the limit and this
+                    // sanity check is just to make us bail out a bit earlier.
+
+                    // The number 50 comes from the fact that the minimum size 
of
+                    // CL_DEVICE_MAX_PARAMETER_SIZE is 256, which for 32-bit 
code probably means 64
+                    // of them. Round down a bit.
+
+                    if (pDVR->GetArrays().size() > 50)
+                        throw UnhandledToken(("Kernel would have ridiculously 
many parameters (" + std::to_string(2 + pDVR->GetArrays().size()) + 
")").c_str(), __FILE__, __LINE__);
+
                     for (size_t j = 0; j < pDVR->GetArrays().size(); ++j)
                     {
                         SAL_INFO("sc.opencl", "i=" << i << " j=" << j <<
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to