summaryrefslogtreecommitdiff
path: root/opencl/source/openclwrapper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'opencl/source/openclwrapper.cxx')
-rw-r--r--opencl/source/openclwrapper.cxx107
1 files changed, 62 insertions, 45 deletions
diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx
index a54d86a70fc4..db6c7e51c09a 100644
--- a/opencl/source/openclwrapper.cxx
+++ b/opencl/source/openclwrapper.cxx
@@ -21,6 +21,7 @@
#include <rtl/ustring.hxx>
#include <sal/config.h>
#include <sal/log.hxx>
+#include <opencl/OpenCLZone.hxx>
#include <memory>
#include <unicode/regex.h>
@@ -81,15 +82,19 @@ OString generateMD5(const void* pData, size_t length)
OString getCacheFolder()
{
- OUString url("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/");
- rtl::Bootstrap::expandMacros(url);
+ static OString aCacheFolder;
- osl::Directory::create(url);
+ if (aCacheFolder.isEmpty())
+ {
+ OUString url("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/");
+ rtl::Bootstrap::expandMacros(url);
- return rtl::OUStringToOString(url, RTL_TEXTENCODING_UTF8);
-}
+ osl::Directory::create(url);
-OString maCacheFolder = getCacheFolder();
+ aCacheFolder = rtl::OUStringToOString(url, RTL_TEXTENCODING_UTF8);
+ }
+ return aCacheFolder;
+}
}
@@ -131,8 +136,7 @@ OString createFileName(cl_device_id deviceId, const char* clFileName)
OString aString = OString(deviceName) + driverVersion + platformVersion;
OString aHash = generateMD5(aString.getStr(), aString.getLength());
- return maCacheFolder + fileName + "-" +
- aHash + ".bin";
+ return getCacheFolder() + fileName + "-" + aHash + ".bin";
}
std::vector<std::shared_ptr<osl::File> > binaryGenerated( const char * clFileName, cl_context context )
@@ -266,6 +270,8 @@ bool initOpenCLAttr( OpenCLEnv * env )
void releaseOpenCLEnv( GPUEnv *gpuInfo )
{
+ OpenCLZone zone;
+
if ( !bIsInited )
{
return;
@@ -318,7 +324,7 @@ bool buildProgram(const char* buildOption, GPUEnv* gpuInfo, int idx)
return false;
}
- OString aBuildLogFileURL = maCacheFolder + "kernel-build.log";
+ OString aBuildLogFileURL = getCacheFolder() + "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 );
@@ -409,6 +415,8 @@ namespace {
void checkDeviceForDoubleSupport(cl_device_id deviceId, bool& bKhrFp64, bool& bAmdFp64)
{
+ OpenCLZone zone;
+
bKhrFp64 = false;
bAmdFp64 = false;
@@ -441,6 +449,8 @@ void checkDeviceForDoubleSupport(cl_device_id deviceId, bool& bKhrFp64, bool& bA
bool initOpenCLRunEnv( GPUEnv *gpuInfo )
{
+ OpenCLZone zone;
+
bool bKhrFp64 = false;
bool bAmdFp64 = false;
@@ -689,7 +699,7 @@ void findDeviceInfoFromDeviceId(cl_device_id aDeviceId, size_t& rDeviceId, size_
}
-bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEvaluation)
+bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEvaluation, OUString& rOutSelectedDeviceVersionIDString)
{
if(fillOpenCLInfo().empty())
return false;
@@ -712,7 +722,6 @@ bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEv
if ( aSelectedDevice.eType != DeviceType::OpenCLDevice)
return false;
pDeviceId = aSelectedDevice.aDeviceID;
-
}
if(gpuEnv.mpDevID == pDeviceId)
@@ -722,54 +731,62 @@ bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEv
return pDeviceId != nullptr;
}
+ cl_context context;
cl_platform_id platformId;
- cl_int nState = clGetDeviceInfo(pDeviceId, CL_DEVICE_PLATFORM,
- sizeof(platformId), &platformId, nullptr);
-
- 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, nullptr, nullptr, &nState );
- if (nState != CL_SUCCESS)
- SAL_WARN("opencl", "clCreateContext failed: " << errorString(nState));
+ cl_command_queue command_queue[OPENCL_CMDQUEUE_SIZE];
- if(nState != CL_SUCCESS || context == nullptr)
{
- if(context != nullptr)
- clReleaseContext(context);
+ OpenCLZone zone;
+ cl_int nState = clGetDeviceInfo(pDeviceId, CL_DEVICE_PLATFORM,
+ sizeof(platformId), &platformId, nullptr);
+
+ cl_context_properties cps[3];
+ cps[0] = CL_CONTEXT_PLATFORM;
+ cps[1] = reinterpret_cast<cl_context_properties>(platformId);
+ cps[2] = 0;
+ context = clCreateContext( cps, 1, &pDeviceId, nullptr, nullptr, &nState );
+ if (nState != CL_SUCCESS)
+ SAL_WARN("opencl", "clCreateContext failed: " << errorString(nState));
- SAL_WARN("opencl", "failed to set/switch opencl device");
- return false;
- }
- SAL_INFO("opencl", "Created context " << context << " for platform " << platformId << ", device " << pDeviceId);
+ if(nState != CL_SUCCESS || context == nullptr)
+ {
+ if(context != nullptr)
+ clReleaseContext(context);
- cl_command_queue command_queue[OPENCL_CMDQUEUE_SIZE];
- for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
- {
- command_queue[i] = clCreateCommandQueue(
- context, pDeviceId, 0, &nState);
- if (nState != CL_SUCCESS)
- SAL_WARN("opencl", "clCreateCommandQueue failed: " << errorString(nState));
+ SAL_WARN("opencl", "failed to set/switch opencl device");
+ return false;
+ }
+ SAL_INFO("opencl", "Created context " << context << " for platform " << platformId << ", device " << pDeviceId);
- if (command_queue[i] == nullptr || nState != CL_SUCCESS)
+ for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
{
- // Release all command queues created so far.
- for (int j = 0; j <= i; ++j)
+ command_queue[i] = clCreateCommandQueue(
+ context, pDeviceId, 0, &nState);
+ if (nState != CL_SUCCESS)
+ SAL_WARN("opencl", "clCreateCommandQueue failed: " << errorString(nState));
+
+ if (command_queue[i] == nullptr || nState != CL_SUCCESS)
{
- if (command_queue[j])
+ // Release all command queues created so far.
+ for (int j = 0; j <= i; ++j)
{
- clReleaseCommandQueue(command_queue[j]);
- command_queue[j] = nullptr;
+ if (command_queue[j])
+ {
+ clReleaseCommandQueue(command_queue[j]);
+ command_queue[j] = nullptr;
+ }
}
+
+ clReleaseContext(context);
+ SAL_WARN("opencl", "failed to set/switch opencl device");
+ return false;
}
- clReleaseContext(context);
- SAL_WARN("opencl", "failed to set/switch opencl device");
- return false;
+ SAL_INFO("opencl", "Created command queue " << command_queue[i] << " for context " << context);
}
- SAL_INFO("opencl", "Created command queue " << command_queue[i] << " for context " << context);
+ OString sDeviceID = getDeviceInfoString(pDeviceId, CL_DEVICE_VENDOR) + " " + getDeviceInfoString(pDeviceId, CL_DRIVER_VERSION);
+ rOutSelectedDeviceVersionIDString = OStringToOUString(sDeviceID, RTL_TEXTENCODING_UTF8);
}
setOpenCLCmdQueuePosition(0); // Call this just to avoid the method being deleted from unused function deleter.