summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2016-06-27 12:36:22 +0300
committerTor Lillqvist <tml@collabora.com>2016-06-27 13:19:49 +0300
commita48aefcae40663b63005d49a04fc7b89a473d613 (patch)
tree0bf0e09f3b89b5f66b2e1ddc0282f4dadbf32fe6
parent08fc0da4033b8ea2b3ae67aa06175e839771396b (diff)
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
-rw-r--r--sc/source/core/opencl/formulagroupcl.cxx13
1 files changed, 13 insertions, 0 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 3427d9fea34d..1a9cf1323ea1 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 <<