This source file includes following definitions.
- mca_rcache_gpusm_registration_constructor
- mca_rcache_gpusm_registration_destructor
- mca_rcache_gpusm_module_init
- mca_rcache_gpusm_find
- mca_rcache_gpusm_register
- mca_rcache_gpusm_deregister
- mca_rcache_gpusm_finalize
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include "opal_config.h"
41 #include "opal/mca/rcache/base/base.h"
42 #include "opal/mca/rcache/gpusm/rcache_gpusm.h"
43 #include "opal/mca/common/cuda/common_cuda.h"
44
45
46
47
48
49 static void mca_rcache_gpusm_registration_constructor( mca_rcache_gpusm_registration_t *item )
50 {
51 mca_common_cuda_construct_event_and_handle(&item->event,
52 (void *)&item->evtHandle);
53 }
54
55
56
57
58 static void mca_rcache_gpusm_registration_destructor( mca_rcache_gpusm_registration_t *item )
59 {
60 mca_common_cuda_destruct_event(item->event);
61 }
62
63 OBJ_CLASS_INSTANCE(mca_rcache_gpusm_registration_t, mca_rcache_base_registration_t,
64 mca_rcache_gpusm_registration_constructor,
65 mca_rcache_gpusm_registration_destructor);
66
67
68
69
70 void mca_rcache_gpusm_module_init(mca_rcache_gpusm_module_t* rcache)
71 {
72 rcache->super.rcache_component = &mca_rcache_gpusm_component.super;
73 rcache->super.rcache_register = mca_rcache_gpusm_register;
74 rcache->super.rcache_find = mca_rcache_gpusm_find;
75 rcache->super.rcache_deregister = mca_rcache_gpusm_deregister;
76 rcache->super.rcache_finalize = mca_rcache_gpusm_finalize;
77
78 OBJ_CONSTRUCT(&rcache->reg_list, opal_free_list_t);
79
80
81
82
83 opal_free_list_init (&rcache->reg_list, sizeof(struct mca_rcache_common_cuda_reg_t),
84 opal_cache_line_size,
85 OBJ_CLASS(mca_rcache_gpusm_registration_t),
86 0,opal_cache_line_size,
87 0, -1, 64, NULL, 0, NULL, NULL, NULL);
88
89 }
90
91
92
93
94
95 int mca_rcache_gpusm_find(mca_rcache_base_module_t *rcache, void *addr,
96 size_t size,
97 mca_rcache_base_registration_t **reg)
98 {
99 return mca_rcache_gpusm_register(rcache, addr, size, 0, 0, reg);
100 }
101
102
103
104
105
106
107
108 int mca_rcache_gpusm_register(mca_rcache_base_module_t *rcache, void *addr,
109 size_t size, uint32_t flags, int32_t access_flags,
110 mca_rcache_base_registration_t **reg)
111 {
112 mca_rcache_gpusm_module_t *rcache_gpusm = (mca_rcache_gpusm_module_t*)rcache;
113 mca_rcache_base_registration_t *gpusm_reg;
114 opal_free_list_item_t *item;
115 unsigned char *base, *bound;
116 int rc;
117
118
119
120
121
122 *reg = NULL;
123
124 base = addr;
125 bound = (unsigned char *)addr + size - 1;
126
127 item = opal_free_list_get (&rcache_gpusm->reg_list);
128 if(NULL == item) {
129 return OPAL_ERR_OUT_OF_RESOURCE;
130 }
131 gpusm_reg = (mca_rcache_base_registration_t*)item;
132
133 gpusm_reg->rcache = rcache;
134 gpusm_reg->base = base;
135 gpusm_reg->bound = bound;
136 gpusm_reg->flags = flags;
137 gpusm_reg->access_flags = access_flags;
138
139 rc = cuda_getmemhandle (base, size, gpusm_reg, NULL);
140
141 if(rc != OPAL_SUCCESS) {
142 opal_free_list_return (&rcache_gpusm->reg_list, item);
143 return rc;
144 }
145
146 *reg = gpusm_reg;
147 (*reg)->ref_count++;
148 return OPAL_SUCCESS;
149
150 }
151
152
153
154
155 int mca_rcache_gpusm_deregister(struct mca_rcache_base_module_t *rcache,
156 mca_rcache_base_registration_t *reg)
157 {
158 int rc;
159 mca_rcache_gpusm_module_t *rcache_gpusm = (mca_rcache_gpusm_module_t *)rcache;
160
161 rc = cuda_ungetmemhandle (NULL, reg);
162 opal_free_list_return (&rcache_gpusm->reg_list, (opal_free_list_item_t *) reg);
163 return OPAL_SUCCESS;
164 }
165
166
167
168
169 void mca_rcache_gpusm_finalize(struct mca_rcache_base_module_t *rcache)
170 {
171 opal_free_list_item_t *item;
172 mca_rcache_gpusm_module_t *rcache_gpusm = (mca_rcache_gpusm_module_t *)rcache;
173
174
175
176
177 while (NULL != (item = (opal_free_list_item_t *)opal_lifo_pop(&(rcache_gpusm->reg_list.super)))) {
178 OBJ_DESTRUCT(item);
179 }
180
181 OBJ_DESTRUCT(&rcache_gpusm->reg_list);
182 return;
183 }