[Libreoffice-commits] core.git: Branch 'feature/calc-pluggable-opencl' - 6 commits - sc/source
Markus Mohrhard
markus.mohrhard at googlemail.com
Mon Sep 16 19:37:56 PDT 2013
sc/source/core/opencl/openclwrapper.cxx | 183 ++++++++++++--------------------
sc/source/core/opencl/openclwrapper.hxx | 6 -
2 files changed, 73 insertions(+), 116 deletions(-)
New commits:
commit 4a95f74ceb02cfa30ba2c6b286aa30d7a01110f1
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 04:25:38 2013 +0200
remove unused method
Change-Id: Id33348c76297583e843af2a1ea43f7f755b86033
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 327ba70..7c245b9 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -180,43 +180,6 @@ Kernel* OpenclDevice::checkKernelName( const char *kernelName )
return NULL;
}
-int OpenclDevice::convertToString( const char *filename, char **source )
-{
- int file_size;
- size_t result;
- FILE *file = NULL;
- file_size = 0;
- result = 0;
- file = fopen( filename, "rb+" );
- printf("open kernel file %s.\n",filename);
-
- if ( file != NULL )
- {
- printf("Open ok!\n");
- fseek( file, 0, SEEK_END );
-
- file_size = ftell( file );
- rewind( file );
- *source = (char*) malloc( sizeof(char) * file_size + 1 );
- if ( *source == (char*) NULL )
- {
- return 0;
- }
- result = fread(*source, 1, file_size, file);
- if ( result != (size_t) file_size )
- {
- free( *source );
- return 0;
- }
- (*source)[file_size] = '\0';
- fclose( file );
-
- return 1;
- }
- printf("open kernel file failed.\n");
- return 0;
-}
-
namespace {
OString createFileName(cl_device_id deviceId, const char* clFileName)
diff --git a/sc/source/core/opencl/openclwrapper.hxx b/sc/source/core/opencl/openclwrapper.hxx
index 001dc0e..7677f4d 100644
--- a/sc/source/core/opencl/openclwrapper.hxx
+++ b/sc/source/core/opencl/openclwrapper.hxx
@@ -178,7 +178,6 @@ public:
static int initOpenclAttr( OpenCLEnv * env );
static int setKernelEnv( KernelEnv *envInfo );
- static int convertToString( const char *filename, char **source );
static Kernel* checkKernelName( const char *kernelName );
static int getOpenclState();
commit 05e43ea4cb9aa5274fbef2a3a7b721faff9b143e
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 04:24:36 2013 +0200
introduce strong versioning of the kernel sources
Change-Id: If42711467b1c8cae4b1044464c7254792ddcd6ad
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index a04447a..327ba70 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -10,6 +10,8 @@
#include "openclwrapper.hxx"
#include <rtl/ustring.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/digest.h>
#include <boost/scoped_array.hpp>
#include "sal/config.h"
@@ -50,6 +52,31 @@ Kernel::Kernel( const char* pName ) : mpName(pName), mpKernel(NULL) {}
GPUEnv OpenclDevice::gpuEnv;
int OpenclDevice::isInited =0;
+namespace {
+
+OString generateHashForSource()
+{
+ size_t nLength = strlen(kernel_src);
+ sal_uInt8 pBuffer[RTL_DIGEST_LENGTH_MD5];
+ rtlDigestError aError = rtl_digest_MD5(kernel_src, nLength,
+ pBuffer, RTL_DIGEST_LENGTH_MD5);
+ assert(aError == rtl_Digest_E_None);
+
+ 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 OpenclDevice::maSourceHash = generateHashForSource();
+
int OpenclDevice::initEnv()
{
// TODO: This part needs more platform specific handling. On Windows,
@@ -190,12 +217,28 @@ int OpenclDevice::convertToString( const char *filename, char **source )
return 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);
+ return fileName + "-" + deviceName + "-" + OpenclDevice::maSourceHash + ".bin";
+}
+
+}
+
int OpenclDevice::binaryGenerated( const char * clFileName, FILE ** fhandle )
{
unsigned int i = 0;
cl_int clStatus;
int status = 0;
- char *str = NULL;
FILE *fd = NULL;
cl_uint numDevices=0;
if ( getenv("SC_OPENCLCPU") )
@@ -215,19 +258,13 @@ int OpenclDevice::binaryGenerated( const char * clFileName, FILE ** fhandle )
&numDevices);
}
CHECK_OPENCL( clStatus, "clGetDeviceIDs" );
+
for ( i = 0; i < numDevices; i++ )
{
- char fileName[256] = { 0 }, cl_name[128] = { 0 };
if ( gpuEnv.mpArryDevsID[i] != 0 )
{
- char deviceName[DEVICE_NAME_LENGTH];
- clStatus = clGetDeviceInfo( gpuEnv.mpArryDevsID[i], CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL );
- CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
- str = (char*) strstr( clFileName, (char*) ".cl" );
- memcpy( cl_name, clFileName, str - clFileName );
- cl_name[str - clFileName] = '\0';
- sprintf( fileName, "./%s-%s.bin", cl_name, deviceName );
- fd = fopen( fileName, "rb" );
+ OString fileName = createFileName(gpuEnv.mpArryDevsID[i], clFileName);
+ fd = fopen( fileName.getStr(), "rb" );
status = ( fd != NULL ) ? 1 : 0;
}
}
@@ -301,17 +338,9 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
if ( binarySizes[i] != 0 )
{
- OString fileName(clFileName);
- sal_Int32 nIndex = fileName.lastIndexOf(".cl");
- if(nIndex > 0)
- fileName = fileName.copy(0, nIndex - 1);
-
- char deviceName[DEVICE_NAME_LENGTH];
- clStatus = clGetDeviceInfo(mpArryDevsID[i], CL_DEVICE_NAME,
- sizeof(deviceName), deviceName, NULL);
- CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
-
- if ( !writeBinaryToFile( fileName + "-" + deviceName, binaries[i], binarySizes[i] ) )
+ OString fileName = createFileName(mpArryDevsID[i], clFileName);
+ if ( !writeBinaryToFile( fileName,
+ binaries[i], binarySizes[i] ) )
{
printf("opencl-wrapper: write binary[%s] failds\n", fileName.getStr());
}
diff --git a/sc/source/core/opencl/openclwrapper.hxx b/sc/source/core/opencl/openclwrapper.hxx
index d14d24b..001dc0e 100644
--- a/sc/source/core/opencl/openclwrapper.hxx
+++ b/sc/source/core/opencl/openclwrapper.hxx
@@ -16,6 +16,8 @@
#include <cassert>
#include "platforminfo.hxx"
+#include <rtl/string.hxx>
+
#include "clcc/clew.h"
// CL_MAP_WRITE_INVALIDATE_REGION is new in OpenCL 1.2.
@@ -161,6 +163,7 @@ public:
static GPUEnv gpuEnv;
static int isInited;
static int initEnv();
+ static OString maSourceHash;
static int registOpenclKernel();
static int releaseOpenclRunEnv();
static int initOpenclRunEnv( GPUEnv *gpu );
@@ -169,7 +172,7 @@ public:
static int initOpenclRunEnv( int argc );
static int cachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * clFileName );
static int generatBinFromKernelSource( cl_program program, const char * clFileName );
- static int writeBinaryToFile( const char* fileName, const char* birary, size_t numBytes );
+ static int writeBinaryToFile( const OString& rName, const char* birary, size_t numBytes );
static int binaryGenerated( const char * clFileName, FILE ** fhandle );
static int compileKernelFile( const char *filename, GPUEnv *gpuInfo, const char *buildOption );
commit c19e139dbe4e680bcc86ad1b21224c578cb0f19a
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 03:48:22 2013 +0200
use OString instead of char* for file name
Change-Id: Idd69827c50056febd30f18bd8ade2b4160eafd02
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index a9c576d..a04447a 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -239,10 +239,10 @@ int OpenclDevice::binaryGenerated( const char * clFileName, FILE ** fhandle )
}
-int OpenclDevice::writeBinaryToFile( const char* fileName, const char* birary, size_t numBytes )
+int OpenclDevice::writeBinaryToFile( const OString& rFileName, const char* birary, size_t numBytes )
{
FILE *output = NULL;
- output = fopen( fileName, "wb" );
+ output = fopen( rFileName.getStr(), "wb" );
if ( output == NULL )
{
return 0;
@@ -298,26 +298,25 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
/* dump out each binary into its own separate file. */
for ( size_t i = 0; i < numDevices; i++ )
{
- char fileName[256] = { 0 }, cl_name[128] = { 0 };
if ( binarySizes[i] != 0 )
{
+ OString fileName(clFileName);
+ sal_Int32 nIndex = fileName.lastIndexOf(".cl");
+ if(nIndex > 0)
+ fileName = fileName.copy(0, nIndex - 1);
+
char deviceName[DEVICE_NAME_LENGTH];
clStatus = clGetDeviceInfo(mpArryDevsID[i], CL_DEVICE_NAME,
sizeof(deviceName), deviceName, NULL);
CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
- char* str = (char*) strstr( clFileName, (char*) ".cl" );
- memcpy( cl_name, clFileName, str - clFileName );
- cl_name[str - clFileName] = '\0';
- sprintf( fileName, "./%s-%s.bin", cl_name, deviceName );
-
- if ( !writeBinaryToFile( fileName, binaries[i], binarySizes[i] ) )
+ if ( !writeBinaryToFile( fileName + "-" + deviceName, binaries[i], binarySizes[i] ) )
{
- printf("opencl-wrapper: write binary[%s] failds\n", fileName);
+ printf("opencl-wrapper: write binary[%s] failds\n", fileName.getStr());
}
else
- printf("opencl-wrapper: write binary[%s] succesfully\n", fileName);
+ printf("opencl-wrapper: write binary[%s] succesfully\n", fileName.getStr());
}
}
commit 78e4ec8b9d66e6d6db99b5f3451734eb4ebaa640
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 03:09:42 2013 +0200
we can still write the next files out if one fails
Change-Id: Ibfb604692f8d5d6f01652af6d6e09339c49be6af
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 0c7718f..a9c576d 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -258,7 +258,6 @@ int OpenclDevice::writeBinaryToFile( const char* fileName, const char* birary, s
int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * clFileName )
{
cl_uint numDevices;
- char *str = NULL;
cl_int clStatus = clGetProgramInfo( program, CL_PROGRAM_NUM_DEVICES,
sizeof(numDevices), &numDevices, NULL );
@@ -308,7 +307,7 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
sizeof(deviceName), deviceName, NULL);
CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
- str = (char*) strstr( clFileName, (char*) ".cl" );
+ char* str = (char*) strstr( clFileName, (char*) ".cl" );
memcpy( cl_name, clFileName, str - clFileName );
cl_name[str - clFileName] = '\0';
sprintf( fileName, "./%s-%s.bin", cl_name, deviceName );
@@ -316,9 +315,9 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
if ( !writeBinaryToFile( fileName, binaries[i], binarySizes[i] ) )
{
printf("opencl-wrapper: write binary[%s] failds\n", fileName);
- return 0;
- } //else
- printf("opencl-wrapper: write binary[%s] succesfully\n", fileName);
+ }
+ else
+ printf("opencl-wrapper: write binary[%s] succesfully\n", fileName);
}
}
commit c289a37b935cb2762376dac1fc853c5178568322
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 02:46:16 2013 +0200
share the setting for the device name length
Change-Id: I5605d05240bc110916400239db203eeb6b8dde35
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index c88dcb83..0c7718f 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -39,6 +39,8 @@
#define OPENCL_DLL_NAME "libOpenCL.so"
#endif
+#define DEVICE_NAME_LENGTH 1024
+
using namespace std;
namespace sc { namespace opencl {
@@ -218,7 +220,7 @@ int OpenclDevice::binaryGenerated( const char * clFileName, FILE ** fhandle )
char fileName[256] = { 0 }, cl_name[128] = { 0 };
if ( gpuEnv.mpArryDevsID[i] != 0 )
{
- char deviceName[1024];
+ char deviceName[DEVICE_NAME_LENGTH];
clStatus = clGetDeviceInfo( gpuEnv.mpArryDevsID[i], CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL );
CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
str = (char*) strstr( clFileName, (char*) ".cl" );
@@ -301,7 +303,7 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
if ( binarySizes[i] != 0 )
{
- char deviceName[1024];
+ char deviceName[DEVICE_NAME_LENGTH];
clStatus = clGetDeviceInfo(mpArryDevsID[i], CL_DEVICE_NAME,
sizeof(deviceName), deviceName, NULL);
CHECK_OPENCL( clStatus, "clGetDeviceInfo" );
@@ -2633,15 +2635,15 @@ void createDeviceInfo(cl_device_id aDeviceId, OpenclPlatformInfo& rPlatformInfo)
OpenclDeviceInfo aDeviceInfo;
aDeviceInfo.device = aDeviceId;
- char pName[64];
- cl_int nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_NAME, 64, pName, NULL);
+ 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[64];
- nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_VENDOR, 64, pName, NULL);
+ char pVendor[DEVICE_NAME_LENGTH];
+ nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_VENDOR, DEVICE_NAME_LENGTH, pName, NULL);
if(nState != CL_SUCCESS)
return;
commit 33bb1a58b76d35a6e17c00b506af79314d3cfe3e
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Sep 17 02:42:40 2013 +0200
fix a number of memory leaks
Change-Id: I1e81558d0f087c1629006b757b1efb332108d5f1
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 8c4ed8f..c88dcb83 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -255,50 +255,34 @@ int OpenclDevice::writeBinaryToFile( const char* fileName, const char* birary, s
int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * clFileName )
{
- unsigned int i = 0;
- cl_int clStatus;
- size_t *binarySizes;
cl_uint numDevices;
- cl_device_id *mpArryDevsID;
- char **binaries, *str = NULL;
+ char *str = NULL;
- clStatus = clGetProgramInfo( program, CL_PROGRAM_NUM_DEVICES,
+ cl_int clStatus = clGetProgramInfo( program, CL_PROGRAM_NUM_DEVICES,
sizeof(numDevices), &numDevices, NULL );
CHECK_OPENCL( clStatus, "clGetProgramInfo" );
- mpArryDevsID = (cl_device_id*) malloc( sizeof(cl_device_id) * numDevices );
- if ( mpArryDevsID == NULL )
- {
- return 0;
- }
+ std::vector<cl_device_id> mpArryDevsID(numDevices);
/* grab the handles to all of the devices in the program. */
clStatus = clGetProgramInfo( program, CL_PROGRAM_DEVICES,
- sizeof(cl_device_id) * numDevices, mpArryDevsID, NULL );
+ sizeof(cl_device_id) * numDevices, &mpArryDevsID[0], NULL );
CHECK_OPENCL( clStatus, "clGetProgramInfo" );
/* figure out the sizes of each of the binaries. */
- binarySizes = (size_t*) malloc( sizeof(size_t) * numDevices );
+ std::vector<size_t> binarySizes(numDevices);
clStatus = clGetProgramInfo( program, CL_PROGRAM_BINARY_SIZES,
- sizeof(size_t) * numDevices, binarySizes, NULL );
+ sizeof(size_t) * numDevices, &binarySizes[0], NULL );
CHECK_OPENCL( clStatus, "clGetProgramInfo" );
/* copy over all of the generated binaries. */
- binaries = (char**) malloc( sizeof(char *) * numDevices );
- if ( binaries == NULL )
- {
- return 0;
- }
+ boost::scoped_array<char*> binaries(new char*[numDevices]);
- for ( i = 0; i < numDevices; i++ )
+ for ( size_t i = 0; i < numDevices; i++ )
{
if ( binarySizes[i] != 0 )
{
- binaries[i] = (char*) malloc( sizeof(char) * binarySizes[i] );
- if ( binaries[i] == NULL )
- {
- return 0;
- }
+ binaries[i] = new char[binarySizes[i]];
}
else
{
@@ -307,11 +291,11 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
}
clStatus = clGetProgramInfo( program, CL_PROGRAM_BINARIES,
- sizeof(char *) * numDevices, binaries, NULL );
+ sizeof(char *) * numDevices, binaries.get(), NULL );
CHECK_OPENCL(clStatus,"clGetProgramInfo");
/* dump out each binary into its own separate file. */
- for ( i = 0; i < numDevices; i++ )
+ for ( size_t i = 0; i < numDevices; i++ )
{
char fileName[256] = { 0 }, cl_name[128] = { 0 };
@@ -337,32 +321,11 @@ int OpenclDevice::generatBinFromKernelSource( cl_program program, const char * c
}
// Release all resouces and memory
- for ( i = 0; i < numDevices; i++ )
- {
- if ( binaries[i] != NULL )
- {
- free( binaries[i] );
- binaries[i] = NULL;
- }
- }
-
- if ( binaries != NULL )
+ for ( size_t i = 0; i < numDevices; i++ )
{
- free( binaries );
- binaries = NULL;
+ delete[] binaries[i];
}
- if ( binarySizes != NULL )
- {
- free( binarySizes );
- binarySizes = NULL;
- }
-
- if ( mpArryDevsID != NULL )
- {
- free( mpArryDevsID );
- mpArryDevsID = NULL;
- }
return 1;
}
More information about the Libreoffice-commits
mailing list