Преглед изворни кода

- modify omp_parallel_region/omp_task_region API to accept a single struct argument

Olivier Aumage пре 11 година
родитељ
комит
576ccca422

+ 27 - 4
include/starpu_openmp.h

@@ -41,6 +41,31 @@ typedef enum e_starpu_omp_proc_bind
 	starpu_omp_proc_bind_spread = 4,
 } starpu_omp_proc_bind_t;
 
+typedef struct starpu_omp_parallel_region_attr
+{
+	struct starpu_codelet  cl;
+	starpu_data_handle_t  *handles;
+	void     *cl_arg;
+	size_t    cl_arg_size;
+	unsigned  cl_arg_free;
+
+	int if_clause;
+} starpu_omp_parallel_region_attr_t;
+
+typedef struct starpu_omp_task_region_attr
+{
+	struct starpu_codelet  cl;
+	starpu_data_handle_t  *handles;
+	void     *cl_arg;
+	size_t    cl_arg_size;
+	unsigned  cl_arg_free;
+
+	int if_clause;
+	int final_clause;
+	int untied_clause;
+	int mergeable_clause;
+} starpu_omp_task_region_attr_t;
+
 #ifdef __cplusplus
 extern "C"
 {
@@ -52,7 +77,7 @@ extern "C"
 extern int starpu_omp_init(void) __STARPU_OMP_NOTHROW;
 extern void starpu_omp_shutdown(void) __STARPU_OMP_NOTHROW;
 
-extern void starpu_omp_parallel_region(const struct starpu_codelet * const parallel_region_cl, starpu_data_handle_t *handles, void * const cl_arg, size_t cl_arg_size, unsigned cl_arg_free, int if_clause) __STARPU_OMP_NOTHROW;
+extern void starpu_omp_parallel_region(const starpu_omp_parallel_region_attr_t *attr) __STARPU_OMP_NOTHROW;
 
 extern void starpu_omp_barrier(void) __STARPU_OMP_NOTHROW;
 
@@ -66,9 +91,7 @@ extern void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *nam
 extern void starpu_omp_critical_inline_begin(const char *name) __STARPU_OMP_NOTHROW;
 extern void starpu_omp_critical_inline_end(const char *name) __STARPU_OMP_NOTHROW;
 
-extern void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl, starpu_data_handle_t *handles,
-		void * const cl_arg, size_t cl_arg_size, unsigned cl_arg_free,
-		int if_clause, int final_clause, int untied_clause, int mergeable_clause) __STARPU_OMP_NOTHROW;
+extern void starpu_omp_task_region(const starpu_omp_task_region_attr_t *attr) __STARPU_OMP_NOTHROW;
 extern void starpu_omp_taskwait(void) __STARPU_OMP_NOTHROW;
 extern void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW;
 

+ 39 - 36
src/util/openmp_runtime_support.c

@@ -679,8 +679,7 @@ void starpu_omp_shutdown(void)
 	STARPU_PTHREAD_KEY_DELETE(omp_thread_key);
 }
 
-void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_region_cl, starpu_data_handle_t *handles,
-		void * const cl_arg, size_t cl_arg_size, unsigned cl_arg_free, int if_clause)
+void starpu_omp_parallel_region(const struct starpu_omp_parallel_region_attr *attr)
 {
 	struct starpu_omp_thread *master_thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key);
 	struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key);
@@ -690,7 +689,7 @@ void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_re
 	/* TODO: compute the proper nb_threads and launch additional workers as needed.
 	 * for now, the level 1 parallel region spans all the threads
 	 * and level >= 2 parallel regions have only one thread */
-	int nb_threads = (if_clause != 0 && region->level == 0)?starpu_cpu_worker_get_count():1;
+	int nb_threads = (attr->if_clause != 0 && region->level == 0)?starpu_cpu_worker_get_count():1;
 
 	struct starpu_omp_region *new_region = 
 		create_omp_region_struct(region, _global_state.initial_device);
@@ -769,7 +768,7 @@ void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_re
 			implicit_task != starpu_omp_task_list_end(new_region->implicit_task_list);
 			implicit_task  = starpu_omp_task_list_next(implicit_task))
 	{
-		implicit_task->cl = *_parallel_region_cl;
+		implicit_task->cl = attr->cl;
 		/*
 		 * save pointer to the regions user function from the parallel region codelet
 		 *
@@ -788,18 +787,20 @@ void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_re
 			unsigned i;
 			for (i = 0; i < implicit_task->cl.nbuffers; i++)
 			{
-				implicit_task->starpu_task->handles[i] = handles[i];
+				implicit_task->starpu_task->handles[i] = attr->handles[i];
 			}
 		}
-		implicit_task->starpu_task->cl_arg = cl_arg;
-		implicit_task->starpu_task->cl_arg_size = cl_arg_size;
-		implicit_task->starpu_task->cl_arg_free = cl_arg_free;
+		implicit_task->starpu_task->cl_arg = attr->cl_arg;
+		implicit_task->starpu_task->cl_arg_size = attr->cl_arg_size;
+		implicit_task->starpu_task->cl_arg_free = attr->cl_arg_free;
 		implicit_task->starpu_task->omp_task = implicit_task;
 		implicit_task->starpu_task->workerid = implicit_task->owner_thread->worker->workerid;
 		implicit_task->starpu_task->execute_on_a_specific_worker = 1;
 		starpu_task_declare_deps_array(new_region->continuation_starpu_task, 1, &implicit_task->starpu_task);
 	}
 
+	attr = NULL;
+
 	/*
 	 * submit all the region implicit starpu tasks
 	 */
@@ -1160,9 +1161,7 @@ static void explicit_task__destroy_callback(void *_task)
 	}
 }
 
-void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl, starpu_data_handle_t *handles,
-		void * const cl_arg, size_t cl_arg_size, unsigned cl_arg_free,
-		int if_clause, int final_clause, int untied_clause, int mergeable_clause)
+void starpu_omp_task_region(const struct starpu_omp_task_region_attr *attr)
 {
 	struct starpu_omp_task *generating_task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key);
 	struct starpu_omp_region *parallel_region = generating_task->owner_region;
@@ -1173,7 +1172,7 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 	int is_untied = 0;
 	int ret;
 
-	if (!if_clause)
+	if (!attr->if_clause)
 	{
 		is_undeferred = 1;
 	}
@@ -1182,7 +1181,7 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 		is_final = 1;
 		is_included = 1;
 	}
-	else if (final_clause)
+	else if (attr->final_clause)
 	{
 		is_final = 1;
 	}
@@ -1190,7 +1189,7 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 	{
 		is_undeferred = 1;
 	}
-	if ((is_undeferred || is_included) & mergeable_clause)
+	if ((is_undeferred || is_included) & attr->mergeable_clause)
 	{
 		is_merged = 1;
 	}
@@ -1198,40 +1197,40 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 	{
 		/* note: no need to backup/restore ICVs for merged tasks, merged tasks use the data environment of the caller */
 		unsigned i;
-		for (i = 0; i < _task_region_cl->nbuffers; i++)
+		for (i = 0; i < attr->cl.nbuffers; i++)
 		{
-			ret = starpu_data_acquire(handles[i], _task_region_cl->modes[i]);
+			ret = starpu_data_acquire(attr->handles[i], attr->cl.modes[i]);
 			STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire");
 		}
-		void (*f)(void **starpu_buffers, void *starpu_cl_arg) = _task_region_cl->cpu_funcs[0];
-		f((void**)handles, cl_arg);
-		for (i = 0; i < _task_region_cl->nbuffers; i++)
+		void (*f)(void **starpu_buffers, void *starpu_cl_arg) = attr->cl.cpu_funcs[0];
+		f((void**)attr->handles, attr->cl_arg);
+		for (i = 0; i < attr->cl.nbuffers; i++)
 		{
-			starpu_data_release(handles[i]);
+			starpu_data_release(attr->handles[i]);
 		}
-		if (cl_arg_free)
+		if (attr->cl_arg_free)
 		{
-			free(cl_arg);
+			free(attr->cl_arg);
 		}
 	}
 	else if (is_included)
 	{
 		/* TODO: backup current ICVs and setup new ICVs for the included task */
 		unsigned i;
-		for (i = 0; i < _task_region_cl->nbuffers; i++)
+		for (i = 0; i < attr->cl.nbuffers; i++)
 		{
-			ret = starpu_data_acquire(handles[i], _task_region_cl->modes[i]);
+			ret = starpu_data_acquire(attr->handles[i], attr->cl.modes[i]);
 			STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire");
 		}
-		void (*f)(void **starpu_buffers, void *starpu_cl_arg) = _task_region_cl->cpu_funcs[0];
-		f((void**)handles, cl_arg);
-		for (i = 0; i < _task_region_cl->nbuffers; i++)
+		void (*f)(void **starpu_buffers, void *starpu_cl_arg) = attr->cl.cpu_funcs[0];
+		f((void**)attr->handles, attr->cl_arg);
+		for (i = 0; i < attr->cl.nbuffers; i++)
 		{
-			starpu_data_release(handles[i]);
+			starpu_data_release(attr->handles[i]);
 		}
-		if (cl_arg_free)
+		if (attr->cl_arg_free)
 		{
-			free(cl_arg);
+			free(attr->cl_arg);
 		}
 		/* TODO: restore backuped ICVs */
 	}
@@ -1239,8 +1238,8 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 	{
 		struct starpu_omp_task *generated_task =
 			create_omp_task_struct(generating_task, NULL, parallel_region, 0);
-		generated_task->cl = *_task_region_cl;
-		if (untied_clause)
+		generated_task->cl = attr->cl;
+		if (attr->untied_clause)
 		{
 			is_untied = 1;
 		}
@@ -1264,14 +1263,14 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 
 		generated_task->starpu_task = starpu_task_create();
 		generated_task->starpu_task->cl = &generated_task->cl;
-		generated_task->starpu_task->cl_arg = cl_arg;
-		generated_task->starpu_task->cl_arg_size = cl_arg_size;
-		generated_task->starpu_task->cl_arg_free = cl_arg_free;
+		generated_task->starpu_task->cl_arg = attr->cl_arg;
+		generated_task->starpu_task->cl_arg_size = attr->cl_arg_size;
+		generated_task->starpu_task->cl_arg_free = attr->cl_arg_free;
 		{
 			unsigned i;
 			for (i = 0; i < generated_task->cl.nbuffers; i++)
 			{
-				generated_task->starpu_task->handles[i] = handles[i];
+				generated_task->starpu_task->handles[i] = attr->handles[i];
 			}
 		}
 		generated_task->starpu_task->omp_task = generated_task;
@@ -1287,6 +1286,10 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 		{
 			(void)STARPU_ATOMIC_ADD(&generated_task->task_group->descendent_task_count, 1);
 		}
+
+		/* do not use the attribute struct afterward as it may become out of scope */
+		attr = NULL;
+
 		if (is_undeferred)
 		{
 			_starpu_task_prepare_for_continuation();

+ 6 - 9
tests/openmp/parallel_01.c

@@ -49,17 +49,14 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 12 - 19
tests/openmp/parallel_02.c

@@ -49,38 +49,31 @@ void parallel_region_2_f(void *buffers[], void *args)
 	printf("[tid %p] parallel region 2: task thread = %d\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_2_cl =
-{
-	.cpu_funcs    = { parallel_region_2_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_1_f(void *buffers[], void *args)
 {
 	(void) buffers;
 	(void) args;
 	int worker_id;
 	pthread_t tid;
+	starpu_omp_parallel_region_attr_t attr;
 	tid = pthread_self();
 	worker_id = starpu_worker_get_id();
 	printf("[tid %p] parallel region 1: task thread = %d\n", (void *)tid, worker_id);
-
-	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_2_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 }
 
-static struct starpu_codelet parallel_region_1_cl =
-{
-	.cpu_funcs    = { parallel_region_1_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_1_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 7 - 10
tests/openmp/parallel_03.c

@@ -49,18 +49,15 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 6 - 9
tests/openmp/parallel_barrier_01.c

@@ -56,19 +56,16 @@ void parallel_region_f(void *buffers[], void *args)
 	starpu_omp_barrier();
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
 	pthread_t tid;
+	starpu_omp_parallel_region_attr_t attr;
 	tid = pthread_self();
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 7 - 10
tests/openmp/parallel_critical_01.c

@@ -64,22 +64,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_critical_inline_01.c

@@ -67,22 +67,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_critical_named_01.c

@@ -74,22 +74,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_critical_named_inline_01.c

@@ -67,22 +67,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 19 - 54
tests/openmp/parallel_for_01.c

@@ -67,14 +67,6 @@ void parallel_region_1_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"static chunk", NB_ITERS, CHUNK, starpu_omp_sched_static, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_1_cl =
-{
-	.cpu_funcs    = { parallel_region_1_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_2_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -87,14 +79,6 @@ void parallel_region_2_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"static nochunk", NB_ITERS, 0, starpu_omp_sched_static, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_2_cl =
-{
-	.cpu_funcs    = { parallel_region_2_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_3_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -107,14 +91,6 @@ void parallel_region_3_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"dynamic chunk", NB_ITERS, CHUNK, starpu_omp_sched_dynamic, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_3_cl =
-{
-	.cpu_funcs    = { parallel_region_3_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_4_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -127,14 +103,6 @@ void parallel_region_4_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"dynamic nochunk", NB_ITERS, 0, starpu_omp_sched_dynamic, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_4_cl =
-{
-	.cpu_funcs    = { parallel_region_4_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_5_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -147,14 +115,6 @@ void parallel_region_5_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_5_cl =
-{
-	.cpu_funcs    = { parallel_region_5_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_6_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -167,14 +127,6 @@ void parallel_region_6_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 0);
 }
 
-static struct starpu_codelet parallel_region_6_cl =
-{
-	.cpu_funcs    = { parallel_region_6_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 static void clear_array(void)
 {
 	memset(array, 0, NB_ITERS*sizeof(unsigned long long));
@@ -194,30 +146,43 @@ static void check_array(void)
 		exit(1);
 	}
 }
+
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
+
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_1_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_2_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_3_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_4_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_5_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_6_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 	return 0;
 }

+ 7 - 9
tests/openmp/parallel_for_02.c

@@ -53,7 +53,7 @@ void for_g(unsigned long long i, unsigned long long nb_i, void *arg)
 	}
 }
 
-void parallel_region_1_f(void *buffers[], void *args)
+void parallel_region_f(void *buffers[], void *args)
 {
 	(void) buffers;
 	(void) args;
@@ -77,16 +77,14 @@ void parallel_region_1_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 0, 1);
 }
 
-static struct starpu_codelet parallel_region_1_cl =
-{
-	.cpu_funcs    = { parallel_region_1_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 19 - 55
tests/openmp/parallel_for_ordered_01.c

@@ -77,14 +77,6 @@ void parallel_region_1_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"static chunk", NB_ITERS, CHUNK, starpu_omp_sched_static, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_1_cl =
-{
-	.cpu_funcs    = { parallel_region_1_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_2_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -97,14 +89,6 @@ void parallel_region_2_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"static nochunk", NB_ITERS, 0, starpu_omp_sched_static, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_2_cl =
-{
-	.cpu_funcs    = { parallel_region_2_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_3_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -117,14 +101,6 @@ void parallel_region_3_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"dynamic chunk", NB_ITERS, CHUNK, starpu_omp_sched_dynamic, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_3_cl =
-{
-	.cpu_funcs    = { parallel_region_3_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_4_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -137,14 +113,6 @@ void parallel_region_4_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"dynamic nochunk", NB_ITERS, 0, starpu_omp_sched_dynamic, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_4_cl =
-{
-	.cpu_funcs    = { parallel_region_4_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_5_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -157,14 +125,6 @@ void parallel_region_5_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_5_cl =
-{
-	.cpu_funcs    = { parallel_region_5_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 void parallel_region_6_f(void *buffers[], void *args)
 {
 	(void) buffers;
@@ -177,14 +137,6 @@ void parallel_region_6_f(void *buffers[], void *args)
 	starpu_omp_for(for_g, (void*)"guided nochunk", NB_ITERS, 0, starpu_omp_sched_guided, 1, 0);
 }
 
-static struct starpu_codelet parallel_region_6_cl =
-{
-	.cpu_funcs    = { parallel_region_6_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 static void clear_array(void)
 {
 	memset(array, 0, NB_ITERS*sizeof(unsigned long long));
@@ -204,31 +156,43 @@ static void check_array(void)
 		exit(1);
 	}
 }
+
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
+
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_1_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
-	return 0;
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_2_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_3_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_4_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_5_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL, 0, 0, 1);
+	attr.cl.cpu_funcs[0] = parallel_region_6_f;
+	starpu_omp_parallel_region(&attr);
 	check_array();
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_master_01.c

@@ -64,22 +64,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_master_inline_01.c

@@ -58,22 +58,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 9
tests/openmp/parallel_sections_01.c

@@ -47,7 +47,7 @@ void f(void *arg)
 	printf("[tid %p] task thread = %d, section [%s]\n", (void *)tid, worker_id, (const char *)arg);
 }
 
-void parallel_region_1_f(void *buffers[], void *args)
+void parallel_region_f(void *buffers[], void *args)
 {
 	(void) buffers;
 	(void) args;
@@ -93,16 +93,14 @@ void parallel_region_1_f(void *buffers[], void *args)
 	starpu_omp_sections(4, section_f, section_args, 0);
 }
 
-static struct starpu_codelet parallel_region_1_cl =
-{
-	.cpu_funcs    = { parallel_region_1_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 7 - 10
tests/openmp/parallel_single_inline_01.c

@@ -75,22 +75,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_single_nowait_01.c

@@ -64,22 +64,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 7 - 10
tests/openmp/parallel_single_wait_01.c

@@ -64,22 +64,19 @@ void parallel_region_f(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d -- parallel <--\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0
-
-};
-
 int
 main (int argc, char *argv[]) {
+	starpu_omp_parallel_region_attr_t attr;
 	pthread_t tid;
 	tid = pthread_self();
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region(&attr);
 	printf("<main>\n");
 	return 0;
 }

+ 18 - 27
tests/openmp/task_01.c

@@ -49,48 +49,39 @@ void task_region_g(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d: explicit task \"g\"\n", (void *)tid, worker_id);
 }
 
-static struct starpu_codelet task_region_cl =
-{
-	.cpu_funcs    = { task_region_g, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
-
 void parallel_region_f(void *buffers[], void *args)
 {
 	(void) buffers;
 	(void) args;
 	int worker_id;
 	pthread_t tid;
+	starpu_omp_task_region_attr_t attr;
 
 	tid = pthread_self();
 	worker_id = starpu_worker_get_id();
 	printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id);
 	
-	/*
-	 * if_clause: 1
-	 * final_clause: 0
-	 * untied_clause: 1
-	 * mergeable_clause: 0
-	 */
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 0, 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 0, 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 0, 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 0, 0, 1, 0, 1, 0);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0]  = task_region_g;
+	attr.cl.where         = STARPU_CPU;
+	attr.if_clause        = 1;
+	attr.final_clause     = 0;
+	attr.untied_clause    = 1;
+	attr.mergeable_clause = 0;
+	starpu_omp_task_region(&attr);
+	starpu_omp_task_region(&attr);
+	starpu_omp_task_region(&attr);
+	starpu_omp_task_region(&attr);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 38 - 27
tests/openmp/taskgroup_01.c

@@ -49,25 +49,25 @@ void task_region_g(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d: explicit task \"g[%d]\"\n", (void *)tid, worker_id, i);
 }
 
-static struct starpu_codelet task_region_cl =
-{
-	.cpu_funcs    = { task_region_g, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
-
 void taskgroup_f(void *arg)
 {
+	starpu_omp_task_region_attr_t attr;
 	int *p_i = (int *)arg;
-	/*
-	 * if_clause: 1
-	 * final_clause: 0
-	 * untied_clause: 1
-	 * mergeable_clause: 0
-	 */
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)(*p_i)++, sizeof(void *), 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)(*p_i)++, sizeof(void *), 0, 1, 0, 1, 0);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0]  = task_region_g;
+	attr.cl.where         = STARPU_CPU;
+	attr.cl_arg_size      = sizeof(void *);
+	attr.cl_arg_free      = 0;
+	attr.if_clause        = 1;
+	attr.final_clause     = 0;
+	attr.untied_clause    = 1;
+	attr.mergeable_clause = 0;
+
+	attr.cl_arg = (void *)(intptr_t)(*p_i)++;
+	starpu_omp_task_region(&attr);
+
+	attr.cl_arg = (void *)(intptr_t)(*p_i)++;
+	starpu_omp_task_region(&attr);
 }
 
 void parallel_region_f(void *buffers[], void *args)
@@ -76,6 +76,7 @@ void parallel_region_f(void *buffers[], void *args)
 	(void) args;
 	int worker_id;
 	pthread_t tid;
+	starpu_omp_task_region_attr_t attr;
 	int i = 0;
 
 	tid = pthread_self();
@@ -88,21 +89,31 @@ void parallel_region_f(void *buffers[], void *args)
 	starpu_omp_taskgroup(taskgroup_f, (void *)&i);
 	printf("[tid %p] task thread = %d: implicit task \"f\": taskgroup\n", (void *)tid, worker_id);
 
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
-}
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0]  = task_region_g;
+	attr.cl.where         = STARPU_CPU;
+	attr.cl_arg_size      = sizeof(void *);
+	attr.cl_arg_free      = 0;
+	attr.if_clause        = 1;
+	attr.final_clause     = 0;
+	attr.untied_clause    = 1;
+	attr.mergeable_clause = 0;
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
+
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
+}
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif

+ 29 - 29
tests/openmp/taskwait_01.c

@@ -49,57 +49,57 @@ void task_region_g(void *buffers[], void *args)
 	printf("[tid %p] task thread = %d: explicit task \"g[%d]\"\n", (void *)tid, worker_id, i);
 }
 
-static struct starpu_codelet task_region_cl =
-{
-	.cpu_funcs    = { task_region_g, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
-
 void parallel_region_f(void *buffers[], void *args)
 {
 	(void) buffers;
 	(void) args;
 	int worker_id;
 	pthread_t tid;
+	starpu_omp_task_region_attr_t attr;
 	int i = 0;
 
 	tid = pthread_self();
 	worker_id = starpu_worker_get_id();
 	printf("[tid %p] task thread = %d: implicit task \"f\"\n", (void *)tid, worker_id);
 	
-	/*
-	 * if_clause: 1
-	 * final_clause: 0
-	 * untied_clause: 1
-	 * mergeable_clause: 0
-	 */
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0]  = task_region_g;
+	attr.cl.where         = STARPU_CPU;
+	attr.cl_arg_size      = sizeof(void *);
+	attr.cl_arg_free      = 0;
+	attr.if_clause        = 1;
+	attr.final_clause     = 0;
+	attr.untied_clause    = 1;
+	attr.mergeable_clause = 0;
+
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
 	starpu_omp_taskwait();
 	printf("[tid %p] task thread = %d: implicit task \"f\": taskwait\n", (void *)tid, worker_id);
 
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
 	starpu_omp_taskwait();
 	printf("[tid %p] task thread = %d: implicit task \"f\": taskwait\n", (void *)tid, worker_id);
 
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, sizeof(void *), 0, 1, 0, 1, 0);
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
+	attr.cl_arg = (void *)(intptr_t)i++;
+	starpu_omp_task_region(&attr);
 }
 
-static struct starpu_codelet parallel_region_cl =
-{
-	.cpu_funcs    = { parallel_region_f, NULL },
-	.where        = STARPU_CPU,
-	.nbuffers     = 0,
-	.model        = NULL
-};
-
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0, 1);
+	starpu_omp_parallel_region_attr_t attr;
+	memset(&attr, 0, sizeof(attr));
+	attr.cl.cpu_funcs[0] = parallel_region_f;
+	attr.cl.where        = STARPU_CPU;
+	attr.if_clause       = 1;
+	starpu_omp_parallel_region(&attr);
 	return 0;
 }
 #endif