Browse Source

- add cl_arg_free to omp_parallel_region/omp_task_region

Olivier Aumage 11 years ago
parent
commit
f2176579d7

+ 2 - 2
include/starpu_openmp.h

@@ -52,7 +52,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 parallel_region_cl_arg) __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) __STARPU_OMP_NOTHROW;
 
 extern void starpu_omp_barrier(void) __STARPU_OMP_NOTHROW;
 
@@ -67,7 +67,7 @@ extern void starpu_omp_critical_inline_begin(const char *name) __STARPU_OMP_NOTH
 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 task_region_cl_arg,
+		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_taskwait(void) __STARPU_OMP_NOTHROW;
 extern void starpu_omp_taskgroup(void (*f)(void *arg), void *arg) __STARPU_OMP_NOTHROW;

+ 18 - 6
src/util/openmp_runtime_support.c

@@ -668,7 +668,7 @@ void starpu_omp_shutdown(void)
 }
 
 void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_region_cl, starpu_data_handle_t *handles,
-		void * const parallel_region_cl_arg)
+		void * const cl_arg, size_t cl_arg_size, unsigned cl_arg_free)
 {
 	struct starpu_omp_thread *master_thread = STARPU_PTHREAD_GETSPECIFIC(omp_thread_key);
 	struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key);
@@ -779,7 +779,9 @@ void starpu_omp_parallel_region(const struct starpu_codelet * const _parallel_re
 				implicit_task->starpu_task->handles[i] = handles[i];
 			}
 		}
-		implicit_task->starpu_task->cl_arg = parallel_region_cl_arg;
+		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->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;
@@ -1147,7 +1149,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 task_region_cl_arg,
+		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)
 {
 	struct starpu_omp_task *generating_task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key);
@@ -1190,11 +1192,15 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 			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, task_region_cl_arg);
+		f((void**)handles, cl_arg);
 		for (i = 0; i < _task_region_cl->nbuffers; i++)
 		{
 			starpu_data_release(handles[i]);
 		}
+		if (cl_arg_free)
+		{
+			free(cl_arg);
+		}
 	}
 	else if (is_included)
 	{
@@ -1206,11 +1212,15 @@ void starpu_omp_task_region(const struct starpu_codelet * const _task_region_cl,
 			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, task_region_cl_arg);
+		f((void**)handles, cl_arg);
 		for (i = 0; i < _task_region_cl->nbuffers; i++)
 		{
 			starpu_data_release(handles[i]);
 		}
+		if (cl_arg_free)
+		{
+			free(cl_arg);
+		}
 		/* TODO: restore backuped ICVs */
 	}
 	else
@@ -1242,7 +1252,9 @@ 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 = task_region_cl_arg;
+		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;
 		{
 			unsigned i;
 			for (i = 0; i < generated_task->cl.nbuffers; i++)

+ 1 - 1
tests/openmp/parallel_01.c

@@ -59,7 +59,7 @@ static struct starpu_codelet parallel_region_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 2 - 2
tests/openmp/parallel_02.c

@@ -67,7 +67,7 @@ void parallel_region_1_f(void *buffers[], void *args)
 	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);
+	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0);
 }
 
 static struct starpu_codelet parallel_region_1_cl =
@@ -80,7 +80,7 @@ static struct starpu_codelet parallel_region_1_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 2 - 2
tests/openmp/parallel_03.c

@@ -59,8 +59,8 @@ static struct starpu_codelet parallel_region_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 1 - 1
tests/openmp/parallel_barrier_01.c

@@ -68,7 +68,7 @@ int
 main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 2 - 2
tests/openmp/parallel_critical_01.c

@@ -77,9 +77,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_critical_inline_01.c

@@ -80,9 +80,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_critical_named_01.c

@@ -87,9 +87,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_critical_named_inline_01.c

@@ -80,9 +80,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 6 - 6
tests/openmp/parallel_for_01.c

@@ -197,27 +197,27 @@ static void check_array(void)
 int
 main (int argc, char *argv[]) {
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL, 0, 0);
 	check_array();
 	return 0;
 }

+ 1 - 1
tests/openmp/parallel_for_02.c

@@ -86,7 +86,7 @@ static struct starpu_codelet parallel_region_1_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 6 - 6
tests/openmp/parallel_for_ordered_01.c

@@ -207,28 +207,28 @@ static void check_array(void)
 int
 main (int argc, char *argv[]) {
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0);
 	check_array();
 	return 0;
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_2_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_3_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_4_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_5_cl, NULL, NULL, 0, 0);
 	check_array();
 
 	clear_array();
-	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_6_cl, NULL, NULL, 0, 0);
 	check_array();
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_master_01.c

@@ -77,9 +77,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_master_inline_01.c

@@ -71,9 +71,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 1 - 1
tests/openmp/parallel_sections_01.c

@@ -102,7 +102,7 @@ static struct starpu_codelet parallel_region_1_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_1_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 2 - 2
tests/openmp/parallel_single_inline_01.c

@@ -88,9 +88,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_single_nowait_01.c

@@ -77,9 +77,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 2 - 2
tests/openmp/parallel_single_wait_01.c

@@ -77,9 +77,9 @@ main (int argc, char *argv[]) {
 	pthread_t tid;
 	tid = pthread_self();
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	printf("<main>\n");
 	return 0;
 }

+ 5 - 5
tests/openmp/task_01.c

@@ -74,10 +74,10 @@ void parallel_region_f(void *buffers[], void *args)
 	 * untied_clause: 1
 	 * mergeable_clause: 0
 	 */
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, NULL, 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);
+	starpu_omp_task_region(&task_region_cl, NULL, NULL, 0, 0, 1, 0, 1, 0);
 }
 
 static struct starpu_codelet parallel_region_cl =
@@ -90,7 +90,7 @@ static struct starpu_codelet parallel_region_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 5 - 5
tests/openmp/taskgroup_01.c

@@ -66,8 +66,8 @@ void taskgroup_f(void *arg)
 	 * untied_clause: 1
 	 * mergeable_clause: 0
 	 */
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)(*p_i)++, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)(*p_i)++, 1, 0, 1, 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);
 }
 
 void parallel_region_f(void *buffers[], void *args)
@@ -88,8 +88,8 @@ 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++, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, 1, 0, 1, 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);
 }
 
 static struct starpu_codelet parallel_region_cl =
@@ -102,7 +102,7 @@ static struct starpu_codelet parallel_region_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif

+ 7 - 7
tests/openmp/taskwait_01.c

@@ -75,18 +75,18 @@ void parallel_region_f(void *buffers[], void *args)
 	 * untied_clause: 1
 	 * mergeable_clause: 0
 	 */
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, 1, 0, 1, 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);
 	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++, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, 1, 0, 1, 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);
 	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++, 1, 0, 1, 0);
-	starpu_omp_task_region(&task_region_cl, NULL, (void *)(intptr_t)i++, 1, 0, 1, 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);
 }
 
 static struct starpu_codelet parallel_region_cl =
@@ -99,7 +99,7 @@ static struct starpu_codelet parallel_region_cl =
 
 int
 main (int argc, char *argv[]) {
-	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL);
+	starpu_omp_parallel_region(&parallel_region_cl, NULL, NULL, 0, 0);
 	return 0;
 }
 #endif