diff options
author | Anthony Barbier <anthony.barbier@arm.com> | 2018-08-08 13:20:04 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:54:54 +0000 |
commit | b6eb35371d222c6b7f61210d97ebd7dd9e197458 (patch) | |
tree | af89729ad68d665916c37abb5fd49e512fa40614 /src/runtime | |
parent | 1d1f32ce7ef6acea4afd4cf6a929436640b72ccd (diff) | |
download | ComputeLibrary-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')
-rw-r--r-- | src/runtime/CL/CLScheduler.cpp | 41 |
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); |