performance_model.doxy 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*
  2. * This file is part of the StarPU Handbook.
  3. * Copyright (C) 2009--2011 Universit@'e de Bordeaux
  4. * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 CNRS
  5. * Copyright (C) 2011, 2012, 2016 INRIA
  6. * See the file version.doxy for copying conditions.
  7. */
  8. /*! \defgroup API_Performance_Model Performance Model
  9. \enum starpu_perfmodel_type
  10. \ingroup API_Performance_Model
  11. TODO
  12. \var starpu_perfmodel_type::STARPU_PER_ARCH
  13. \ingroup API_Performance_Model
  14. Application-provided per-arch cost model function
  15. \var starpu_perfmodel_type::STARPU_COMMON
  16. \ingroup API_Performance_Model
  17. Application-provided common cost model function, with per-arch factor
  18. \var starpu_perfmodel_type::STARPU_HISTORY_BASED
  19. \ingroup API_Performance_Model
  20. Automatic history-based cost model
  21. \var starpu_perfmodel_type::STARPU_REGRESSION_BASED
  22. \ingroup API_Performance_Model
  23. Automatic linear regression-based cost model (alpha * size ^ beta)
  24. \var starpu_perfmodel_type::STARPU_NL_REGRESSION_BASED
  25. \ingroup API_Performance_Model
  26. Automatic non-linear regression-based cost model (a * size ^ b + c)
  27. \var starpu_perfmodel_type::STARPU_MULTIPLE_REGRESSION_BASED
  28. \ingroup API_Performance_Model
  29. Automatic multiple linear regression-based cost model. Application provides parameters, their combinations and exponents
  30. \struct starpu_perfmodel_device
  31. todo
  32. \ingroup API_Performance_Model
  33. \var enum starpu_worker_archtype starpu_perfmodel_device::type
  34. is the type of the device
  35. \var int starpu_perfmodel_device::devid
  36. is the identifier of the precise device
  37. \var int starpu_perfmodel_device::ncore
  38. is the number of execution in parallel, minus 1
  39. \struct starpu_perfmodel_arch
  40. todo
  41. \ingroup API_Performance_Model
  42. \var int starpu_perfmodel_arch::ndevices
  43. is the number of the devices for the given arch
  44. \var struct starpu_perfmodel_device *starpu_perfmodel_arch::devices
  45. is the list of the devices for the given arch
  46. \struct starpu_perfmodel
  47. Contains all information about a performance model. At least the
  48. type and symbol fields have to be filled when defining a performance
  49. model for a codelet. For compatibility, make sure to initialize the
  50. whole structure to zero, either by using explicit memset, or by
  51. letting the compiler implicitly do it in e.g. static storage case. If
  52. not provided, other fields have to be zero.
  53. \ingroup API_Performance_Model
  54. \var enum starpu_perfmodel_type starpu_perfmodel::type
  55. is the type of performance model
  56. <ul>
  57. <li>::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED,
  58. ::STARPU_NL_REGRESSION_BASED: No other fields needs to be provided,
  59. this is purely history-based.
  60. </li>
  61. <li> ::STARPU_MULTIPLE_REGRESSION_BASED: Need to provide fields starpu_perfmodel::nparameters (number of different parameters), starpu_perfmodel::ncombinations (number of parameters combinations-tuples) and table starpu_perfmodel::combinations which defines exponents of the equation. Function cl_perf_func also needs to define how to extract parameters from the task.
  62. </li>
  63. <li> ::STARPU_PER_ARCH: either field starpu_perfmodel::arch_cost_function has to be
  64. filled with a function that returns the cost in micro-seconds on the arch given
  65. as parameter, or field starpu_perfmodel::per_arch has to be
  66. filled with functions which return the cost in micro-seconds.
  67. </li>
  68. <li> ::STARPU_COMMON: field starpu_perfmodel::cost_function has to be
  69. filled with a function that returns the cost in micro-seconds on a
  70. CPU, timing on other archs will be determined by multiplying by an
  71. arch-specific factor.
  72. </li>
  73. </ul>
  74. \var const char *starpu_perfmodel::symbol
  75. is the symbol name for the performance model, which will be used as
  76. file name to store the model. It must be set otherwise the model will
  77. be ignored.
  78. \var double (*starpu_perfmodel::cost_function)(struct starpu_task *, unsigned nimpl)
  79. Used by ::STARPU_COMMON: takes a task and implementation number, and
  80. must return a task duration estimation in micro-seconds.
  81. \var double (*starpu_perfmodel::arch_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch* arch, unsigned nimpl)
  82. Used by ::STARPU_COMMON: takes a task, an arch and implementation number, and
  83. must return a task duration estimation in micro-seconds on that arch.
  84. \var size_t (*starpu_perfmodel::size_base)(struct starpu_task *, unsigned nimpl)
  85. Used by ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED and
  86. ::STARPU_NL_REGRESSION_BASED. If not NULL, takes a task and
  87. implementation number, and returns the size to be used as index to distinguish
  88. histories and as a base for regressions.
  89. \var uint32_t (*starpu_perfmodel::footprint)(struct starpu_task *)
  90. Used by ::STARPU_HISTORY_BASED. If not NULL, takes a task and returns the
  91. footprint to be used as index to distinguish histories. The default is to use
  92. the starpu_task_data_footprint function.
  93. \var unsigned starpu_perfmodel::is_loaded
  94. \private
  95. Whether the performance model is already loaded from the disk.
  96. \var unsigned starpu_perfmodel::benchmarking
  97. \private
  98. \var unsigned starpu_perfmodel::is_init
  99. todo
  100. \var starpu_perfmodel_state_t starpu_perfmodel::state
  101. \private
  102. \var const char ** starpu_perfmodel::parameters_names
  103. \private
  104. Names of parameters used for multiple linear regression models (M, N, K)
  105. \var unsigned starpu_perfmodel::nparameters
  106. \private
  107. Number of parameters used for multiple linear regression models
  108. \var unsigned ** starpu_perfmodel::combinations
  109. \private
  110. Table of combinations of parameters (and the exponents) used for multiple linear regression models
  111. \var unsigned starpu_perfmodel::ncombinations
  112. \private
  113. Number of combination of parameters used for multiple linear regression models
  114. \struct starpu_perfmodel_regression_model
  115. ...
  116. \ingroup API_Performance_Model
  117. \var double starpu_perfmodel_regression_model::sumlny
  118. sum of ln(measured)
  119. \var double starpu_perfmodel_regression_model::sumlnx
  120. sum of ln(size)
  121. \var double starpu_perfmodel_regression_model::sumlnx2
  122. sum of ln(size)^2
  123. \var unsigned long starpu_perfmodel_regression_model::minx
  124. minimum size
  125. \var unsigned long starpu_perfmodel_regression_model::maxx
  126. maximum size
  127. \var double starpu_perfmodel_regression_model::sumlnxlny
  128. sum of ln(size)*ln(measured)
  129. \var double starpu_perfmodel_regression_model::alpha
  130. estimated = alpha * size ^ beta
  131. \var double starpu_perfmodel_regression_model::beta
  132. estimated = alpha * size ^ beta
  133. \var unsigned starpu_perfmodel_regression_model::valid
  134. whether the linear regression model is valid (i.e. enough measures)
  135. \var double starpu_perfmodel_regression_model::a
  136. estimated = a size ^b + c
  137. \var double starpu_perfmodel_regression_model::b
  138. estimated = a size ^b + c
  139. \var double starpu_perfmodel_regression_model::c
  140. estimated = a size ^b + c
  141. \var unsigned starpu_perfmodel_regression_model::nl_valid
  142. whether the non-linear regression model is valid (i.e. enough measures)
  143. \var unsigned starpu_perfmodel_regression_model::nsample
  144. number of sample values for non-linear regression
  145. \var double starpu_perfmodel_regression_model::coeff[]
  146. list of computed coefficients for multiple linear regression model
  147. \var double starpu_perfmodel_regression_model::ncoeff
  148. number of coefficients for multiple linear regression model
  149. \var double starpu_perfmodel_regression_model::multi_valid
  150. whether the multiple linear regression model is valid
  151. \struct starpu_perfmodel_per_arch
  152. contains information about the performance model of a given
  153. arch.
  154. \ingroup API_Performance_Model
  155. \var starpu_perfmodel_per_arch_cost_function starpu_perfmodel_per_arch::cost_function
  156. Used by ::STARPU_PER_ARCH, must point to functions which take a task,
  157. the target arch and implementation number (as mere conveniency, since
  158. the array is already indexed by these), and must return a task
  159. duration estimation in micro-seconds.
  160. \var starpu_perfmodel_per_arch_size_base starpu_perfmodel_per_arch::size_base
  161. Same as in structure starpu_perfmodel, but per-arch, in case it
  162. depends on the architecture-specific implementation.
  163. \var struct starpu_perfmodel_history_table *starpu_perfmodel_per_arch::history
  164. \private
  165. The history of performance measurements.
  166. \var struct starpu_perfmodel_history_list *starpu_perfmodel_per_arch::list
  167. \private
  168. Used by ::STARPU_HISTORY_BASED, ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED,
  169. records all execution history measures.
  170. \var struct starpu_perfmodel_regression_model starpu_perfmodel_per_arch::regression
  171. \private
  172. Used by ::STARPU_REGRESSION_BASED,
  173. ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED, contains the estimated factors of the
  174. regression.
  175. \struct starpu_perfmodel_history_list
  176. todo
  177. \ingroup API_Performance_Model
  178. \var struct starpu_perfmodel_history_list *starpu_perfmodel_history_list::next
  179. todo
  180. \var struct starpu_perfmodel_history_entry *starpu_perfmodel_history_list::entry
  181. todo
  182. \struct starpu_perfmodel_history_entry
  183. todo
  184. \ingroup API_Performance_Model
  185. \var double starpu_perfmodel_history_entry::mean
  186. mean_n = 1/n sum
  187. \var double starpu_perfmodel_history_entry::deviation
  188. n dev_n = sum2 - 1/n (sum)^2
  189. \var double starpu_perfmodel_history_entry::sum
  190. sum of samples (in µs)
  191. \var double starpu_perfmodel_history_entry::sum2
  192. sum of samples^2
  193. \var unsigned starpu_perfmodel_history_entry::nsample
  194. number of samples
  195. \var uint32_t starpu_perfmodel_history_entry::footprint
  196. data footprint
  197. \var size_t starpu_perfmodel_history_entry::size
  198. in bytes
  199. \var double starpu_perfmodel_history_entry::flops
  200. Provided by the application
  201. \fn void starpu_perfmodel_init(struct starpu_perfmodel *model)
  202. \ingroup API_Performance_Model
  203. todo
  204. \fn void starpu_perfmodel_free_sampling_directories(void)
  205. \ingroup API_Performance_Model
  206. this function frees internal memory used for sampling directory
  207. management. It should only be called by an application which is not
  208. calling starpu_shutdown as this function already calls it. See for
  209. example <c>tools/starpu_perfmodel_display.c</c>.
  210. \fn int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model)
  211. \ingroup API_Performance_Model
  212. loads the performance model found in the given file. The model structure has to be
  213. completely zero, and will be filled with the information stored in the given file.
  214. \fn int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model)
  215. \ingroup API_Performance_Model
  216. loads a given performance model. The model structure has to be
  217. completely zero, and will be filled with the information saved in
  218. <c>$STARPU_HOME/.starpu</c>. The function is intended to be used by
  219. external tools that should read the performance model files.
  220. \fn int starpu_perfmodel_unload_model(struct starpu_perfmodel *model)
  221. \ingroup API_Performance_Model
  222. unloads the given model which has been previously loaded
  223. through the function starpu_perfmodel_load_symbol()
  224. \fn void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, char *path, size_t maxlen, unsigned nimpl)
  225. \ingroup API_Performance_Model
  226. returns the path to the debugging information for the performance model.
  227. \fn char* starpu_perfmodel_get_archtype_name(enum starpu_worker_archtype archtype)
  228. \ingroup API_Performance_Model
  229. todo
  230. \fn void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch *arch, char *archname, size_t maxlen, unsigned nimpl)
  231. \ingroup API_Performance_Model
  232. returns the architecture name for \p arch
  233. \fn struct starpu_perfmodel_arch *starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id)
  234. \ingroup API_Performance_Model
  235. returns the architecture type of a given worker.
  236. \fn int starpu_perfmodel_list(FILE *output)
  237. \ingroup API_Performance_Model
  238. prints a list of all performance models on \p output
  239. \fn void starpu_perfmodel_directory(FILE *output)
  240. \ingroup API_Performance_Model
  241. prints the directory name storing performance models on \p output
  242. \fn void starpu_perfmodel_print(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output)
  243. \ingroup API_Performance_Model
  244. todo
  245. \fn int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output)
  246. \ingroup API_Performance_Model
  247. todo
  248. \fn int starpu_perfmodel_print_estimations(struct starpu_perfmodel *model, uint32_t footprint, FILE *output)
  249. \ingroup API_Performance_Model
  250. todo
  251. \fn void starpu_bus_print_bandwidth(FILE *f)
  252. \ingroup API_Performance_Model
  253. prints a matrix of bus bandwidths on \p f.
  254. \fn void starpu_bus_print_affinity(FILE *f)
  255. \ingroup API_Performance_Model
  256. prints the affinity devices on \p f.
  257. \fn void starpu_bus_print_filenames(FILE *f)
  258. \ingroup API_Performance_Model
  259. prints on \p f the name of the files containing the matrix of bus bandwidths, the affinity devices and the latency.
  260. \fn void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned cpuid, unsigned nimpl, double measured);
  261. \ingroup API_Performance_Model
  262. This feeds the performance model model with an explicit
  263. measurement measured (in µs), in addition to measurements done by StarPU
  264. itself. This can be useful when the application already has an
  265. existing set of measurements done in good conditions, that StarPU
  266. could benefit from instead of doing on-line measurements. And example
  267. of use can be seen in \ref PerformanceModelExample.
  268. \fn double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node)
  269. \ingroup API_Performance_Model
  270. Return the bandwidth of data transfer between two memory nodes
  271. \fn double starpu_transfer_latency(unsigned src_node, unsigned dst_node)
  272. \ingroup API_Performance_Model
  273. Return the latency of data transfer between two memory nodes
  274. \fn double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size)
  275. \ingroup API_Performance_Model
  276. Return the estimated time to transfer a given size between two memory nodes.
  277. \fn double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, uint32_t footprint)
  278. \ingroup API_Performance_Model
  279. Return the estimated time of a task whose model is named \p and whose footprint is \p footprint
  280. */