From b6eb35371d222c6b7f61210d97ebd7dd9e197458 Mon Sep 17 00:00:00 2001 From: Anthony Barbier Date: Wed, 8 Aug 2018 13:20:04 +0100 Subject: 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 Reviewed-by: Michele DiGiorgio Reviewed-by: Gian Marco Iodice --- src/runtime/CL/CLScheduler.cpp | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) (limited to 'src/runtime/CL/CLScheduler.cpp') 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(nullptr); + std::vector 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 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 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::Platform::get()()), + CL_CONTEXT_PLATFORM, reinterpret_cast(p()), // Enable a printf callback function for this context. CL_PRINTF_CALLBACK_ARM, reinterpret_cast(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(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); -- cgit v1.2.1