mirror of
https://github.com/OpenMP/Examples.git
synced 2025-04-07 23:22:11 +01:00
61 lines
1.1 KiB
C
61 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();
|
|
return 0;
|
|
}
|