aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/CL/CLScheduler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/CL/CLScheduler.cpp')
-rw-r--r--src/runtime/CL/CLScheduler.cpp48
1 files changed, 48 insertions, 0 deletions
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<CL_QUEUE_PROPERTIES>(nullptr);
+#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"))
+ {
+ // 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()()),
+ // 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
+ // 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,