| 
					
				 | 
			
			
				@@ -0,0 +1,223 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This file is part of the StarPU Handbook. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (C) 2014, 2016 INRIA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * See the file version.doxy for copying conditions. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*! \page NativeFortranSupport The StarPU Native Fortran Support 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+StarPU provides the necessary routines and support to natively access 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+most of its functionalities from Fortran 2008+ codes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+All symbols (functions, constants) are defined in <c>fstarpu_mod.f90</c>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Every symbol of the Native Fortran support API is prefixed by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_</c>.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Note: Mixing uses of <c>fstarpu_</c> and <c>starpu_</c> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+symbols in the same Fortran code has unspecified behaviour. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+See \ref APIMIX for a discussion about valid and unspecified 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+combinations. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section Implementation Implementation Details and Specificities 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection Prerequisites Prerequisites 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The Native Fortran support relies on Fortran 2008 specific constructs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+for which no equivalent are available in previous versions of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+standard. It has currently been tested successfully with GNU GFortran >= 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4.9 and the Intel Fortran Compiler >= 2016. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection Configuration Configuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The Native Fortran API is enabled and its companion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_mod.f90</c> Fortran module source file is installed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+by default when a Fortran compiler is found, unless the detected Fortran 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+compiler is known not to support the requirements for the Native Fortran 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+API. The support can be disabled through the configure option \ref 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+disable-fortran "--disable-fortran". Conditional compiled source codes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+may check for the availability of the Native Fortran Support by testing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+whether the preprocessor macro <c>STARPU_HAVE_FC</c> is defined or not. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection Examples Examples 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Several examples using the Native Fortran API are provided in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+StarPU's <c>examples/native_fortran/</c> examples directory, to showcase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the Fortran flavor of various basic and more advanced StarPU features. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection AppCompile Compiling a Native Fortran Application 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The Fortran module <c>fstarpu_mod.f90</c> installed in StarPU's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>include/</c> directory provides all the necessary API definitions. It 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+must be compiled with the same compiler (same vendor, same version) as 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the application itself, and the resulting <c>fstarpu_mod.o</c> object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+file must linked with the application executable. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Each example provided in StarPU's <c>examples/native_fortran/</c> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+examples directory comes with its own dedicated Makefile for out-of-tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+build. Such example Makefiles may be used as starting points for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+building application codes with StarPU. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section Idioms Fortran Translation for Common StarPU API Idioms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+All these examples assume that the standard Fortran module <c>iso_c_binding</c> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+is in use. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Specifying a NULL pointer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_ptr) :: my_ptr  ! variable to store the pointer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        my_ptr = C_NULL_PTR    ! assign standard constant for NULL ptr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Obtaining a pointer to some object: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        real(8), dimension(:), allocatable, target :: va 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_ptr) :: p_va  ! variable to store a pointer to array va 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        p_va = c_loc(va) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Obtaining a pointer to some subroutine: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! pointed routine definition 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        recursive subroutine myfunc () bind(C) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_funptr) :: p_fun  ! variable to store the routine pointer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        p_fun = c_funloc(my_func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Obtaining the size of some object: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        real(8) :: a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        integer(c_size_t) :: sz_a  ! variable to store the size of a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sz_a = c_sizeof(a) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Obtaining the length of an array dimension: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        real(8), dimension(:,:), allocatable, target :: vb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        intger(c_int) :: ln_vb_1  ! variable to store the length of vb's dimension 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        intger(c_int) :: ln_vb_2  ! variable to store the length of vb's dimension 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ln_vb_1 = 1+ubound(vb,1)-lbound(vb,1)  ! get length of dimension 1 of vb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ln_vb_2 = 1+ubound(vb,2)-lbound(vb,2)  ! get length of dimension 2 of vb 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Specifying a string constant: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_ptr) :: my_cl  ! a StarPU codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! set the name of a codelet to string 'my_codele't: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_set_name(my_cl, C_CHAR_"my_codelet"//C_NULL_CHAR) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! note: using the C_CHAR_ prefix and the //C_NULL_CHAR concatenation at the end ensures 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! that the string constant is properly '\0' terminated, and compatible with StarPU's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! internal C routines 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! note: plain Fortran string constants are not '\0' terminated, and as such, must not be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! passed to StarPU routines. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Combining multiple flag constants with a bitwise 'or': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_ptr) :: my_cl  ! a pointer for the codelet structure 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! add a managed buffer to a codelet, specifying both the Read/Write access mode and the Locality hint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_add_buffer(my_cl, FSTARPU_RW.ior.FSTARPU_LOCALITY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section InitExit Uses, Initialization and Shutdown 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The snippet below show an example of minimal StarPU code using the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Native Fortran support. The program should <c>use</c> the standard 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+module <c>iso_c_binding</c> as well as StarPU's <c>fstarpu_mod</c>. The 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+StarPU runtime engine is initialized with a call to function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_init</c>, which returns an integer status of 0 if successful 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+or non-0 otherwise. Eventually, a call to <c>fstarpu_shutdown</c> ends 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the runtime engine and frees all internal StarPU data structures. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\snippet nf_initexit.f90 To be included. You should update doxygen if you see this text. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section InsertTask Fortran Flavor of StarPU's Variadic Insert_task 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Fortran does not have a construction similar to C variadic functions on which 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>starpu_insert_task</c> relies at the time of this writing. However, Fortran's variable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+length arrays of <c>c_ptr</c> elements enable to emulate much of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+convenience of C's variadic functions. This is the approach retained for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+implementing <c>fstarpu_insert_task</c>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The general syntax for using <c>fstarpu_insert_task</c> is as follows: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_insert_task((/ <codelet ptr>       & 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            [, <access mode flags>, <data handle>]*     & 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            [, <argument type constant>, <argument>]*   & 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            , C_NULL_PTR /)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+There is thus a unique array argument <c>(/ ... /)</c> passed to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_insert_task</c> which itself contains the task settings. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Each element of the array must be of type <c>type(c_ptr)</c>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The last element of the array must be <c>C_NULL_PTR</c>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Example extracted from nf_vector.f90: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_insert_task((/ cl_vec,          &    ! codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FSTARPU_R, dh_va,                        &    ! a first data handle 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FSTARPU_RW.ior.FSTARPU_LOCALITY, dh_vb,  &    ! a second data handle 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            C_NULL_PTR /))                                ! no more args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section Structs Functions and Subroutines Expecting Data Structures Arguments 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Several StarPU structures that are expected to be passed to the C API, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+are replaced by function/subroutine wrapper sets to allocate, set fields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and free such structure. This strategy has been prefered over defining 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+native Fortran equivalent of such structures using Fortran's derived 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+types, to avoid potential layout mismatch between C and Fortran StarPU 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+data structures. Examples of such data structures wrappers include 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_conf_allocate</c> and alike, <c>fstarpu_codelet_allocate</c> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and alike, <c>fstarpu_data_filter_allocate</c> and alike. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Here is an example of allocating, filling and deallocating a codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+structure: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\code{.f90} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! a pointer for the codelet structure 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type(c_ptr) :: cl_vec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! allocate an empty codelet structure 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cl_vec = fstarpu_codelet_allocate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! add a CPU implementation function to the codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_add_cpu_func(cl_vec, C_FUNLOC(cl_cpu_func_vec)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! set the codelet name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_set_name(cl_vec, C_CHAR_"my_vec_codelet"//C_NULL_CHAR) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! add a Read-only mode data buffer to the codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_add_buffer(cl_vec, FSTARPU_R) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! add a Read-Write mode data buffer to the codelet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_add_buffer(cl_vec, FSTARPU_RW.ior.FSTARPU_LOCALITY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! [...] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ! free codelet structure 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        call fstarpu_codelet_free(cl_vec) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\section Notes Additional notes about the Native Fortran support 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection OldFortran Using StarPU with older Fortran compilers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+When using older compilers, Fortran applications may still interoperate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+with StarPU using C marshalling functions as exemplified in StarPU's 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>examples/fortran/</c> and <c>examples/fortran90/</c> example 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+directories, though the process will be less convenient. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\subsection APIMIX Valid API Mixes and Language Mixes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Mixing uses of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<c>fstarpu_</c> and <c>starpu_</c> symbols in the same 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Fortran code has unspecified behaviour. Using <c>fstarpu_</c> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+symbols in C code has unspecified behaviour. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+For multi-language applications using both C and Fortran source files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- C source files must use <c>starpu_</c> symbols exclusively 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Fortran sources must uniformly use either <c>fstarpu_</c> symbols 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+exclusively, or <c>starpu_</c> symbols exclusively. Every other 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+combination has unspecified behaviour. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+*/ 
			 |