Kaydet (Commit) 00a58dfe authored tarafından Laszlo Nemeth's avatar Laszlo Nemeth Kaydeden (comit) Tor Lillqvist

Need to try to avoid TDR also with NVIDIA cards on Windows 7 or earlier

(TDR is Timeout detection and recovery, was introduced in Vista.)

Change-Id: Ic49629adf7630e61cebcdfcc431ca96ba3fbaf7e
Reviewed-on: https://gerrit.libreoffice.org/27518Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTor Lillqvist <tml@collabora.com>
üst eee5d67d
......@@ -47,7 +47,7 @@ struct OPENCL_DLLPUBLIC GPUEnv
int mnCmdQueuePos;
bool mnKhrFp64Flag;
bool mnAmdFp64Flag;
cl_uint mnPreferredVectorWidthFloat;
bool mbNeedsTDRAvoidance;
static bool isOpenCLEnabled();
};
......
......@@ -42,6 +42,10 @@
#define OPENCL_DLL_NAME "libOpenCL.so.1"
#endif
#ifdef _WIN32_WINNT_WINBLUE
#include <VersionHelpers.h>
#endif
#define DEVICE_NAME_LENGTH 1024
#define DRIVER_VERSION_LENGTH 1024
#define PLATFORM_VERSION_LENGTH 1024
......@@ -455,6 +459,8 @@ void checkDeviceForDoubleSupport(cl_device_id deviceId, bool& bKhrFp64, bool& bA
bool initOpenCLRunEnv( GPUEnv *gpuInfo )
{
OpenCLZone zone;
cl_uint nPreferredVectorWidthFloat;
char pName[64];
bool bKhrFp64 = false;
bool bAmdFp64 = false;
......@@ -464,11 +470,40 @@ bool initOpenCLRunEnv( GPUEnv *gpuInfo )
gpuInfo->mnKhrFp64Flag = bKhrFp64;
gpuInfo->mnAmdFp64Flag = bAmdFp64;
gpuInfo->mnPreferredVectorWidthFloat = 0;
gpuInfo->mbNeedsTDRAvoidance = false;
clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, sizeof(cl_uint),
&gpuInfo->mnPreferredVectorWidthFloat, nullptr);
SAL_INFO("opencl", "CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT=" << gpuInfo->mnPreferredVectorWidthFloat);
&nPreferredVectorWidthFloat, nullptr);
SAL_INFO("opencl", "CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT=" << nPreferredVectorWidthFloat);
clGetPlatformInfo(gpuInfo->mpPlatformID, CL_PLATFORM_NAME, 64,
pName, nullptr);
bool bIsNotWinOrIsWin8OrGreater = true;
// the Win32 SDK 8.1 deprecates GetVersionEx()
#ifdef _WIN32_WINNT_WINBLUE
bIsNotWinOrIsWin8OrGreater = IsWindows8OrGreater();
#elif defined (_WIN32)
OSVERSIONINFO aVersionInfo;
memset( &aVersionInfo, 0, sizeof(aVersionInfo) );
aVersionInfo.dwOSVersionInfoSize = sizeof( aVersionInfo );
if (GetVersionEx( &aVersionInfo ))
{
// Windows 7 or lower?
if (aVersionInfo.dwMajorVersion < 6 ||
(aVersionInfo.dwMajorVersion == 6 && aVersionInfo.dwMinorVersion < 2))
bIsNotWinOrIsWin8OrGreater = false;
}
#endif
// Heuristic: Certain old low-end OpenCL implementations don't
// work for us with too large group lengths. Looking at the preferred
// float vector width seems to be a way to detect these devices, except
// the non-working NVIDIA cards on Windows older than version 8.
gpuInfo->mbNeedsTDRAvoidance = ( nPreferredVectorWidthFloat == 4 ) ||
( !bIsNotWinOrIsWin8OrGreater &&
OUString::createFromAscii(pName).indexOf("NVIDIA") > -1 );
size_t nMaxParameterSize;
clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_MAX_PARAMETER_SIZE, sizeof(size_t),
......
......@@ -4076,9 +4076,8 @@ bool ScFormulaCell::InterpretFormulaGroup()
#ifdef _WIN32
// Heuristic: Certain old low-end OpenCL implementations don't
// work for us with too large group lengths. 1000 was determined
// empirically to be a good compromise. Looking at the preferred
// float vector width seems to be a way to detect these devices.
if (opencl::gpuEnv.mnPreferredVectorWidthFloat == 4)
// empirically to be a good compromise.
if (opencl::gpuEnv.mbNeedsTDRAvoidance)
nMaxGroupLength = 1000;
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment