summaryrefslogtreecommitdiff
path: root/opencl
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2015-09-10 21:58:28 +0300
committerTor Lillqvist <tml@collabora.com>2015-09-15 18:43:33 +0300
commitd6a5aac0f903b292db57bb4a613e603aa029c78b (patch)
tree59fc0174303dc12faecb98fa916486f119e963ca /opencl
parent75bde904d5b4f756037889f2b2ddee3e34dd81b8 (diff)
Split formula group for OpenCL up into smaller bits when necessary
Will make it less demanding on low-end hardware, where the device driver is unresponsive for too long when an OpenCL kernel handling lots of data is executing. This makes Windows restart the driver which is problematic. I tried several approaches of splitting, both at higher levels in sc and at the lowest level just before creating and executing the OpenCL kernel(s). This seems to be the most minimal and local approach. Doing it at the lower level would have required too much poking into our obscure OpenCL code, like passing an offset parameter to every kernel. Use a simple heuristic to find out whether to split. On the problematic low-end devices, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT is 4, while for more performant devices it is 1 or 8.
Diffstat (limited to 'opencl')
-rw-r--r--opencl/source/openclwrapper.cxx5
1 files changed, 5 insertions, 0 deletions
diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx
index ea0f3f864053..79aabba7f37b 100644
--- a/opencl/source/openclwrapper.cxx
+++ b/opencl/source/openclwrapper.cxx
@@ -501,6 +501,11 @@ bool initOpenCLRunEnv( GPUEnv *gpuInfo )
gpuInfo->mnKhrFp64Flag = bKhrFp64;
gpuInfo->mnAmdFp64Flag = bAmdFp64;
+ gpuInfo->mnPreferredVectorWidthFloat = 0;
+
+ clGetDeviceInfo(gpuInfo->mpArryDevsID[0], CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, sizeof(cl_uint),
+ &gpuInfo->mnPreferredVectorWidthFloat, NULL);
+
return false;
}