| #include <assert.h> |
| #include <stdlib.h> |
| |
| #define LIST_LENGTH 10 |
| |
| struct node |
| { |
| struct node *next; |
| int val; |
| }; |
| |
| int |
| sum_nodes (struct node *head) |
| { |
| int i = 0, sum = 0; |
| |
| #pragma acc parallel reduction(+:sum) present(head[:1]) |
| { |
| for (; head != NULL; head = head->next) |
| sum += head->val; |
| } |
| |
| return sum; |
| } |
| |
| void |
| insert (struct node *head, int val) |
| { |
| struct node *n = (struct node *) malloc (sizeof (struct node)); |
| |
| if (head->next) |
| { |
| #pragma acc exit data detach(head->next) |
| } |
| |
| n->val = val; |
| n->next = head->next; |
| head->next = n; |
| |
| #pragma acc enter data copyin(n[:1]) |
| #pragma acc enter data attach(head->next) |
| if (n->next) |
| { |
| #pragma acc enter data attach(n->next) |
| } |
| } |
| |
| void |
| destroy (struct node *head) |
| { |
| while (head->next != NULL) |
| { |
| #pragma acc exit data detach(head->next) |
| struct node * n = head->next; |
| head->next = n->next; |
| if (n->next) |
| { |
| #pragma acc exit data detach(n->next) |
| } |
| #pragma acc exit data delete (n[:1]) |
| if (head->next) |
| { |
| #pragma acc enter data attach(head->next) |
| } |
| free (n); |
| } |
| } |
| |
| int |
| main () |
| { |
| struct node list = { .next = NULL, .val = 0 }; |
| int i; |
| |
| #pragma acc enter data copyin(list) |
| |
| for (i = 0; i < LIST_LENGTH; i++) |
| insert (&list, i + 1); |
| |
| assert (sum_nodes (&list) == (LIST_LENGTH * LIST_LENGTH + LIST_LENGTH) / 2); |
| |
| destroy (&list); |
| |
| #pragma acc exit data delete(list) |
| |
| return 0; |
| } |