sc/source/core/opencl/openclwrapper.cxx | 72 +++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 23 deletions(-)
New commits: commit c7f043f5abaf19fce179ebf5f9b8053202e6841a Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Mon Sep 16 20:08:32 2013 +0200 only list opencl devices with double support Change-Id: I90eec86fff08fd20f4567551932bf328adc85859 diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx index ea2d754..511c8df 100644 --- a/sc/source/core/opencl/openclwrapper.cxx +++ b/sc/source/core/opencl/openclwrapper.cxx @@ -729,6 +729,42 @@ int OpenclDevice::initOpenclRunEnv( int argc ) return 0; } +namespace { + +void checkDeviceForDoubleSupport(cl_device_id deviceId, bool& bKhrFp64, bool& bAmdFp64) +{ + bKhrFp64 = false; + bAmdFp64 = false; + + // Check device extensions for double type + size_t aDevExtInfoSize = 0; + + cl_uint clStatus = clGetDeviceInfo( deviceId, CL_DEVICE_EXTENSIONS, 0, NULL, &aDevExtInfoSize ); + if( clStatus != CL_SUCCESS ) + return; + + boost::scoped_array<char> pExtInfo(new char[aDevExtInfoSize]); + + clStatus = clGetDeviceInfo( deviceId, CL_DEVICE_EXTENSIONS, + sizeof(char) * aDevExtInfoSize, pExtInfo.get(), NULL); + + if( clStatus != CL_SUCCESS ) + return; + + if ( strstr( pExtInfo.get(), "cl_khr_fp64" ) ) + { + bKhrFp64 = true; + } + else + { + // Check if cl_amd_fp64 extension is supported + if ( strstr( pExtInfo.get(), "cl_amd_fp64" ) ) + bAmdFp64 = true; + } +} + +} + int OpenclDevice::initOpenclRunEnv( GPUEnv *gpuInfo ) { size_t length; @@ -859,32 +895,14 @@ int OpenclDevice::initOpenclRunEnv( GPUEnv *gpuInfo ) } clStatus = clGetCommandQueueInfo( gpuInfo->mpCmdQueue, CL_QUEUE_THREAD_HANDLE_AMD, 0, NULL, NULL ); - // Check device extensions for double type - size_t aDevExtInfoSize = 0; - - clStatus = clGetDeviceInfo( gpuInfo->mpArryDevsID[0], CL_DEVICE_EXTENSIONS, 0, NULL, &aDevExtInfoSize ); - CHECK_OPENCL( clStatus, "clGetDeviceInfo" ); - - char *aExtInfo = new char[aDevExtInfoSize]; - clStatus = clGetDeviceInfo( gpuInfo->mpArryDevsID[0], CL_DEVICE_EXTENSIONS, - sizeof(char) * aDevExtInfoSize, aExtInfo, NULL); - CHECK_OPENCL( clStatus, "clGetDeviceInfo" ); + bool bKhrFp64 = false; + bool bAmdFp64 = false; - gpuInfo->mnKhrFp64Flag = 0; - gpuInfo->mnAmdFp64Flag = 0; + checkDeviceForDoubleSupport(gpuInfo->mpArryDevsID[0], bKhrFp64, bAmdFp64); - if ( strstr( aExtInfo, "cl_khr_fp64" ) ) - { - gpuInfo->mnKhrFp64Flag = 1; - } - else - { - // Check if cl_amd_fp64 extension is supported - if ( strstr( aExtInfo, "cl_amd_fp64" ) ) - gpuInfo->mnAmdFp64Flag = 1; - } - delete []aExtInfo; + gpuInfo->mnKhrFp64Flag = bKhrFp64; + gpuInfo->mnAmdFp64Flag = bAmdFp64; return 0; } @@ -2675,6 +2693,14 @@ void createDeviceInfo(cl_device_id aDeviceId, OpenclPlatformInfo& rPlatformInfo) if(nState != CL_SUCCESS) return; + bool bKhrFp64 = false; + bool bAmdFp64 = false; + checkDeviceForDoubleSupport(aDeviceId, bKhrFp64, bAmdFp64); + + // only list devices that support double + if(!bKhrFp64 && !bAmdFp64) + return; + aDeviceInfo.mnComputeUnits = nComputeUnits; rPlatformInfo.maDevices.push_back(aDeviceInfo); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits