From df473eab0ab8a52e6b58e0f6442b39ba4c1d68ea Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Thu, 31 May 2018 18:53:52 +0100 Subject: COMPMID-1182: printf doesn't work Change-Id: I013d57f6e2becbd6d2d7700ce5fbbeca670443c4 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/133735 Tested-by: Jenkins Reviewed-by: Pablo Tello --- src/runtime/CL/CLScheduler.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/runtime/CL/CLScheduler.cpp') diff --git a/src/runtime/CL/CLScheduler.cpp b/src/runtime/CL/CLScheduler.cpp index fdae615108..c348dfab80 100644 --- a/src/runtime/CL/CLScheduler.cpp +++ b/src/runtime/CL/CLScheduler.cpp @@ -28,6 +28,16 @@ using namespace arm_compute; +#if defined(ARM_COMPUTE_DEBUG_ENABLED) +namespace +{ +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) */ + std::once_flag CLScheduler::_initialize_symbols; CLScheduler::CLScheduler() @@ -42,6 +52,44 @@ CLScheduler &CLScheduler::get() return scheduler; } +void CLScheduler::default_init(ICLTuner *cl_tuner) +{ + if(!_is_initialised) + { + cl::Context ctx = cl::Context::getDefault(); + auto queue_properties = cl::CommandQueue::getDefault().getInfo(nullptr); +#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")) + { + // 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()()), + // 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 + // context that support this extension. + CL_PRINTF_BUFFERSIZE_ARM, 0x1000, + 0 + }; + ctx = cl::Context(CL_DEVICE_TYPE_DEFAULT, properties); + } +#endif // defined(ARM_COMPUTE_DEBUG_ENABLED) + + 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); + } + else + { + _cl_tuner = cl_tuner; + } +} + void CLScheduler::enqueue(ICLKernel &kernel, bool flush) { ARM_COMPUTE_ERROR_ON_MSG(!_is_initialised, -- cgit v1.2.1