diff options
Diffstat (limited to 'sc/source/core/opencl/openclwrapper.cxx')
-rw-r--r-- | sc/source/core/opencl/openclwrapper.cxx | 806 |
1 files changed, 0 insertions, 806 deletions
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx deleted file mode 100644 index 20f4919c88c0..000000000000 --- a/sc/source/core/opencl/openclwrapper.cxx +++ /dev/null @@ -1,806 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include <config_folders.h> - -#include "calcconfig.hxx" -#include "interpre.hxx" -#include "opencl_device.hxx" -#include "openclwrapper.hxx" - -#include <comphelper/string.hxx> -#include <opencl/openclconfig.hxx> -#include <osl/file.hxx> -#include <rtl/bootstrap.hxx> -#include <rtl/digest.h> -#include <rtl/strbuf.hxx> -#include <rtl/ustring.hxx> -#include <sal/config.h> - -#include <boost/scoped_array.hpp> -#include <unicode/regex.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <cmath> - -#ifdef _WIN32 -#include <prewin.h> -#include <postwin.h> -#define OPENCL_DLL_NAME "OpenCL.dll" -#elif defined(MACOSX) -#define OPENCL_DLL_NAME NULL -#else -#define OPENCL_DLL_NAME "libOpenCL.so" -#endif - -#define DEVICE_NAME_LENGTH 1024 -#define DRIVER_VERSION_LENGTH 1024 -#define PLATFORM_VERSION_LENGTH 1024 - -using namespace std; - -namespace sc { namespace opencl { - -GPUEnv OpenCLDevice::gpuEnv; -bool OpenCLDevice::bIsInited = false; - -namespace { - -OString generateMD5(const void* pData, size_t length) -{ - sal_uInt8 pBuffer[RTL_DIGEST_LENGTH_MD5]; - rtlDigestError aError = rtl_digest_MD5(pData, length, - pBuffer, RTL_DIGEST_LENGTH_MD5); - SAL_WARN_IF(aError != rtl_Digest_E_None, "sc", "md5 generation failed"); - - OStringBuffer aBuffer; - const char* pString = "0123456789ABCDEF"; - for(size_t i = 0; i < RTL_DIGEST_LENGTH_MD5; ++i) - { - sal_uInt8 val = pBuffer[i]; - aBuffer.append(pString[val/16]); - aBuffer.append(pString[val%16]); - } - return aBuffer.makeStringAndClear(); -} - -OString getCacheFolder() -{ - OUString url("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/"); - rtl::Bootstrap::expandMacros(url); - - osl::Directory::create(url); - - return rtl::OUStringToOString(url, RTL_TEXTENCODING_UTF8); -} - -} - -OString OpenCLDevice::maCacheFolder = getCacheFolder(); - -void OpenCLDevice::setKernelEnv( KernelEnv *envInfo ) -{ - envInfo->mpkContext = gpuEnv.mpContext; - envInfo->mpkCmdQueue = gpuEnv.mpCmdQueue; - envInfo->mpkProgram = gpuEnv.mpArryPrograms[0]; -} - -namespace { - -OString createFileName(cl_device_id deviceId, const char* clFileName) -{ - OString fileName(clFileName); - sal_Int32 nIndex = fileName.lastIndexOf(".cl"); - if(nIndex > 0) - fileName = fileName.copy(0, nIndex); - - char deviceName[DEVICE_NAME_LENGTH] = {0}; - clGetDeviceInfo(deviceId, CL_DEVICE_NAME, - sizeof(deviceName), deviceName, NULL); - - char driverVersion[DRIVER_VERSION_LENGTH] = {0}; - clGetDeviceInfo(deviceId, CL_DRIVER_VERSION, - sizeof(driverVersion), driverVersion, NULL); - - cl_platform_id platformId; - clGetDeviceInfo(deviceId, CL_DEVICE_PLATFORM, - sizeof(platformId), &platformId, NULL); - - char platformVersion[PLATFORM_VERSION_LENGTH] = {0}; - clGetPlatformInfo(platformId, CL_PLATFORM_VERSION, sizeof(platformVersion), - platformVersion, NULL); - - // create hash for deviceName + driver version + platform version - OString aString = OString(deviceName) + driverVersion + platformVersion; - OString aHash = generateMD5(aString.getStr(), aString.getLength()); - - return OpenCLDevice::maCacheFolder + fileName + "-" + - aHash + ".bin"; -} - -} - -std::vector<boost::shared_ptr<osl::File> > OpenCLDevice::binaryGenerated( const char * clFileName, cl_context context ) -{ - size_t numDevices=0; - - std::vector<boost::shared_ptr<osl::File> > aGeneratedFiles; - cl_int clStatus = clGetContextInfo( context, CL_CONTEXT_DEVICES, - 0, NULL, &numDevices ); - numDevices /= sizeof(numDevices); - - if(clStatus != CL_SUCCESS) - return aGeneratedFiles; - - // grab the handles to all of the devices in the context. - boost::scoped_array<cl_device_id> pArryDevsID(new cl_device_id[numDevices]); - clStatus = clGetContextInfo( context, CL_CONTEXT_DEVICES, - sizeof( cl_device_id ) * numDevices, pArryDevsID.get(), NULL ); - - if(clStatus != CL_SUCCESS) - return aGeneratedFiles; - - for ( size_t i = 0; i < numDevices; i++ ) - { - if ( pArryDevsID[i] != 0 ) - { - OString fileName = createFileName(gpuEnv.mpArryDevsID[i], clFileName); - osl::File* pNewFile = new osl::File(rtl::OStringToOUString(fileName, RTL_TEXTENCODING_UTF8)); - if(pNewFile->open(osl_File_OpenFlag_Read) == osl::FileBase::E_None) - { - aGeneratedFiles.push_back(boost::shared_ptr<osl::File>(pNewFile)); - SAL_INFO("sc.opencl.file", "Opening binary file '" << fileName << "' for reading: success"); - } - else - { - SAL_INFO("sc.opencl.file", "Opening binary file '" << fileName << "' for reading: FAIL"); - delete pNewFile; - break; - } - } - } - - return aGeneratedFiles; -} - -bool OpenCLDevice::writeBinaryToFile( const OString& rFileName, const char* binary, size_t numBytes ) -{ - osl::File file(rtl::OStringToOUString(rFileName, RTL_TEXTENCODING_UTF8)); - osl::FileBase::RC status = file.open( - osl_File_OpenFlag_Write | osl_File_OpenFlag_Create ); - - if(status != osl::FileBase::E_None) - return false; - - sal_uInt64 nBytesWritten = 0; - file.write( binary, numBytes, nBytesWritten ); - - assert(numBytes == nBytesWritten); - - return true; -} - -bool OpenCLDevice::generatBinFromKernelSource( cl_program program, const char * clFileName ) -{ - cl_uint numDevices; - - cl_int clStatus = clGetProgramInfo( program, CL_PROGRAM_NUM_DEVICES, - sizeof(numDevices), &numDevices, NULL ); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - std::vector<cl_device_id> pArryDevsID(numDevices); - /* grab the handles to all of the devices in the program. */ - clStatus = clGetProgramInfo( program, CL_PROGRAM_DEVICES, - sizeof(cl_device_id) * numDevices, &pArryDevsID[0], NULL ); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - /* figure out the sizes of each of the binaries. */ - std::vector<size_t> binarySizes(numDevices); - - clStatus = clGetProgramInfo( program, CL_PROGRAM_BINARY_SIZES, - sizeof(size_t) * numDevices, &binarySizes[0], NULL ); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - /* copy over all of the generated binaries. */ - boost::scoped_array<char*> binaries(new char*[numDevices]); - - for ( size_t i = 0; i < numDevices; i++ ) - { - if ( binarySizes[i] != 0 ) - { - binaries[i] = new char[binarySizes[i]]; - } - else - { - binaries[i] = NULL; - } - } - - clStatus = clGetProgramInfo( program, CL_PROGRAM_BINARIES, - sizeof(char *) * numDevices, binaries.get(), NULL ); - CHECK_OPENCL(clStatus,"clGetProgramInfo"); - - /* dump out each binary into its own separate file. */ - for ( size_t i = 0; i < numDevices; i++ ) - { - - if ( binarySizes[i] != 0 ) - { - OString fileName = createFileName(pArryDevsID[i], clFileName); - if ( !writeBinaryToFile( fileName, - binaries[i], binarySizes[i] ) ) - SAL_INFO("sc.opencl.file", "Writing binary file '" << fileName << "': FAIL"); - else - SAL_INFO("sc.opencl.file", "Writing binary file '" << fileName << "': success"); - } - } - - // Release all resouces and memory - for ( size_t i = 0; i < numDevices; i++ ) - { - delete[] binaries[i]; - } - - return true; -} - -bool OpenCLDevice::initOpenCLAttr( OpenCLEnv * env ) -{ - if ( gpuEnv.mnIsUserCreated ) - return true; - - gpuEnv.mpContext = env->mpOclContext; - gpuEnv.mpPlatformID = env->mpOclPlatformID; - gpuEnv.mpDevID = env->mpOclDevsID; - gpuEnv.mpCmdQueue = env->mpOclCmdQueue; - - gpuEnv.mnIsUserCreated = 1; - - return false; -} - -void OpenCLDevice::releaseOpenCLEnv( GPUEnv *gpuInfo ) -{ - if ( !bIsInited ) - { - return; - } - - if ( gpuEnv.mpCmdQueue ) - { - clReleaseCommandQueue( gpuEnv.mpCmdQueue ); - gpuEnv.mpCmdQueue = NULL; - } - if ( gpuEnv.mpContext ) - { - clReleaseContext( gpuEnv.mpContext ); - gpuEnv.mpContext = NULL; - } - bIsInited = false; - gpuInfo->mnIsUserCreated = 0; - free( gpuInfo->mpArryDevsID ); - - return; -} - -namespace { - -bool buildProgram(const char* buildOption, GPUEnv* gpuInfo, int idx) -{ - cl_int clStatus; - //char options[512]; - // create a cl program executable for all the devices specified - if (!gpuInfo->mnIsUserCreated) - { - clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, gpuInfo->mpArryDevsID, - buildOption, NULL, NULL); - } - else - { - clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, &(gpuInfo->mpDevID), - buildOption, NULL, NULL); - } - - if ( clStatus != CL_SUCCESS ) - { - size_t length; - if ( !gpuInfo->mnIsUserCreated ) - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], - CL_PROGRAM_BUILD_LOG, 0, NULL, &length ); - } - else - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, - CL_PROGRAM_BUILD_LOG, 0, NULL, &length); - } - if ( clStatus != CL_SUCCESS ) - { - return false; - } - - boost::scoped_array<char> buildLog(new char[length]); - if ( !gpuInfo->mnIsUserCreated ) - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], - CL_PROGRAM_BUILD_LOG, length, buildLog.get(), &length ); - } - else - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, - CL_PROGRAM_BUILD_LOG, length, buildLog.get(), &length ); - } - if ( clStatus != CL_SUCCESS ) - { - return false; - } - - OString aBuildLogFileURL = OpenCLDevice::maCacheFolder + "kernel-build.log"; - osl::File aBuildLogFile(rtl::OStringToOUString(aBuildLogFileURL, RTL_TEXTENCODING_UTF8)); - osl::FileBase::RC status = aBuildLogFile.open( - osl_File_OpenFlag_Write | osl_File_OpenFlag_Create ); - - if(status != osl::FileBase::E_None) - return false; - - sal_uInt64 nBytesWritten = 0; - aBuildLogFile.write( buildLog.get(), length, nBytesWritten ); - - return false; - } - - return true; -} - -} - -bool OpenCLDevice::buildProgramFromBinary(const char* buildOption, GPUEnv* gpuInfo, const char* filename, int idx) -{ - size_t numDevices; - cl_int clStatus = clGetContextInfo( gpuInfo->mpContext, CL_CONTEXT_DEVICES, - 0, NULL, &numDevices ); - numDevices /= sizeof(numDevices); - CHECK_OPENCL( clStatus, "clGetContextInfo" ); - - std::vector<boost::shared_ptr<osl::File> > aGeneratedFiles = binaryGenerated( - filename, gpuInfo->mpContext ); - - if (aGeneratedFiles.size() == numDevices) - { - boost::scoped_array<size_t> length(new size_t[numDevices]); - boost::scoped_array<unsigned char*> pBinary(new unsigned char*[numDevices]); - for(size_t i = 0; i < numDevices; ++i) - { - sal_uInt64 nSize; - aGeneratedFiles[i]->getSize(nSize); - unsigned char* binary = new unsigned char[nSize]; - sal_uInt64 nBytesRead; - aGeneratedFiles[i]->read(binary, nSize, nBytesRead); - if(nSize != nBytesRead) - assert(false); - - length[i] = nBytesRead; - - pBinary[i] = binary; - } - - // grab the handles to all of the devices in the context. - boost::scoped_array<cl_device_id> pArryDevsID(new cl_device_id[numDevices]); - clStatus = clGetContextInfo( gpuInfo->mpContext, CL_CONTEXT_DEVICES, - sizeof( cl_device_id ) * numDevices, pArryDevsID.get(), NULL ); - - if(clStatus != CL_SUCCESS) - { - for(size_t i = 0; i < numDevices; ++i) - { - delete[] pBinary[i]; - } - return false; - } - - cl_int binary_status; - - gpuInfo->mpArryPrograms[idx] = clCreateProgramWithBinary( gpuInfo->mpContext,numDevices, - pArryDevsID.get(), length.get(), (const unsigned char**) pBinary.get(), - &binary_status, &clStatus ); - if(clStatus != CL_SUCCESS) - { - // something went wrong, fall back to compiling from source - return false; - } - for(size_t i = 0; i < numDevices; ++i) - { - delete[] pBinary[i]; - } - } - - if ( !gpuInfo->mpArryPrograms[idx] ) - { - return false; - } - return buildProgram(buildOption, gpuInfo, idx); -} - -bool OpenCLDevice::initOpenCLRunEnv( int argc ) -{ - if ( ( argc > MAX_CLFILE_NUM ) || ( argc < 0 ) ) - return true; - - if ( !bIsInited ) - { - if ( !gpuEnv.mnIsUserCreated ) - memset( &gpuEnv, 0, sizeof(gpuEnv) ); - - //initialize devices, context, command_queue - bool status = initOpenCLRunEnv( &gpuEnv ); - if ( status ) - { - return true; - } - //initialize program, kernelName, kernelCount - if( getenv( "SC_FLOAT" ) ) - { - gpuEnv.mnKhrFp64Flag = false; - gpuEnv.mnAmdFp64Flag = false; - } - if( gpuEnv.mnKhrFp64Flag ) - { - SAL_INFO("sc.opencl", "Use Khr double"); - } - else if( gpuEnv.mnAmdFp64Flag ) - { - SAL_INFO("sc.opencl", "Use AMD double type"); - } - else - { - SAL_INFO("sc.opencl", "USE float type"); - } - bIsInited = true; - } - return false; -} - -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; - } -} - -} - -bool OpenCLDevice::initOpenCLRunEnv( GPUEnv *gpuInfo ) -{ - bool bKhrFp64 = false; - bool bAmdFp64 = false; - - checkDeviceForDoubleSupport(gpuInfo->mpArryDevsID[0], bKhrFp64, bAmdFp64); - - gpuInfo->mnKhrFp64Flag = bKhrFp64; - gpuInfo->mnAmdFp64Flag = bAmdFp64; - - return false; -} - -namespace { - -// based on crashes and hanging during kernel compilation -void createDeviceInfo(cl_device_id aDeviceId, OpenCLPlatformInfo& rPlatformInfo) -{ - OpenCLDeviceInfo aDeviceInfo; - aDeviceInfo.device = aDeviceId; - - char pName[DEVICE_NAME_LENGTH]; - cl_int nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_NAME, DEVICE_NAME_LENGTH, pName, NULL); - if(nState != CL_SUCCESS) - return; - - aDeviceInfo.maName = OUString::createFromAscii(pName); - - char pVendor[DEVICE_NAME_LENGTH]; - nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_VENDOR, DEVICE_NAME_LENGTH, pVendor, NULL); - if(nState != CL_SUCCESS) - return; - - aDeviceInfo.maVendor = OUString::createFromAscii(pVendor); - - cl_ulong nMemSize; - nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(nMemSize), &nMemSize, NULL); - if(nState != CL_SUCCESS) - return; - - aDeviceInfo.mnMemory = nMemSize; - - cl_uint nClockFrequency; - nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(nClockFrequency), &nClockFrequency, NULL); - if(nState != CL_SUCCESS) - return; - - aDeviceInfo.mnFrequency = nClockFrequency; - - cl_uint nComputeUnits; - nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(nComputeUnits), &nComputeUnits, NULL); - if(nState != CL_SUCCESS) - return; - - char pDriver[DEVICE_NAME_LENGTH]; - nState = clGetDeviceInfo(aDeviceId, CL_DRIVER_VERSION, DEVICE_NAME_LENGTH, pDriver, NULL); - - if(nState != CL_SUCCESS) - return; - - aDeviceInfo.maDriver = OUString::createFromAscii(pDriver); - - bool bKhrFp64 = false; - bool bAmdFp64 = false; - checkDeviceForDoubleSupport(aDeviceId, bKhrFp64, bAmdFp64); - - // only list devices that support double - if(!bKhrFp64 && !bAmdFp64) - return; - - aDeviceInfo.mnComputeUnits = nComputeUnits; - - if(!OpenCLConfig::get().checkImplementation(rPlatformInfo, aDeviceInfo)) - rPlatformInfo.maDevices.push_back(aDeviceInfo); -} - -bool createPlatformInfo(cl_platform_id nPlatformId, OpenCLPlatformInfo& rPlatformInfo) -{ - rPlatformInfo.platform = nPlatformId; - char pName[64]; - cl_int nState = clGetPlatformInfo(nPlatformId, CL_PLATFORM_NAME, 64, - pName, NULL); - if(nState != CL_SUCCESS) - return false; - rPlatformInfo.maName = OUString::createFromAscii(pName); - - char pVendor[64]; - nState = clGetPlatformInfo(nPlatformId, CL_PLATFORM_VENDOR, 64, - pVendor, NULL); - if(nState != CL_SUCCESS) - return false; - - rPlatformInfo.maVendor = OUString::createFromAscii(pVendor); - - cl_uint nDevices; - nState = clGetDeviceIDs(nPlatformId, CL_DEVICE_TYPE_ALL, 0, NULL, &nDevices); - if(nState != CL_SUCCESS) - return false; - - // memory leak that does not matter - // memory is stored in static variable that lives through the whole program - cl_device_id* pDevices = new cl_device_id[nDevices]; - nState = clGetDeviceIDs(nPlatformId, CL_DEVICE_TYPE_ALL, nDevices, pDevices, NULL); - if(nState != CL_SUCCESS) - return false; - - for(size_t i = 0; i < nDevices; ++i) - { - createDeviceInfo(pDevices[i], rPlatformInfo); - } - - return true; -} - -} - -const std::vector<OpenCLPlatformInfo>& fillOpenCLInfo() -{ - static std::vector<OpenCLPlatformInfo> aPlatforms; - if(!aPlatforms.empty()) - return aPlatforms; - - int status = clewInit(OPENCL_DLL_NAME); - if (status < 0) - return aPlatforms; - - cl_uint nPlatforms; - cl_int nState = clGetPlatformIDs(0, NULL, &nPlatforms); - - if(nState != CL_SUCCESS) - return aPlatforms; - - // memory leak that does not matter, - // memory is stored in static instance aPlatforms - cl_platform_id* pPlatforms = new cl_platform_id[nPlatforms]; - nState = clGetPlatformIDs(nPlatforms, pPlatforms, NULL); - - if(nState != CL_SUCCESS) - return aPlatforms; - - for(size_t i = 0; i < nPlatforms; ++i) - { - OpenCLPlatformInfo aPlatformInfo; - if(createPlatformInfo(pPlatforms[i], aPlatformInfo)) - aPlatforms.push_back(aPlatformInfo); - } - - return aPlatforms; -} - -namespace { - -cl_device_id findDeviceIdByDeviceString(const OUString& rString, const std::vector<OpenCLPlatformInfo>& rPlatforms) -{ - std::vector<OpenCLPlatformInfo>::const_iterator it = rPlatforms.begin(), itEnd = rPlatforms.end(); - for(; it != itEnd; ++it) - { - std::vector<OpenCLDeviceInfo>::const_iterator itr = it->maDevices.begin(), itrEnd = it->maDevices.end(); - for(; itr != itrEnd; ++itr) - { - OUString aDeviceId = it->maVendor + " " + itr->maName; - if(rString == aDeviceId) - { - return static_cast<cl_device_id>(itr->device); - } - } - } - - return NULL; -} - -void findDeviceInfoFromDeviceId(cl_device_id aDeviceId, size_t& rDeviceId, size_t& rPlatformId) -{ - cl_platform_id platformId; - cl_int nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_PLATFORM, - sizeof(platformId), &platformId, NULL); - - if(nState != CL_SUCCESS) - return; - - const std::vector<OpenCLPlatformInfo>& rPlatforms = fillOpenCLInfo(); - for(size_t i = 0; i < rPlatforms.size(); ++i) - { - cl_platform_id platId = static_cast<cl_platform_id>(rPlatforms[i].platform); - if(platId != platformId) - continue; - - for(size_t j = 0; j < rPlatforms[i].maDevices.size(); ++j) - { - cl_device_id id = static_cast<cl_device_id>(rPlatforms[i].maDevices[j].device); - if(id == aDeviceId) - { - rDeviceId = j; - rPlatformId = i; - return; - } - } - } -} - -} - -bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEvaluation) -{ - if(fillOpenCLInfo().empty()) - return false; - - cl_device_id pDeviceId = NULL; - if(pDevice) - pDeviceId = findDeviceIdByDeviceString(*pDevice, fillOpenCLInfo()); - - if(!pDeviceId || bAutoSelect) - { - int status = clewInit(OPENCL_DLL_NAME); - if (status < 0) - return false; - - OUString url("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/"); - rtl::Bootstrap::expandMacros(url); - OUString path; - osl::FileBase::getSystemPathFromFileURL(url,path); - OString dsFileName = rtl::OUStringToOString(path, RTL_TEXTENCODING_UTF8); - ds_device pSelectedDevice = sc::OpenCLDevice::getDeviceSelection(dsFileName.getStr(), bForceEvaluation); - pDeviceId = pSelectedDevice.oclDeviceID; - - } - - if(OpenCLDevice::gpuEnv.mpDevID == pDeviceId) - { - // we don't need to change anything - // still the same device - return pDeviceId != NULL; - } - - cl_platform_id platformId; - cl_int nState = clGetDeviceInfo(pDeviceId, CL_DEVICE_PLATFORM, - sizeof(platformId), &platformId, NULL); - - cl_context_properties cps[3]; - cps[0] = CL_CONTEXT_PLATFORM; - cps[1] = reinterpret_cast<cl_context_properties>(platformId); - cps[2] = 0; - cl_context context = clCreateContext( cps, 1, &pDeviceId, NULL, NULL, &nState ); - - if(nState != CL_SUCCESS || context == NULL) - { - if(context != NULL) - clReleaseContext(context); - - SAL_WARN("sc", "failed to set/switch opencl device"); - return false; - } - - cl_command_queue command_queue = clCreateCommandQueue( - context, pDeviceId, 0, &nState); - - if(command_queue == NULL || nState != CL_SUCCESS) - { - if(command_queue != NULL) - clReleaseCommandQueue(command_queue); - - clReleaseContext(context); - SAL_WARN("sc", "failed to set/switch opencl device"); - return false; - } - - OpenCLDevice::releaseOpenCLEnv(&OpenCLDevice::gpuEnv); - OpenCLEnv env; - env.mpOclPlatformID = platformId; - env.mpOclContext = context; - env.mpOclDevsID = pDeviceId; - env.mpOclCmdQueue = command_queue; - OpenCLDevice::initOpenCLAttr(&env); - - // why do we need this at all? - - // (Assuming the above question refers to the mpArryDevsID - // initialisation below.) Because otherwise the code crashes in - // initOpenCLRunEnv(). Confused? You should be. - - OpenCLDevice::gpuEnv.mpArryDevsID = (cl_device_id*) malloc( sizeof(cl_device_id) ); - OpenCLDevice::gpuEnv.mpArryDevsID[0] = pDeviceId; - - return !OpenCLDevice::initOpenCLRunEnv(0); -} - -void getOpenCLDeviceInfo(size_t& rDeviceId, size_t& rPlatformId) -{ - int status = clewInit(OPENCL_DLL_NAME); - if (status < 0) - return; - - cl_device_id id = OpenCLDevice::gpuEnv.mpDevID; - findDeviceInfoFromDeviceId(id, rDeviceId, rPlatformId); -} - -}} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |