33 gdata->allocated_segments = NULL;
34 gdata->free_segments = NULL;
35 gdata->unit_size = _unit_size;
36 gdata->max_segment = _max_segment+2;
38 rc = (cudaError_t)cudaMalloc(&ptr, (_max_segment * gdata->unit_size));
40 if ((cudaSuccess != rc) || (NULL == gdata->base)) {
44 for(i = 0 ; i < _max_segment; i++) {
46 s->next = gdata->free_segments;
47 gdata->free_segments = s;
51 gdata->allocated_segments->start_index = 0;
52 gdata->allocated_segments->nb_units = 1;
53 gdata->allocated_segments->nb_free = _max_segment;
56 gdata->allocated_segments->next->start_index = _max_segment+1;
57 gdata->allocated_segments->next->nb_units = 1;
58 gdata->allocated_segments->next->nb_free = 0;
59 gdata->allocated_segments->next->next = NULL;
78 while (NULL != gdata->allocated_segments) {
79 s = gdata->allocated_segments->next;
80 free(gdata->allocated_segments);
81 gdata->allocated_segments = s;
83 while( NULL != gdata->free_segments ) {
84 s = gdata->free_segments->next;
85 free(gdata->free_segments);
86 gdata->free_segments = s;
88 rc = (cudaError_t)cudaFree(gdata->base);
89 if (cudaSuccess != rc)
91 gdata->max_segment = 0;
108 int nb_units = size/gdata->unit_size;
109 if (size % gdata->unit_size != 0)
113 for(s = gdata->allocated_segments; s->next != NULL; s = s->next) {
114 if ( s->nb_free > nb_units ) {
118 n = gdata->free_segments;
119 gdata->free_segments = gdata->free_segments->next;
121 n->start_index = s->start_index + s->nb_units;
122 n->nb_units = nb_units;
123 n->nb_free = s->nb_free - n->nb_units;
127 return (
void*)(gdata->base + (n->start_index * gdata->unit_size));
148 p = gdata->allocated_segments;
149 tid = ((
char*)add - gdata->base) / gdata->unit_size;
151 for (s = gdata->allocated_segments->next; s->next != NULL; s = s->next) {
152 if (s->start_index == tid) {
154 p->nb_free += s->nb_units + s->nb_free;
156 s->next = gdata->free_segments;
157 gdata->free_segments = s;