[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - sc/inc
Kohei Yoshida
kohei.yoshida at collabora.com
Wed Mar 5 09:14:35 PST 2014
sc/inc/formulagroup.hxx | 4 +-
sc/inc/stlalgorithm.hxx | 79 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+), 1 deletion(-)
New commits:
commit 5e34a3236258f47374c34e5c7ab92fde9b981bb7
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Wed Feb 26 16:29:27 2014 -0500
Ensure that numeric array storage is aligned to 256-byte boundary.
OpenCL devices require this else we would get a performance hit.
(cherry picked from commit 03f7a342011a4f69cfcbec7af3e4f1a2e835618b)
(cherry picked from commit 757856e9275d19e2c7a3673d10fa8963fb9fbeb3)
Change-Id: Ie69e07dc5d9b62abad5cc39d1f30e1d770c56758
Reviewed-on: https://gerrit.libreoffice.org/8466
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/sc/inc/formulagroup.hxx b/sc/inc/formulagroup.hxx
index 3834e49..602c4a4 100644
--- a/sc/inc/formulagroup.hxx
+++ b/sc/inc/formulagroup.hxx
@@ -13,6 +13,7 @@
#include "address.hxx"
#include "types.hxx"
#include "platforminfo.hxx"
+#include <stlalgorithm.hxx>
#include "svl/sharedstringpool.hxx"
@@ -28,7 +29,8 @@ namespace sc {
struct FormulaGroupContext : boost::noncopyable
{
- typedef std::vector<double> NumArrayType;
+ typedef AlignedAllocator<double,256> DoubleAllocType;
+ typedef std::vector<double, DoubleAllocType> NumArrayType;
typedef std::vector<rtl_uString*> StrArrayType;
typedef boost::ptr_vector<NumArrayType> NumArrayStoreType;
typedef boost::ptr_vector<StrArrayType> StrArrayStoreType;
diff --git a/sc/inc/stlalgorithm.hxx b/sc/inc/stlalgorithm.hxx
index fb5509f..f788667 100644
--- a/sc/inc/stlalgorithm.hxx
+++ b/sc/inc/stlalgorithm.hxx
@@ -11,6 +11,10 @@
#define __SC_STLALGORITHM_HXX__
#include <functional>
+#include <limits>
+
+#include <stdlib.h>
+#include <malloc.h>
/**
* Function object to allow deleting instances stored in STL containers as
@@ -25,6 +29,81 @@ struct ScDeleteObjectByPtr : public ::std::unary_function<T*, void>
}
};
+namespace sc {
+
+/**
+ * Custom allocator for STL container to ensure that the base address of
+ * allocated storage is aligned to a specified boundary.
+ */
+template<typename T, size_t _Alignment>
+class AlignedAllocator
+{
+public:
+ typedef T value_type;
+ typedef size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T* void_pointer;
+
+ typedef T& reference;
+ typedef const T& const_reference;
+
+ template<typename _Type2>
+ struct rebind
+ {
+ typedef AlignedAllocator<_Type2,_Alignment> other;
+ };
+
+ AlignedAllocator() {}
+ ~AlignedAllocator() {}
+
+ template<typename _Type2>
+ AlignedAllocator(const AlignedAllocator<_Type2,_Alignment>&) {}
+
+ void construct(T* p, const value_type& val) { new(p) value_type(val); }
+ void destroy(T* p) { p->~value_type(); }
+
+ size_type max_size() const
+ {
+ return std::numeric_limits<size_type>::max() / sizeof(value_type);
+ }
+
+ bool operator== (const AlignedAllocator&) const { return true; }
+ bool operator!= (const AlignedAllocator&) const { return false; }
+
+ pointer allocate(size_type n)
+ {
+ if (!n)
+ return NULL;
+
+ size_type size = n*sizeof(value_type);
+#ifdef WNT
+ return _aligned_malloc(size, _Alignment);
+#elif defined __ANDROID__
+ return memalign(align, size);
+#else
+ void* ptr;
+ int err = posix_memalign(&ptr, _Alignment, size);
+ if (err)
+ ptr = NULL;
+ return (pointer)ptr;
+#endif
+ }
+
+ void deallocate(pointer p, size_type)
+ {
+#ifdef WNT
+ _aligned_free(p);
+#else
+ free(p);
+#endif
+ }
+};
+
+}
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list