aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/CL/CLScheduler.cpp
diff options
context:
space:
mode:
authorAnthony Barbier <anthony.barbier@arm.com>2018-08-08 13:20:04 +0100
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:54:54 +0000
commitb6eb35371d222c6b7f61210d97ebd7dd9e197458 (patch)
treeaf89729ad68d665916c37abb5fd49e512fa40614 /src/runtime/CL/CLScheduler.cpp
parent1d1f32ce7ef6acea4afd4cf6a929436640b72ccd (diff)
downloadComputeLibrary-b6eb35371d222c6b7f61210d97ebd7dd9e197458.tar.gz
COMPMID-1478: Stop relying on static default OpenCL objects in cl2.hpp
This causes problems when ACL is used as a shared library on Android. Fixes some problems related to creation / destruction order between the Graph's CL backend and core / runtime Change-Id: I716d63fd42f4586df1ffbb6fa97e4db06d3a781b Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/143228 Tested-by: Jenkins <bsgcomp@arm.com> Reviewed-by: Michele DiGiorgio <michele.digiorgio@arm.com> Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Diffstat (limited to 'src/runtime/CL/CLScheduler.cpp')
-rw-r--r--src/runtime/CL/CLScheduler.cpp41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/runtime/CL/CLScheduler.cpp b/src/runtime/CL/CLScheduler.cpp
index f524a918e6..a812bad865 100644
--- a/src/runtime/CL/CLScheduler.cpp
+++ b/src/runtime/CL/CLScheduler.cpp
@@ -29,15 +29,15 @@
using namespace arm_compute;
-#if defined(ARM_COMPUTE_DEBUG_ENABLED)
namespace
{
+#if defined(ARM_COMPUTE_DEBUG_ENABLED)
void printf_callback(const char *buffer, unsigned int len, size_t complete, void *user_data)
{
printf("%.*s", len, buffer);
}
-} // namespace
#endif /* defined(ARM_COMPUTE_DEBUG_ENABLED) */
+} // namespace
std::once_flag CLScheduler::_initialize_symbols;
@@ -57,19 +57,25 @@ void CLScheduler::default_init(ICLTuner *cl_tuner)
{
if(!_is_initialised)
{
- cl::Context ctx = cl::Context::getDefault();
- auto queue_properties = cl::CommandQueue::getDefault().getInfo<CL_QUEUE_PROPERTIES>(nullptr);
+ std::vector<cl::Platform> platforms;
+ cl::Platform::get(&platforms);
+ ARM_COMPUTE_ERROR_ON_MSG(platforms.size() == 0, "Couldn't find any OpenCL platform");
+ cl::Platform p = platforms[0];
+ cl::Context ctx;
+ cl::Device device;
+ std::vector<cl::Device> platform_devices;
+ p.getDevices(CL_DEVICE_TYPE_DEFAULT, &platform_devices);
+ ARM_COMPUTE_ERROR_ON_MSG(platform_devices.size() == 0, "Couldn't find any OpenCL device");
+ device = platform_devices[0];
#if defined(ARM_COMPUTE_DEBUG_ENABLED)
- // Query devices in the context for cl_arm_printf support
- std::vector<cl::Device> def_platform_devices;
- cl::Platform::getDefault().getDevices(CL_DEVICE_TYPE_DEFAULT, &def_platform_devices);
- if(device_supports_extension(def_platform_devices[0], "cl_arm_printf"))
+ // Query devices in the context for cl_arm_printf support
+ if(device_supports_extension(device, "cl_arm_printf"))
{
// Create a cl_context with a printf_callback and user specified buffer size.
cl_context_properties properties[] =
{
- CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(cl::Platform::get()()),
+ CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(p()),
// Enable a printf callback function for this context.
CL_PRINTF_CALLBACK_ARM, reinterpret_cast<cl_context_properties>(printf_callback),
// Request a minimum printf buffer size of 4MB for devices in the
@@ -77,13 +83,22 @@ void CLScheduler::default_init(ICLTuner *cl_tuner)
CL_PRINTF_BUFFERSIZE_ARM, 0x1000,
0
};
- ctx = cl::Context(CL_DEVICE_TYPE_DEFAULT, properties);
+ ctx = cl::Context(device, properties);
}
+ else
#endif // defined(ARM_COMPUTE_DEBUG_ENABLED)
+ {
+ cl_context_properties properties[] =
+ {
+ CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(p()),
+ 0
+ };
+ ctx = cl::Context(device, properties);
+ };
- cl::CommandQueue queue = cl::CommandQueue(ctx, cl::Device::getDefault(), queue_properties);
- CLKernelLibrary::get().init("./cl_kernels/", ctx, cl::Device::getDefault());
- init(ctx, queue, cl::Device::getDefault(), cl_tuner);
+ cl::CommandQueue queue = cl::CommandQueue(ctx, device);
+ CLKernelLibrary::get().init("./cl_kernels/", ctx, device);
+ init(ctx, queue, device, cl_tuner);
// Create a default static tuner and set if none was provided
_cl_default_static_tuner = tuners::TunerFactory::create_tuner(_target);