123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /*
- * 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.
- */
|