Пример #1
0
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);
}
Пример #3
0
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;
}