curfil  ..
 All Classes Functions Variables Typedefs Friends Groups Pages
allocators.hpp
1 #ifndef __CUV_ALLOCATORS_HPP__
2 #define __CUV_ALLOCATORS_HPP__
3 
4 #include <assert.h>
5 #include <boost/shared_ptr.hpp>
6 #include <boost/thread/recursive_mutex.hpp>
7 #include <map>
8 #include <string>
9 
10 #ifdef DEBUG_POOLING
11 #include <iostream>
12 #define CUV_LOG_DEBUG(X) std::cout << X << std::endl;
13 #else
14 #define CUV_LOG_DEBUG(X)
15 #endif
16 
17 #include "tags.hpp"
18 #include "meta_programming.hpp"
19 
20 namespace cuv {
21 
22 class allocator {
23 
24 public:
25 
26  virtual ~allocator() {
27  }
28 
29  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, host_memory_space) = 0;
30 
31  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, dev_memory_space) = 0;
32 
33  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
34  host_memory_space) = 0;
35 
36  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
37  dev_memory_space) = 0;
38 
39  virtual void dealloc(void** ptr, host_memory_space) = 0;
40 
41  virtual void dealloc(void** ptr, dev_memory_space) = 0;
42 
43 };
44 
51 
52 public:
53 
54  virtual ~default_allocator() {
55  }
56 
57  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, host_memory_space);
58 
59  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, dev_memory_space);
60 
61  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
63 
64  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
66 
67  virtual void dealloc(void** ptr, host_memory_space);
68 
69  virtual void dealloc(void** ptr, dev_memory_space);
70 
71 };
72 
77 
78 public:
79 
80  virtual ~cuda_allocator() {
81  }
82 
83  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, host_memory_space);
84 
85  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, dev_memory_space);
86 
87  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
89 
90  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
92 
93  virtual void dealloc(void** ptr, host_memory_space);
94 
95  virtual void dealloc(void** ptr, dev_memory_space);
96 
97 }
98 ;
99 
104 private:
105 
106  std::string m_name;
107 
108  boost::recursive_mutex m_dev_pool_mutex;
109  boost::recursive_mutex m_host_pool_mutex;
110 
111  // maps pointers to flag: true means memory is available. false means: currently in use
112  std::map<void*, bool> m_dev_pool;
113  std::map<void*, size_t> m_dev_pool_sizes;
114 
115  std::map<void*, bool> m_host_pool;
116  std::map<void*, size_t> m_host_pool_sizes;
117 
118  default_allocator default_alloc;
119  cuda_allocator cuda_alloc;
120 
122  pooled_cuda_allocator& operator=(const pooled_cuda_allocator& o);
123 
124  // for logging
125  std::string memtype(host_memory_space) const {
126  return "host space";
127  }
128 
129  // for logging
130  std::string memtype(dev_memory_space) const {
131  return "dev space";
132  }
133 
134  template<class memory_space>
135  boost::recursive_mutex& get_pool_mutex(memory_space m) const;
136 
137  template<class memory_space>
138  std::map<void*, bool>& get_pool(memory_space m);
139 
140  template<class memory_space>
141  const std::map<void*, bool>& get_pool(memory_space m) const;
142 
143  template<class memory_space>
144  std::map<void*, size_t>& get_pool_sizes(memory_space m);
145 
146  template<class memory_space>
147  const std::map<void*, size_t>& get_pool_sizes(memory_space m) const;
148 
149  template<class memory_space>
150  void collect_garbage(memory_space m);
151 
152  template<class memory_space>
153  void alloc_pooled(void** ptr, size_t memsize, size_t valueSize, memory_space m);
154 
155  template<class memory_space>
156  void delete_pool(memory_space);
157 
158  template<class memory_space>
159  void do_dealloc(void** ptr, memory_space m);
160 
161 public:
162  static const size_t MIN_SIZE_HOST = 8192;
163  static const size_t MIN_SIZE_DEV = 1;
164  explicit pooled_cuda_allocator(const std::string& _name = "");
165 
166  virtual ~pooled_cuda_allocator();
167 
168  virtual void garbage_collection() {
169  collect_garbage(host_memory_space());
170  collect_garbage(dev_memory_space());
171  }
172 
173  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, host_memory_space);
174 
175  virtual void alloc(void** ptr, size_t memsize, size_t valueSize, dev_memory_space);
176 
177  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
179 
180  virtual void alloc2d(void** ptr, size_t& pitch, size_t height, size_t width, size_t valueSize,
182 
183  virtual void dealloc(void** ptr, host_memory_space);
184 
185  virtual void dealloc(void** ptr, dev_memory_space);
186 
187  template<class memory_space>
188  size_t pool_free_count(memory_space m) const;
189 
190  template<class memory_space>
191  size_t pool_size(memory_space m) const;
192 
193  template<class memory_space>
194  size_t pool_count(memory_space m) const;
195 
196  size_t pool_free_count() const;
197 
198  size_t pool_size() const;
199 
200  size_t pool_count() const;
201 
202 };
203 
204 }
205 
206 #endif