| 
					
				 | 
			
			
				@@ -0,0 +1,108 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* StarPU --- Runtime system for heterogeneous multicore architectures. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (C) 2014  Inria 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * StarPU is free software; you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * it under the terms of the GNU Lesser General Public License as published by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the Free Software Foundation; either version 2.1 of the License, or (at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * your option) any later version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * StarPU is distributed in the hope that it will be useful, but 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * WITHOUT ANY WARRANTY; without even the implied warranty of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * See the GNU Lesser General Public License in COPYING.LGPL for more details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <pthread.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <starpu.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "../helper.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <stdio.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#if !defined(STARPU_OPENMP) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int main(int argc, char **argv) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return STARPU_TEST_SKIPPED; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+__attribute__((constructor)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void omp_constructor(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ret = starpu_omp_init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_omp_init"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+__attribute__((destructor)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void omp_destructor(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	starpu_omp_shutdown(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void f(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int worker_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pthread_t tid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	tid = pthread_self(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	worker_id = starpu_worker_get_id(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	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) buffers; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(void) args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	void (*section_f[4])(void *); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	void *section_args[4]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int worker_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	pthread_t tid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	tid = pthread_self(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	worker_id = starpu_worker_get_id(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printf("[tid %p] task thread = %d\n", (void *)tid, worker_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_f[0] = f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_f[1] = f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_f[2] = f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_f[3] = f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[0] = (void *)"A"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[1] = (void *)"B"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[2] = (void *)"C"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[3] = (void *)"D"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	starpu_omp_sections(4, section_f, section_args, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[0] = (void *)"E"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[1] = (void *)"F"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[2] = (void *)"G"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[3] = (void *)"H"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	starpu_omp_sections(4, section_f, section_args, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[0] = (void *)"I"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[1] = (void *)"J"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[2] = (void *)"K"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[3] = (void *)"L"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	starpu_omp_sections(4, section_f, section_args, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[0] = (void *)"M"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[1] = (void *)"N"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[2] = (void *)"O"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	section_args[3] = (void *)"P"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	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(¶llel_region_1_cl, NULL, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 |