sc/source/core/opencl/openclwrapper.cxx | 205 +++++++++++++++++--------------- sc/source/core/opencl/openclwrapper.hxx | 2 2 files changed, 115 insertions(+), 92 deletions(-)
New commits: commit e000b3fc7852b7879729694436170c01cb6b9fa8 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Tue Oct 1 05:56:34 2013 +0200 make sure that we really fall back to new compile if binary failed If anything during binary import fails fall back to compiling from source. That includes a failure during building the binary file. Change-Id: I0f021f17c9be061fc9eb9f28ab470257d61f03cb diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx index c59f055..77f802e 100644 --- a/sc/source/core/opencl/openclwrapper.cxx +++ b/sc/source/core/opencl/openclwrapper.cxx @@ -453,21 +453,104 @@ int OpenclDevice::cachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * cl return 0; } -int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) +namespace { + +bool buildProgram(const char* buildOption, GPUEnv* gpuInfo, int idx) { - cl_int clStatus = 0; - int binary_status, idx; - const char* filename = "kernel.cl"; - fprintf(stderr, "compileKernelFile ... \n"); - if ( cachedOfKernerPrg(gpuInfo, filename) == 1 ) + cl_int clStatus; + //char options[512]; + // create a cl program executable for all the devices specified + printf("BuildProgram.\n"); + if (!gpuInfo->mnIsUserCreated) { - return 1; + clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, gpuInfo->mpArryDevsID, + buildOption, NULL, NULL); + } + else + { + clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, &(gpuInfo->mpDevID), + buildOption, NULL, NULL); } - idx = gpuInfo->mnFileCount; + if ( clStatus != CL_SUCCESS ) + { + size_t length; + printf ("BuildProgram error!\n"); + 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 ) + { + printf("opencl create build log fail\n"); + return 0; + } + + 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 ) + { + printf("opencl program build info fail\n"); + 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::buildProgramFromSource(const char* buildOption, GPUEnv* gpuInfo, const char* filename, int idx) +{ + cl_int clStatus = 0; + // create a CL program using the kernel source + fprintf(stderr, "Create kernel from source\n"); + size_t source_size[1]; + + source_size[0] = strlen( kernel_src ); + gpuInfo->mpArryPrograms[idx] = clCreateProgramWithSource( gpuInfo->mpContext, 1, &kernel_src, + source_size, &clStatus); + + if(clStatus != CL_SUCCESS) + return false; + bool bSuccess = buildProgram(buildOption, gpuInfo, idx); + generatBinFromKernelSource( gpuInfo->mpArryPrograms[idx], filename ); + return bSuccess; +} + +bool OpenclDevice::buildProgramFromBinary(const char* buildOption, GPUEnv* gpuInfo, const char* filename, int idx) +{ size_t numDevices; - clStatus = clGetContextInfo( gpuInfo->mpContext, CL_CONTEXT_DEVICES, + cl_int clStatus = clGetContextInfo( gpuInfo->mpContext, CL_CONTEXT_DEVICES, 0, NULL, &numDevices ); numDevices /= sizeof(numDevices); CHECK_OPENCL( clStatus, "clGetContextInfo" ); @@ -475,10 +558,8 @@ int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) std::vector<boost::shared_ptr<osl::File> > aGeneratedFiles = binaryGenerated( filename, gpuInfo->mpContext ); - bool bBinaryExisted = false; if (aGeneratedFiles.size() == numDevices) { - bBinaryExisted = true; 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) @@ -507,8 +588,10 @@ int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) { delete[] pBinary[i]; } + return false; } - CHECK_OPENCL( clStatus, "clGetContextInfo" ); + + cl_int binary_status; fprintf(stderr, "Create kernel from binary\n"); gpuInfo->mpArryPrograms[idx] = clCreateProgramWithBinary( gpuInfo->mpContext,numDevices, @@ -517,7 +600,7 @@ int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) if(clStatus != CL_SUCCESS) { // something went wrong, fall back to compiling from source - bBinaryExisted = false; + return false; } for(size_t i = 0; i < numDevices; ++i) { @@ -525,96 +608,34 @@ int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) } } - if(!bBinaryExisted) + if ( !gpuInfo->mpArryPrograms[idx] ) { - // create a CL program using the kernel source - fprintf(stderr, "Create kernel from source\n"); - size_t source_size[1]; - - source_size[0] = strlen( kernel_src ); - gpuEnv.mpArryPrograms[idx] = clCreateProgramWithSource( gpuEnv.mpContext, 1, &kernel_src, - source_size, &clStatus); - CHECK_OPENCL( clStatus, "clCreateProgramWithSource" ); - } - - if ( gpuInfo->mpArryPrograms[idx] == (cl_program) NULL ) - { - return 0; + return false; } + return buildProgram(buildOption, gpuInfo, idx); +} - //char options[512]; - // create a cl program executable for all the devices specified - printf("BuildProgram.\n"); - if (!gpuInfo->mnIsUserCreated) - { - clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, gpuInfo->mpArryDevsID, - buildOption, NULL, NULL); - } - else +int OpenclDevice::compileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) +{ + int idx; + const char* filename = "kernel.cl"; + fprintf(stderr, "compileKernelFile ... \n"); + if ( cachedOfKernerPrg(gpuInfo, filename) == 1 ) { - clStatus = clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, &(gpuInfo->mpDevID), - buildOption, NULL, NULL); + return 1; } - if ( clStatus != CL_SUCCESS ) - { - size_t length; - printf ("BuildProgram error!\n"); - 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 ) - { - printf("opencl create build log fail\n"); - return 0; - } - - 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 ) - { - printf("opencl program build info fail\n"); - return 0; - } - - OString aBuildLogFileURL = 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 0; - - sal_uInt64 nBytesWritten = 0; - aBuildLogFile.write( buildLog.get(), length, nBytesWritten ); - - return 0; - } + idx = gpuInfo->mnFileCount; - strcpy( gpuEnv.mArryKnelSrcFile[idx], filename ); + bool bSuccess = buildProgramFromBinary(buildOption, gpuInfo, filename, idx); + if(!bSuccess) + bSuccess = buildProgramFromSource(buildOption, gpuInfo, filename, idx); - if ( !bBinaryExisted ) - generatBinFromKernelSource( gpuEnv.mpArryPrograms[idx], filename ); + strcpy( gpuInfo->mArryKnelSrcFile[idx], filename ); gpuInfo->mnFileCount += 1; - return 1; + return bSuccess; } int OpenclDevice::initOpenclRunEnv( int argc ) diff --git a/sc/source/core/opencl/openclwrapper.hxx b/sc/source/core/opencl/openclwrapper.hxx index c81c313..dd95954 100644 --- a/sc/source/core/opencl/openclwrapper.hxx +++ b/sc/source/core/opencl/openclwrapper.hxx @@ -179,6 +179,8 @@ public: static int writeBinaryToFile( const OString& rName, const char* birary, size_t numBytes ); static std::vector<boost::shared_ptr<osl::File> > binaryGenerated( const char * clFileName, cl_context context); static int compileKernelFile( const char *filename, GPUEnv *gpuInfo, const char *buildOption ); + static bool buildProgramFromSource(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx); + static bool buildProgramFromBinary(const char* buildOption, GPUEnv* gpuEnv, const char* filename, int idx); static int initOpenclAttr( OpenCLEnv * env ); static int setKernelEnv( KernelEnv *envInfo ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits