From db9116ff15170ff734aad0300b46c48abc2a3b7b Mon Sep 17 00:00:00 2001 From: Pablo Tello Date: Thu, 11 Jul 2019 16:50:37 +0100 Subject: COMPMID-2443: CL example use program cache by default. Change-Id: I9db5cf4ce98e86f7488f4041f0d0247d3d0cd663 Signed-off-by: Pablo Tello Reviewed-on: https://review.mlplatform.org/c/1528 Tested-by: Arm Jenkins Comments-Addressed: Arm Jenkins Reviewed-by: Michele Di Giorgio Reviewed-by: VidhyaSudhan Loganathan --- utils/Utils.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) (limited to 'utils/Utils.cpp') diff --git a/utils/Utils.cpp b/utils/Utils.cpp index 1d086765b3..47ec25963b 100644 --- a/utils/Utils.cpp +++ b/utils/Utils.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -23,6 +23,8 @@ */ #include "Utils.h" +#include "arm_compute/runtime/CL/CLScheduler.h" + #include #include #include @@ -267,5 +269,79 @@ uint64_t get_mem_free_from_meminfo() // Nothing found or an error during opening the file return 0; } + +/** This function loads prebuilt opencl kernels from a file + * + * @param[in] filename Name of the file to be used to load the kernels + */ +void restore_program_cache_from_file(const std::string &filename) +{ + std::ifstream cache_file(filename, std::ios::binary); + if(cache_file.is_open()) + { + if(!CLScheduler::get().is_initialised()) + { + arm_compute::CLScheduler::get().default_init(); + } + + while(!cache_file.eof()) + { + size_t name_len = 0; + size_t binary_len = 0; + cache_file.read(reinterpret_cast(&name_len), sizeof(size_t)); + cache_file.read(reinterpret_cast(&binary_len), sizeof(size_t)); + if(name_len == 0 || binary_len == 0) + { + break; + } + std::vector tmp(name_len); + std::vector binary(binary_len); + std::string name; + cache_file.read(tmp.data(), name_len); + name.assign(tmp.data(), name_len); + tmp.resize(binary_len); + cache_file.read(reinterpret_cast(binary.data()), binary_len); + cl::Context context = arm_compute::CLScheduler::get().context(); + cl::Program::Binaries binaries{ binary }; + std::vector devices = context.getInfo(); + cl::Program program(context, devices, binaries); + program.build(); + CLKernelLibrary::get().add_built_program(name, program); + } + cache_file.close(); + } +} + +/** This function saves opencl kernels library to a file + * + * @param[in] filename Name of the file to be used to save the library + */ +void save_program_cache_to_file(const std::string &filename) +{ + if(CLScheduler::get().is_initialised()) + { + std::ofstream cache_file(filename, std::ios::binary); + if(cache_file.is_open()) + { + for(const auto &it : CLKernelLibrary::get().get_built_programs()) + { + std::vector> binaries = it.second.getInfo(); + ARM_COMPUTE_ERROR_ON(binaries.size() != 1); + const std::string kernel_name = it.first; + size_t kernel_name_size = kernel_name.length(); + size_t binary_size = binaries[0].size(); + cache_file.write(reinterpret_cast(&kernel_name_size), sizeof(size_t)); + cache_file.write(reinterpret_cast(&binary_size), sizeof(size_t)); + cache_file.write(kernel_name.c_str(), kernel_name_size); + cache_file.write(reinterpret_cast(binaries[0].data()), binaries[0].size()); + } + cache_file.close(); + } + else + { + ARM_COMPUTE_ERROR("Cannot open cache file"); + } + } +} } // namespace utils } // namespace arm_compute -- cgit v1.2.1