mpi.doxy 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * This file is part of the StarPU Handbook.
  3. * Copyright (C) 2009--2011 Universit@'e de Bordeaux 1
  4. * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
  5. * Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique
  6. * See the file version.doxy for copying conditions.
  7. */
  8. /*! \defgroup API_MPI_Support MPI Support
  9. @name Initialisation
  10. \ingroup API_MPI_Support
  11. \fn int starpu_mpi_init (int *argc, char ***argv, int initialize_mpi)
  12. \ingroup API_MPI_Support
  13. Initializes the starpumpi library. \p initialize_mpi indicates if MPI
  14. should be initialized or not by StarPU. If the value is not 0, MPI
  15. will be initialized by calling <c>MPI_Init_Thread(argc, argv,
  16. MPI_THREAD_SERIALIZED, ...)</c>.
  17. \fn int starpu_mpi_initialize (void)
  18. \deprecated
  19. \ingroup API_MPI_Support
  20. This function has been made deprecated. One should use instead the
  21. function starpu_mpi_init(). This function does not call MPI_Init(), it
  22. should be called beforehand.
  23. \fn int starpu_mpi_initialize_extended (int *rank, int *world_size)
  24. \deprecated
  25. \ingroup API_MPI_Support
  26. This function has been made deprecated. One should use instead the
  27. function starpu_mpi_init(). MPI will be initialized by starpumpi by
  28. calling <c>MPI_Init_Thread(argc, argv, MPI_THREAD_SERIALIZED,
  29. ...)</c>.
  30. \fn int starpu_mpi_shutdown (void)
  31. \ingroup API_MPI_Support
  32. Cleans the starpumpi library. This must be called between calling
  33. starpu_mpi functions and starpu_shutdown(). MPI_Finalize() will be
  34. called if StarPU-MPI has been initialized by starpu_mpi_init().
  35. \fn void starpu_mpi_comm_amounts_retrieve (size_t *comm_amounts)
  36. \ingroup API_MPI_Support
  37. Retrieve the current amount of communications from the current node in
  38. the array \p comm_amounts which must have a size greater or equal to
  39. the world size. Communications statistics must be enabled (see
  40. STARPU_COMM_STATS).
  41. @name Communication
  42. \ingroup API_MPI_Support
  43. \fn int starpu_mpi_send (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm)
  44. \ingroup API_MPI_Support
  45. Performs a standard-mode, blocking send of \p data_handle to the node
  46. \p dest using the message tag \p mpi_tag within the communicator \p
  47. comm.
  48. \fn int starpu_mpi_recv (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status)
  49. \ingroup API_MPI_Support
  50. Performs a standard-mode, blocking receive in \p data_handle from the
  51. node \p source using the message tag \p mpi_tag within the
  52. communicator \p comm.
  53. \fn int starpu_mpi_isend (starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm)
  54. \ingroup API_MPI_Support
  55. Posts a standard-mode, non blocking send of \p data_handle to the node
  56. \p dest using the message tag \p mpi_tag within the communicator \p
  57. comm. After the call, the pointer to the request \p req can be used to
  58. test or to wait for the completion of the communication.
  59. \fn int starpu_mpi_irecv (starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm)
  60. \ingroup API_MPI_Support
  61. Posts a nonblocking receive in \p data_handle from the node \p source
  62. using the message tag \p mpi_tag within the communicator \p comm.
  63. After the call, the pointer to the request \p req can be used to test
  64. or to wait for the completion of the communication.
  65. \fn int starpu_mpi_isend_detached (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg)
  66. \ingroup API_MPI_Support
  67. Posts a standard-mode, non blocking send of \p data_handle to the node
  68. \p dest using the message tag \p mpi_tag within the communicator \p
  69. comm. On completion, the \p callback function is called with the
  70. argument \p arg.
  71. Similarly to the pthread detached functionality, when a detached
  72. communication completes, its resources are automatically released back
  73. to the system, there is no need to test or to wait for the completion
  74. of the request.
  75. \fn int starpu_mpi_irecv_detached (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg)
  76. \ingroup API_MPI_Support
  77. Posts a nonblocking receive in \p data_handle from the node \p source
  78. using the message tag \p mpi_tag within the communicator \p comm. On
  79. completion, the \p callback function is called with the argument \p
  80. arg.
  81. Similarly to the pthread detached functionality, when a detached
  82. communication completes, its resources are automatically released back
  83. to the system, there is no need to test or to wait for the completion
  84. of the request.
  85. \fn int starpu_mpi_wait (starpu_mpi_req *req, MPI_Status *status)
  86. \ingroup API_MPI_Support
  87. Returns when the operation identified by request \p req is complete.
  88. \fn int starpu_mpi_test (starpu_mpi_req *req, int *flag, MPI_Status *status)
  89. \ingroup API_MPI_Support
  90. If the operation identified by \p req is complete, set \p flag to 1.
  91. The \p status object is set to contain information on the completed
  92. operation.
  93. \fn int starpu_mpi_barrier (MPI_Comm comm)
  94. \ingroup API_MPI_Support
  95. Blocks the caller until all group members of the communicator \p comm
  96. have called it.
  97. \fn int starpu_mpi_isend_detached_unlock_tag (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
  98. \ingroup API_MPI_Support
  99. Posts a standard-mode, non blocking send of \p data_handle to the node
  100. \p dest using the message tag \p mpi_tag within the communicator \p
  101. comm. On completion, \p tag is unlocked.
  102. \fn int starpu_mpi_irecv_detached_unlock_tag (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
  103. \ingroup API_MPI_Support
  104. Posts a nonblocking receive in \p data_handle from the node \p source
  105. using the message tag \p mpi_tag within the communicator \p comm. On
  106. completion, \p tag is unlocked.
  107. \fn int starpu_mpi_isend_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)
  108. \ingroup API_MPI_Support
  109. Posts \p array_size standard-mode, non blocking send. Each post sends
  110. the n-th data of the array \p data_handle to the n-th node of the
  111. array \p dest using the n-th message tag of the array \p mpi_tag
  112. within the n-th communicator of the array \p comm. On completion of
  113. the all the requests, \p tag is unlocked.
  114. \fn int starpu_mpi_irecv_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)
  115. \ingroup API_MPI_Support
  116. Posts \p array_size nonblocking receive. Each post receives in the n-th
  117. data of the array \p data_handle from the n-th node of the array \p
  118. source using the n-th message tag of the array \p mpi_tag within the
  119. n-th communicator of the array \p comm. On completion of the all the
  120. requests, \p tag is unlocked.
  121. @name Communication Cache
  122. \ingroup API_MPI_Support
  123. \fn void starpu_mpi_cache_flush (MPI_Comm comm, starpu_data_handle_t data_handle)
  124. \ingroup API_MPI_Support
  125. Clear the send and receive communication cache for the data
  126. \p data_handle. The function has to be called synchronously by all the
  127. MPI nodes. The function does nothing if the cache mechanism is
  128. disabled (see STARPU_MPI_CACHE).
  129. \fn void starpu_mpi_cache_flush_all_data (MPI_Comm comm)
  130. \ingroup API_MPI_Support
  131. Clear the send and receive communication cache for all data. The
  132. function has to be called synchronously by all the MPI nodes. The
  133. function does nothing if the cache mechanism is disabled (see
  134. STARPU_MPI_CACHE).
  135. @name MPI Insert Task
  136. \ingroup API_MPI_Support
  137. \fn int starpu_data_set_tag (starpu_data_handle_t handle, int tag)
  138. \ingroup API_MPI_Support
  139. Tell StarPU-MPI which MPI tag to use when exchanging the data.
  140. \fn int starpu_data_get_tag (starpu_data_handle_t handle)
  141. \ingroup API_MPI_Support
  142. Returns the MPI tag to be used when exchanging the data.
  143. \fn int starpu_data_set_rank (starpu_data_handle_t handle, int rank)
  144. \ingroup API_MPI_Support
  145. Tell StarPU-MPI which MPI node "owns" a given data, that is, the node
  146. which will always keep an up-to-date value, and will by default
  147. execute tasks which write to it.
  148. \fn int starpu_data_get_rank (starpu_data_handle_t handle)
  149. \ingroup API_MPI_Support
  150. Returns the last value set by starpu_data_set_rank().
  151. \def STARPU_EXECUTE_ON_NODE
  152. \ingroup API_MPI_Support
  153. this macro is used when calling starpu_mpi_insert_task(), and must be
  154. followed by a integer value which specified the node on which to
  155. execute the codelet.
  156. \def STARPU_EXECUTE_ON_DATA
  157. \ingroup API_MPI_Support
  158. this macro is used when calling starpu_mpi_insert_task(), and must be
  159. followed by a data handle to specify that the node owning the given
  160. data will execute the codelet.
  161. \fn int starpu_mpi_insert_task (MPI_Comm comm, struct starpu_codelet *codelet, ...)
  162. \ingroup API_MPI_Support
  163. Create and submit a task corresponding to codelet with the following
  164. arguments. The argument list must be zero-terminated.
  165. The arguments following the codelets are the same types as for the
  166. function starpu_insert_task(). The extra argument
  167. ::STARPU_EXECUTE_ON_NODE followed by an integer allows to specify the
  168. MPI node to execute the codelet. It is also possible to specify that
  169. the node owning a specific data will execute the codelet, by using
  170. ::STARPU_EXECUTE_ON_DATA followed by a data handle.
  171. The internal algorithm is as follows:
  172. <ol>
  173. <li>
  174. Find out which MPI node is going to execute the codelet.
  175. <ul>
  176. <li>If there is only one node owning data in W mode, it will be selected;
  177. <li>If there is several nodes owning data in W node, the one selected will be the one having the least data in R mode so as to minimize the amount of data to be transfered;
  178. <li>The argument ::STARPU_EXECUTE_ON_NODE followed by an integer can be used to specify the node;
  179. <li>The argument ::STARPU_EXECUTE_ON_DATA followed by a data handle can be used to specify that the node owing the given data will execute the codelet.
  180. </ul>
  181. </li>
  182. <li>
  183. Send and receive data as requested. Nodes owning data which need to be read by the task are sending them to the MPI node which will execute it. The latter receives them.
  184. </li>
  185. <li>
  186. Execute the codelet. This is done by the MPI node selected in the 1st step of the algorithm.
  187. </li>
  188. <li>
  189. If several MPI nodes own data to be written to, send written data back to their owners.
  190. </li>
  191. </ol>
  192. The algorithm also includes a communication cache mechanism that
  193. allows not to send data twice to the same MPI node, unless the data
  194. has been modified. The cache can be disabled (see STARPU_MPI_CACHE).
  195. \fn void starpu_mpi_get_data_on_node (MPI_Comm comm, starpu_data_handle_t data_handle, int node)
  196. \ingroup API_MPI_Support
  197. Transfer data \p data_handle to MPI node \p node, sending it from its
  198. owner if needed. At least the target node and the owner have to call
  199. the function.
  200. \fn void starpu_mpi_get_data_on_node_detached (MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg)
  201. \ingroup API_MPI_Support
  202. Transfer data \p data_handle to MPI node \p node, sending it from its
  203. owner if needed. At least the target node and the owner have to call
  204. the function. On reception, the \p callback function is called with
  205. the argument \p arg.
  206. @name Collective Operations
  207. \ingroup API_MPI_Support
  208. \fn void starpu_mpi_redux_data (MPI_Comm comm, starpu_data_handle_t data_handle)
  209. \ingroup API_MPI_Support
  210. Perform a reduction on the given data. All nodes send the data to its
  211. owner node which will perform a reduction.
  212. \fn int starpu_mpi_scatter_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg)
  213. \ingroup API_MPI_Support
  214. Scatter data among processes of the communicator based on the
  215. ownership of the data. For each data of the array \p data_handles, the
  216. process \p root sends the data to the process owning this data. Processes
  217. receiving data must have valid data handles to receive them. On
  218. completion of the collective communication, the \p scallback function is
  219. called with the argument \p sarg on the process \p root, the \p
  220. rcallback function is called with the argument \p rarg on any other
  221. process.
  222. \fn int starpu_mpi_gather_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void (*scallback)(void *), void *sarg, void (*rcallback)(void *), void *rarg)
  223. \ingroup API_MPI_Support
  224. Gather data from the different processes of the communicator onto the
  225. process \p root. Each process owning data handle in the array
  226. \p data_handles will send them to the process \p root. The process \p
  227. root must have valid data handles to receive the data. On completion
  228. of the collective communication, the \p rcallback function is called
  229. with the argument \p rarg on the process root, the \p scallback
  230. function is called with the argument \p sarg on any other process.
  231. */