updated CUDA hybridAPI and added a CUDA hello example
[charm.git] / src / arch / cuda / hybridAPI / wrqueue.cu
1 /*
2  * wrqueue.cu
3  *
4  * by Lukasz Wesolowski
5  * 04.12.2008
6  *
7  * a simple FIFO queue for GPU work requests
8  *
9  */
10
11 #include "wrqueue.h"
12
13 void initWRqueue(workRequestQueue **qptr) {
14
15   (*qptr) = (workRequestQueue*) malloc(sizeof(workRequestQueue));  
16
17   (*qptr)->head = 0; 
18   (*qptr)->tail = -1;
19   (*qptr)->size = 0; 
20   (*qptr)->capacity = QUEUE_SIZE_INIT; 
21
22   (*qptr)->requests = (workRequest *) malloc(QUEUE_SIZE_INIT * sizeof(workRequest)); 
23
24 }
25
26 void enqueue(workRequestQueue *q, workRequest *wr) {
27   workRequest *newArray; 
28   int newSize; 
29   int tailendIndex;  /* index for the second part of the array in the new array */
30
31   if (q->size == q->capacity) {
32
33     /* queue is out of space: create a new queue with
34        QUEUE_EXPANSION_SIZE more slots */
35
36     newSize = q->capacity + QUEUE_EXPANSION_SIZE;
37     newArray = (workRequest *) malloc(newSize * sizeof(workRequest));
38
39     /* copy requests to the new array */
40     memcpy(newArray, &q->requests[q->head], 
41            (q->capacity - q->head) * sizeof(workRequest));
42
43     /* if head index is not 0, there are additional work requests to
44        be copied from the beginning of the array */
45     if (q->head != 0) {
46       tailendIndex = q->capacity - q->head; 
47       memcpy(&newArray[tailendIndex], q->requests, q->head); 
48     }
49
50     /* update bookkeeping variables in the expanded queue */
51     q->tail = q->size; 
52     q->capacity += QUEUE_EXPANSION_SIZE;
53     q->head = 0;
54     
55     /* free the old queue's memory */
56     free(q->requests); 
57
58     /* reassign the pointer to the new queue */
59     q->requests = newArray;
60   }
61
62   q->tail++; 
63   if (q->tail == q->capacity) {
64     q->tail = 0; 
65   }
66
67   memcpy(&q->requests[q->tail], &(*wr), sizeof(workRequest));
68   free(wr); 
69
70   q->size++; 
71 }
72
73 void dequeue(workRequestQueue *q) {
74   q->head++; 
75   if (q->head == q->capacity) {
76     q->head = 0; 
77   }
78   q->size--; 
79 }
80
81 int deleteWRqueue(workRequestQueue *q) {
82   if (q->size != 0) {
83     return -1; 
84   }
85   else {
86     free(q->requests); 
87     return 0; 
88   }
89 }
90
91 workRequest * head(workRequestQueue *q) {
92     return &q->requests[q->head]; 
93 }
94
95 int isEmpty(workRequestQueue *q) {
96   if (q->size == 0) {
97     return 1; 
98   }
99   else {
100     return 0; 
101   }
102 }