struct movement_bintree* compute_tree(struct movement_bintree* root, unsigned long level) { #ifdef DEBUG puts("call compute_tree"); #endif if(level <= 0) { return NULL; } if(root == NULL) { root = (struct movement_bintree*)malloc( sizeof(struct movement_bintree) ); if(root == NULL) { /* brainfart */ } root->node.poles = MVMT_AC; } root->node.disk = level; if(level > 1) { compute_children(root); compute_tree(root->left, level-1); compute_tree(root->right, level-1); } return root; }
void compute_tree(tree_type tree) { if (tree->left) { #pragma omp task compute_tree(tree->left); } if (tree->right) { #pragma omp task compute_tree(tree->right); } #pragma omp task compute_something(tree); }
int main(int argc, char **argv) { struct movement_bintree *root = NULL; if(argc > 1) { long i = atol(argv[1]); if(i < 0) { exit(EXIT_FAILURE); } root = compute_tree(root, (unsigned long)i); traverse_tree(root); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }
int main() { int i; tree_type tree; init_tree(tree); #pragma omp parallel #pragma omp single { #pragma omp task start_background_work(); for (i = 0; i < max_steps; i++) { #pragma omp taskgroup { #pragma omp task compute_tree(tree); } // wait on tree traversal in this step check_step(); } } // only now is background work required to be complete print_results(); return 0; }