| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 | /* * This file is part of the StarPU Handbook. * Copyright (C) 2009--2011  Universit@'e de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016  CNRS * Copyright (C) 2011, 2012, 2016 INRIA * See the file version.doxy for copying conditions. *//*! \defgroup API_Performance_Model Performance Model\enum starpu_perfmodel_type\ingroup API_Performance_ModelTODO\var starpu_perfmodel_type::STARPU_PER_ARCH\ingroup API_Performance_ModelApplication-provided per-arch cost model function\var starpu_perfmodel_type::STARPU_COMMON\ingroup API_Performance_ModelApplication-provided common cost model function, with per-arch factor\var starpu_perfmodel_type::STARPU_HISTORY_BASED\ingroup API_Performance_ModelAutomatic history-based cost model\var starpu_perfmodel_type::STARPU_REGRESSION_BASED\ingroup API_Performance_ModelAutomatic linear regression-based cost model  (alpha * size ^ beta)\var starpu_perfmodel_type::STARPU_NL_REGRESSION_BASED\ingroup API_Performance_ModelAutomatic non-linear regression-based cost model (a * size ^ b + c)\var starpu_perfmodel_type::STARPU_MULTIPLE_REGRESSION_BASED\ingroup API_Performance_ModelAutomatic multiple linear regression-based cost model. Application provides parameters, their combinations and exponents\struct starpu_perfmodel_devicetodo\ingroup API_Performance_Model\var enum starpu_worker_archtype starpu_perfmodel_device::typeis the type of the device\var int starpu_perfmodel_device::devidis the identifier of the precise device\var int starpu_perfmodel_device::ncoreis the number of execution in parallel, minus 1\struct starpu_perfmodel_archtodo\ingroup API_Performance_Model\var int starpu_perfmodel_arch::ndevicesis the number of the devices for the given arch\var struct starpu_perfmodel_device *starpu_perfmodel_arch::devicesis the list of the devices for the given arch\struct starpu_perfmodelContains all information about a performance model. At least thetype and symbol fields have to be filled when defining a performancemodel for a codelet. For compatibility, make sure to initialize thewhole structure to zero, either by using explicit memset, or byletting the compiler implicitly do it in e.g. static storage case. Ifnot provided, other fields have to be zero.\ingroup API_Performance_Model\var enum starpu_perfmodel_type starpu_perfmodel::typeis the type of performance model<ul><li>::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED,::STARPU_NL_REGRESSION_BASED: No other fields needs to be provided,this is purely history-based.</li><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.</li><li> ::STARPU_PER_ARCH: either field starpu_perfmodel::arch_cost_function has to befilled with a function that returns the cost in micro-seconds on the arch givenas parameter, or field starpu_perfmodel::per_arch has to befilled with functions which return the cost in micro-seconds.</li><li> ::STARPU_COMMON: field starpu_perfmodel::cost_function has to befilled with a function that returns the cost in micro-seconds on aCPU, timing on other archs will be determined by multiplying by anarch-specific factor.</li></ul>\var const char *starpu_perfmodel::symbolis the symbol name for the performance model, which will be used asfile name to store the model. It must be set otherwise the model willbe ignored.\var double (*starpu_perfmodel::cost_function)(struct starpu_task *, unsigned nimpl)Used by ::STARPU_COMMON: takes a task and implementation number, andmust return a task duration estimation in micro-seconds.\var double (*starpu_perfmodel::arch_cost_function)(struct starpu_task *, struct starpu_perfmodel_arch* arch, unsigned nimpl)Used by ::STARPU_COMMON: takes a task, an arch and implementation number, andmust return a task duration estimation in micro-seconds on that arch.\var size_t (*starpu_perfmodel::size_base)(struct starpu_task *, unsigned nimpl)Used by ::STARPU_HISTORY_BASED, ::STARPU_REGRESSION_BASED and::STARPU_NL_REGRESSION_BASED. If not NULL, takes a task andimplementation number, and returns the size to be used as index to distinguishhistories and as a base for regressions.\var uint32_t (*starpu_perfmodel::footprint)(struct starpu_task *)Used by ::STARPU_HISTORY_BASED. If not NULL, takes a task and returns thefootprint to be used as index to distinguish histories. The default is to usethe starpu_task_data_footprint function.\var unsigned starpu_perfmodel::is_loaded\privateWhether the performance model is already loaded from the disk.\var unsigned starpu_perfmodel::benchmarking\private\var unsigned starpu_perfmodel::is_inittodo\var starpu_perfmodel_state_t starpu_perfmodel::state\private\var const char ** starpu_perfmodel::parameters_names\privateNames of parameters used for multiple linear regression models (M, N, K)\var unsigned starpu_perfmodel::nparameters\privateNumber of parameters used for multiple linear regression models\var unsigned ** starpu_perfmodel::combinations\privateTable of combinations of parameters (and the exponents) used for multiple linear regression models\var unsigned starpu_perfmodel::ncombinations\privateNumber of combination of parameters used for multiple linear regression models\struct starpu_perfmodel_regression_model...\ingroup API_Performance_Model\var double starpu_perfmodel_regression_model::sumlnysum of ln(measured)\var double starpu_perfmodel_regression_model::sumlnxsum of ln(size)\var double starpu_perfmodel_regression_model::sumlnx2sum of ln(size)^2\var unsigned long starpu_perfmodel_regression_model::minxminimum size\var unsigned long starpu_perfmodel_regression_model::maxxmaximum size\var double starpu_perfmodel_regression_model::sumlnxlnysum of ln(size)*ln(measured)\var double starpu_perfmodel_regression_model::alphaestimated = alpha * size ^ beta\var double starpu_perfmodel_regression_model::betaestimated = alpha * size ^ beta\var unsigned starpu_perfmodel_regression_model::validwhether the linear regression model is valid (i.e. enough measures)\var double starpu_perfmodel_regression_model::aestimated = a size ^b + c\var double starpu_perfmodel_regression_model::bestimated = a size ^b + c\var double starpu_perfmodel_regression_model::cestimated = a size ^b + c\var unsigned starpu_perfmodel_regression_model::nl_validwhether the non-linear regression model is valid (i.e. enough measures)\var unsigned starpu_perfmodel_regression_model::nsamplenumber of sample values for non-linear regression\var double starpu_perfmodel_regression_model::coeff[]list of computed coefficients for multiple linear regression model\var double starpu_perfmodel_regression_model::ncoeffnumber of coefficients for multiple linear regression model\var double starpu_perfmodel_regression_model::multi_validwhether the multiple linear regression model is valid\struct starpu_perfmodel_per_archcontains information about the performance model of a givenarch.\ingroup API_Performance_Model\var starpu_perfmodel_per_arch_cost_function starpu_perfmodel_per_arch::cost_functionUsed by ::STARPU_PER_ARCH, must point to functions which take a task,the target arch and implementation number (as mere conveniency, sincethe array is already indexed by these), and must return a taskduration estimation in micro-seconds.\var starpu_perfmodel_per_arch_size_base starpu_perfmodel_per_arch::size_baseSame as in structure starpu_perfmodel, but per-arch, in case itdepends on the architecture-specific implementation.\var struct starpu_perfmodel_history_table *starpu_perfmodel_per_arch::history\privateThe history of performance measurements.\var struct starpu_perfmodel_history_list *starpu_perfmodel_per_arch::list\privateUsed by ::STARPU_HISTORY_BASED, ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED,records all execution history measures.\var struct starpu_perfmodel_regression_model starpu_perfmodel_per_arch::regression\privateUsed by ::STARPU_REGRESSION_BASED, ::STARPU_NL_REGRESSION_BASED and ::STARPU_MULTIPLE_REGRESSION_BASED, contains the estimated factors of theregression.\struct starpu_perfmodel_history_listtodo\ingroup API_Performance_Model\var struct starpu_perfmodel_history_list *starpu_perfmodel_history_list::nexttodo\var struct starpu_perfmodel_history_entry *starpu_perfmodel_history_list::entrytodo\struct starpu_perfmodel_history_entrytodo\ingroup API_Performance_Model\var double starpu_perfmodel_history_entry::meanmean_n = 1/n sum\var double starpu_perfmodel_history_entry::deviationn dev_n = sum2 - 1/n (sum)^2\var double starpu_perfmodel_history_entry::sumsum of samples (in µs)\var double starpu_perfmodel_history_entry::sum2sum of samples^2\var unsigned starpu_perfmodel_history_entry::nsamplenumber of samples\var uint32_t starpu_perfmodel_history_entry::footprintdata footprint\var size_t starpu_perfmodel_history_entry::sizein bytes\var double starpu_perfmodel_history_entry::flopsProvided by the application\fn void starpu_perfmodel_init(struct starpu_perfmodel *model)\ingroup API_Performance_Modeltodo\fn void starpu_perfmodel_free_sampling_directories(void)\ingroup API_Performance_Modelthis function frees internal memory used for sampling directorymanagement. It should only be called by an application which is notcalling starpu_shutdown as this function already calls it. See forexample <c>tools/starpu_perfmodel_display.c</c>.\fn int starpu_perfmodel_load_file(const char *filename, struct starpu_perfmodel *model)\ingroup API_Performance_Modelloads the performance model found in the given file. The model structure has to becompletely zero, and will be filled with the information stored in the given file.\fn int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model)\ingroup API_Performance_Modelloads a given performance model. The model structure has to becompletely zero, and will be filled with the information saved in<c>$STARPU_HOME/.starpu</c>. The function is intended to be used byexternal tools that should read the performance model files.\fn int starpu_perfmodel_unload_model(struct starpu_perfmodel *model)\ingroup API_Performance_Modelunloads the given model which has been previously loadedthrough the function starpu_perfmodel_load_symbol()\fn void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, char *path, size_t maxlen, unsigned nimpl)\ingroup API_Performance_Modelreturns the path to the debugging information for the performance model.\fn char* starpu_perfmodel_get_archtype_name(enum starpu_worker_archtype archtype)\ingroup API_Performance_Modeltodo\fn void starpu_perfmodel_get_arch_name(struct starpu_perfmodel_arch *arch, char *archname, size_t maxlen, unsigned nimpl)\ingroup API_Performance_Modelreturns the architecture name for \p arch\fn struct starpu_perfmodel_arch *starpu_worker_get_perf_archtype(int workerid, unsigned sched_ctx_id)\ingroup API_Performance_Modelreturns the architecture type of a given worker.\fn int starpu_perfmodel_list(FILE *output)\ingroup API_Performance_Modelprints a list of all performance models on \p output\fn void starpu_perfmodel_directory(FILE *output)\ingroup API_Performance_Modelprints the directory name storing performance models on \p output\fn void starpu_perfmodel_print(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output)\ingroup API_Performance_Modeltodo\fn int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output)\ingroup API_Performance_Modeltodo\fn int starpu_perfmodel_print_estimations(struct starpu_perfmodel *model, uint32_t footprint, FILE *output)\ingroup API_Performance_Modeltodo\fn void starpu_bus_print_bandwidth(FILE *f)\ingroup API_Performance_Modelprints a matrix of bus bandwidths on \p f.\fn void starpu_bus_print_affinity(FILE *f)\ingroup API_Performance_Modelprints the affinity devices on \p f.\fn void starpu_bus_print_filenames(FILE *f)\ingroup API_Performance_Modelprints on \p f the name of the files containing the matrix of bus bandwidths, the affinity devices and the latency.\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);\ingroup API_Performance_ModelThis feeds the performance model model with an explicitmeasurement measured (in µs), in addition to measurements done by StarPUitself. This can be useful when the application already has anexisting set of measurements done in good conditions, that StarPUcould benefit from instead of doing on-line measurements. And exampleof use can be seen in \ref PerformanceModelExample.\fn double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node)\ingroup API_Performance_ModelReturn the bandwidth of data transfer between two memory nodes\fn double starpu_transfer_latency(unsigned src_node, unsigned dst_node)\ingroup API_Performance_ModelReturn the latency of data transfer between two memory nodes\fn double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size)\ingroup API_Performance_ModelReturn the estimated time to transfer a given size between two memory nodes.\fn double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, uint32_t footprint)\ingroup API_Performance_ModelReturn the estimated time of a task whose model is named \p and whose footprint is \p footprint*/
 |