forked from llvm-mirror/openmp
-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
I am trying to leverage low-level Argobots features inside BOLT tasks (BOLT 1.0rc3, built with internal Argobots). In particular, I would like to block a set of tasks on a conditional variable and unblock them eventually from a different task, like in this example:
#include <abt.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int n = 10;
#pragma omp parallel
{
#pragma omp master
{
int blocked = 0;
ABT_mutex mtx;
ABT_cond cond;
ABT_mutex_create(&mtx);
ABT_cond_create(&cond);
for (int i = 0; i < n; ++i) {
printf("Discovering task %d\n", i);
#pragma omp task shared(mtx, cond, blocked)
{
printf("Task %d blocking\n", i);
ABT_mutex_lock(mtx);
blocked++;
ABT_cond_wait(cond, mtx);
ABT_mutex_unlock(mtx);
}
}
#pragma omp task shared(cond, mtx, blocked)
{
printf("Broadcast task starting\n");
while (n != blocked) {
ABT_thread_yield();
}
// mutex required to ensure all tasks entered cond
ABT_mutex_lock(mtx);
printf("Broadcast task broadcasting\n");
ABT_cond_broadcast(cond);
ABT_mutex_unlock(mtx);
}
#pragma omp taskwait
}
}
return 0;
}What I see is that all tasks are created and only the first task starts executing. Output:
$ ./test_bolt_abt_cond
Discovering task 0
Discovering task 1
Discovering task 2
Discovering task 3
Discovering task 4
Discovering task 5
Discovering task 6
Discovering task 7
Discovering task 8
Discovering task 9
Task 0 blocking
Any idea why only the first task is executing? Are the other runnable tasks not passed to Argobots? Do I need to set some environment variables to make this work?
Metadata
Metadata
Assignees
Labels
No labels