Tom Stellard <thomas.stell...@amd.com> writes: > We were serializing the binaries once when clGetProgramInfo was called > with CL_PROGRAM_BINARY_SIZES and then again when it was called with > CL_PROGRAM_BINARIES. This was slowing down some OpenCV tests which were > building binary kernel caches. > > This improves the run-time of OpenCV's OCL_ImgProc/CvtColor8u.* > test from 7 minutes to 1 minute. > ---
Can you give the attached two patches a try? I'm curious to see if they have a comparable effect -- If they do I'd prefer to fix the underlying object rather than caching binaries in serialized form. Thanks. >[...]
From a500126213b073793184b0b6f170a58229340778 Mon Sep 17 00:00:00 2001 From: Francisco Jerez <curroje...@riseup.net> Date: Sat, 14 Jun 2014 20:53:35 +0200 Subject: [PATCH 1/2] clover: Optimize module serialization for vectors of fundamental types. --- src/gallium/state_trackers/clover/core/module.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp index 3e3ad99..41de734 100644 --- a/src/gallium/state_trackers/clover/core/module.cpp +++ b/src/gallium/state_trackers/clover/core/module.cpp @@ -69,7 +69,9 @@ namespace { /// (De)serialize a vector. template<typename T> - struct _serializer<compat::vector<T>> { + struct _serializer<compat::vector<T>, + typename std::enable_if< + !std::is_scalar<T>::value>::type> { static void proc(compat::ostream &os, const compat::vector<T> &v) { _proc<uint32_t>(os, v.size()); @@ -87,6 +89,25 @@ namespace { } }; + template<typename T> + struct _serializer<compat::vector<T>, + typename std::enable_if< + std::is_scalar<T>::value>::type> { + static void + proc(compat::ostream &os, const compat::vector<T> &v) { + _proc<uint32_t>(os, v.size()); + os.write(reinterpret_cast<const char *>(v.begin()), + v.size() * sizeof(T)); + } + + static void + proc(compat::istream &is, compat::vector<T> &v) { + v.reserve(_proc<uint32_t>(is)); + is.read(reinterpret_cast<char *>(v.begin()), + v.size() * sizeof(T)); + } + }; + /// (De)serialize a module::section. template<> struct _serializer<module::section> { -- 1.9.2
From 1267038c2b0621dddc3d5c7718eed7ef2beb111b Mon Sep 17 00:00:00 2001 From: Francisco Jerez <curroje...@riseup.net> Date: Sat, 14 Jun 2014 21:03:02 +0200 Subject: [PATCH 2/2] clover: Calculate the serialized size of a module efficiently. --- src/gallium/state_trackers/clover/api/program.cpp | 5 +--- src/gallium/state_trackers/clover/core/module.cpp | 32 +++++++++++++++++++++++ src/gallium/state_trackers/clover/core/module.hpp | 1 + 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index fedc91d..a14baa3 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -190,10 +190,7 @@ clGetProgramInfo(cl_program d_prog, cl_program_info param, case CL_PROGRAM_BINARY_SIZES: buf.as_vector<size_t>() = map([&](const device &dev) { - compat::ostream::buffer_t bin; - compat::ostream s(bin); - prog.binary(dev).serialize(s); - return bin.size(); + return prog.binary(dev).size(); }, prog.devices()); break; diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp index 41de734..55ed91a 100644 --- a/src/gallium/state_trackers/clover/core/module.cpp +++ b/src/gallium/state_trackers/clover/core/module.cpp @@ -52,6 +52,13 @@ namespace { return x; } + /// Calculate the size of the specified object. + template<typename T> + void + _proc(module::size_t &sz, const T &x) { + _serializer<T>::proc(sz, x); + } + /// (De)serialize a scalar value. template<typename T> struct _serializer<T, typename std::enable_if< @@ -65,6 +72,11 @@ namespace { proc(compat::istream &is, T &x) { is.read(reinterpret_cast<char *>(&x), sizeof(x)); } + + static void + proc(module::size_t &sz, const T &x) { + sz += sizeof(x); + } }; /// (De)serialize a vector. @@ -87,6 +99,14 @@ namespace { for (size_t i = 0; i < v.size(); i++) new(&v[i]) T(_proc<T>(is)); } + + static void + proc(module::size_t &sz, const compat::vector<T> &v) { + sz += sizeof(uint32_t); + + for (size_t i = 0; i < v.size(); i++) + _proc<T>(sz, v[i]); + } }; template<typename T> @@ -106,6 +126,11 @@ namespace { is.read(reinterpret_cast<char *>(v.begin()), v.size() * sizeof(T)); } + + static void + proc(module::size_t &sz, const compat::vector<T> &v) { + sz += sizeof(uint32_t) + sizeof(T) * v.size(); + } }; /// (De)serialize a module::section. @@ -170,4 +195,11 @@ namespace clover { module::deserialize(compat::istream &is) { return _proc<module>(is); } + + module::size_t + module::size() const { + size_t sz = 0; + _proc(sz, *this); + return sz; + } } diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp index 4a8dbcb..18a5bfb 100644 --- a/src/gallium/state_trackers/clover/core/module.hpp +++ b/src/gallium/state_trackers/clover/core/module.hpp @@ -105,6 +105,7 @@ namespace clover { void serialize(compat::ostream &os) const; static module deserialize(compat::istream &is); + size_t size() const; compat::vector<symbol> syms; compat::vector<section> secs; -- 1.9.2
pgpjhvpfdgaag.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev