cudafreelist.H
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef RUTZ_CUDAFREELIST_H_DEFINED
00035 #define RUTZ_FREELIST_H_DEFINED
00036
00037 #include <cstddef>
00038 #include <map>
00039 #include "CUDA/cudadefs.h"
00040
00041 namespace rutz
00042 {
00043 class cuda_free_list_base;
00044 template <class T> class cuda_free_list;
00045 }
00046
00047
00048
00049 class rutz::cuda_free_list_base
00050 {
00051 private:
00052
00053 struct node
00054 {
00055 node* next;
00056 void *mem;
00057 };
00058
00059 node* m_node_list[MAX_CUDA_DEVICES];
00060 std::size_t m_num_allocations[MAX_CUDA_DEVICES];
00061 std::map<int,int> devices;
00062 const std::size_t m_size_check;
00063
00064 int get_index_from_device(int dev);
00065
00066 int find_index_from_device(int dev);
00067 cuda_free_list_base(const cuda_free_list_base&);
00068 cuda_free_list_base& operator=(const cuda_free_list_base&);
00069
00070 public:
00071
00072
00073 cuda_free_list_base(std::size_t size_check);
00074
00075
00076
00077
00078
00079 void* allocate(std::size_t bytes, int dev);
00080
00081
00082 void deallocate(void* space, int dev);
00083
00084
00085 void release_free_nodes();
00086
00087
00088 int get_num_nodes(int dev);
00089
00090 std::map<int,int>::const_iterator getDevicesBegin() { return devices.begin(); }
00091 std::map<int,int>::const_iterator getDevicesEnd() { return devices.end(); }
00092
00093
00094 std::size_t alloc_size() const { return m_size_check; }
00095
00096
00097 std::size_t num_allocations(int dev) { int i= get_index_from_device(dev); return (i<0) ? std::size_t(0) : m_num_allocations[i]; }
00098 };
00099
00100
00101 template <class T>
00102 class rutz::cuda_free_list
00103 {
00104 private:
00105 rutz::cuda_free_list_base m_base;
00106
00107 public:
00108
00109
00110 cuda_free_list() : m_base(sizeof(T)) {}
00111
00112 void* allocate(std::size_t bytes, int dev)
00113 {
00114 return m_base.allocate(bytes,dev);
00115 }
00116
00117 void deallocate(void* space, int dev)
00118 {
00119 m_base.deallocate(space,dev);
00120 }
00121
00122
00123 void release_free_nodes() { m_base.release_free_nodes(); }
00124
00125
00126 int get_num_nodes(int dev) { return m_base.get_num_nodes(dev);}
00127
00128 };
00129
00130 static const char __attribute__((used)) vcid_rutz_cudafreelist_h[] = "$Id: cudafreelist.H 12962 2010-03-06 02:13:53Z irock $ $HeadURL: svn:
00131 #endif // !RUTZ_CUDAFREELIST_H_DEFINED