OpenMP-Examples/sources/Example_taskgroup.1c.c
2015-01-13 11:38:24 -08:00

60 lines
1.1 KiB
C

/*
* @@name: taskgroup.1c
* @@type: C
* @@compilable: yes
* @@linkable: yes
* @@expect: success
*/
extern void start_background_work(void);
extern void check_step(void);
extern void print_results(void);
struct tree_node
{
struct tree_node *left;
struct tree_node *right;
};
typedef struct tree_node* tree_type;
extern void init_tree(tree_type);
#define max_steps 100
void compute_something(tree_type tree)
{
// some computation
}
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 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();
}