[Beignet] [PATCH] replace hash_map with map

Guo Yejun yejun.guo at intel.com
Wed Dec 24 00:17:46 PST 2014


there is no strong evidence to show hash_map makes better performance
for beignet, since hash_map requires std::hash which is not supported
in some g++ old versions, so replace hash_map with map.

Signed-off-by: Guo Yejun <yejun.guo at intel.com>
---
 backend/src/CMakeLists.txt            |  1 -
 backend/src/backend/program.hpp       |  3 +-
 backend/src/ir/unit.hpp               |  5 +--
 backend/src/llvm/llvm_gen_backend.hpp |  5 +--
 backend/src/sys/hash_map.hpp          | 82 -----------------------------------
 5 files changed, 5 insertions(+), 91 deletions(-)
 delete mode 100644 backend/src/sys/hash_map.hpp

diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
index deba230..bec0d2a 100644
--- a/backend/src/CMakeLists.txt
+++ b/backend/src/CMakeLists.txt
@@ -21,7 +21,6 @@ add_dependencies(beignet_bitcode libocl)
 set (GBE_SRC
     ${ocl_blob_file}
     sys/vector.hpp
-    sys/hash_map.hpp
     sys/map.hpp
     sys/set.hpp
     sys/intrusive_list.hpp
diff --git a/backend/src/backend/program.hpp b/backend/src/backend/program.hpp
index 4e6b275..446c521 100644
--- a/backend/src/backend/program.hpp
+++ b/backend/src/backend/program.hpp
@@ -32,7 +32,6 @@
 #include "ir/function.hpp"
 #include "ir/printf.hpp"
 #include "ir/sampler.hpp"
-#include "sys/hash_map.hpp"
 #include "sys/vector.hpp"
 #include <string>
 
@@ -307,7 +306,7 @@ namespace gbe {
     /*! Allocate an empty kernel. */
     virtual Kernel *allocateKernel(const std::string &name) = 0;
     /*! Kernels sorted by their name */
-    hash_map<std::string, Kernel*> kernels;
+    map<std::string, Kernel*> kernels;
     /*! Global (constants) outside any kernel */
     ir::ConstantSet *constantSet;
     /*! Use custom allocators */
diff --git a/backend/src/ir/unit.hpp b/backend/src/ir/unit.hpp
index b5b0fa9..e2ccbe8 100644
--- a/backend/src/ir/unit.hpp
+++ b/backend/src/ir/unit.hpp
@@ -26,7 +26,6 @@
 
 #include "ir/constant.hpp"
 #include "ir/register.hpp"
-#include "sys/hash_map.hpp"
 #include "sys/map.hpp"
 
 namespace gbe {
@@ -41,7 +40,7 @@ namespace ir {
   class Unit : public NonCopyable
   {
   public:
-    typedef hash_map<std::string, Function*> FunctionSet;
+    typedef map<std::string, Function*> FunctionSet;
     /*! Create an empty unit */
     Unit(PointerSize pointerSize = POINTER_32_BITS);
     /*! Release everything (*including* the function pointers) */
@@ -76,7 +75,7 @@ namespace ir {
     bool getValid() { return valid; }
   private:
     friend class ContextInterface; //!< Can free modify the unit
-    hash_map<std::string, Function*> functions; //!< All the defined functions
+    FunctionSet functions; //!< All the defined functions
     ConstantSet constantSet; //!< All the constants defined in the unit
     PointerSize pointerSize; //!< Size shared by all pointers
     GBE_CLASS(Unit);
diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp
index 966a06c..e127996 100644
--- a/backend/src/llvm/llvm_gen_backend.hpp
+++ b/backend/src/llvm/llvm_gen_backend.hpp
@@ -37,7 +37,6 @@
 #endif
 #include "sys/platform.hpp"
 #include "sys/map.hpp"
-#include "sys/hash_map.hpp"
 #include <algorithm>
 
 // LLVM Type
@@ -57,7 +56,7 @@ namespace gbe
 
   /*! Build the hash map for OCL functions on Gen */
   struct OCLIntrinsicMap {
-    /*! Build the intrinsic hash map */
+    /*! Build the intrinsic map */
     OCLIntrinsicMap(void) {
 #define DECL_LLVM_GEN_FUNCTION(ID, NAME) \
   map.insert(std::make_pair(#NAME, GEN_OCL_##ID));
@@ -65,7 +64,7 @@ namespace gbe
 #undef DECL_LLVM_GEN_FUNCTION
     }
     /*! Sort intrinsics with their names */
-    hash_map<std::string, OCLInstrinsic> map;
+    gbe::map<std::string, OCLInstrinsic> map;
     OCLInstrinsic find(const std::string symbol) const {
       auto it = map.find(symbol);
 
diff --git a/backend/src/sys/hash_map.hpp b/backend/src/sys/hash_map.hpp
deleted file mode 100644
index e153cf3..0000000
--- a/backend/src/sys/hash_map.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/* 
- * Copyright © 2012 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Benjamin Segovia <benjamin.segovia at intel.com>
- */
-
-/**
- * \file hash_map.hpp
- *
- * \author Benjamin Segovia <benjamin.segovia at intel.com>
- */
-
-#ifndef __GBE_HASH_MAP_HPP__
-#define __GBE_HASH_MAP_HPP__
-
-#include "sys/platform.hpp"
-
-#ifdef __MSVC__
-#include <unordered_map>
-#else
-#include <tr1/unordered_map>
-#endif /* __MSVC__ */
-
-namespace gbe
-{
-  /*! Add specific allocator to the hash map */
-  template <class Key,
-            class T,
-            class Hash = std::hash<Key>,
-            class Pred = std::equal_to<Key>>
-  class hash_map : public std::tr1::unordered_map<Key,T,Hash,Pred,Allocator<std::pair<const Key,T>>>,
-                   public NonCopyable
-  {
-  public:
-    // Typedefs
-    typedef std::pair<const Key, T> value_type;
-    typedef Allocator<value_type> allocator_type;
-    typedef std::tr1::unordered_map<Key,T,Hash,Pred,allocator_type> parent_type;
-    typedef typename allocator_type::size_type size_type;
-    typedef Key key_type;
-    typedef T mapped_type;
-    typedef Hash hasher;
-    typedef Pred key_equal;
-
-    /*! Default constructor */
-    INLINE explicit hash_map(size_type n = 3,
-                             const hasher& hf = hasher(),
-                             const key_equal& eql = key_equal(),
-                             const allocator_type& a = allocator_type()) :
-      parent_type(n, hf, eql, a) {}
-    /*! Iteration constructor */
-    template <class InputIterator>
-    INLINE hash_map(InputIterator first,
-                    InputIterator last,
-                    size_type n = 3,
-                    const hasher& hf = hasher(),
-                    const key_equal& eql = key_equal(),
-                    const allocator_type& a = allocator_type()) :
-      parent_type(first,last,n,hf,eql,a) {}
-#if 0
-    /*! Copy constructor */
-    INLINE hash_map(const hash_map &other) : parent_type(other) {}
-#endif
-    GBE_CLASS(hash_map);
-  };
-} /* namespace gbe */
-
-#endif /* __GBE_HASH_MAP_HPP__ */
-
-- 
1.9.1



More information about the Beignet mailing list