|
@@ -32,16 +32,16 @@
|
|
#define PROGNAME "starpu_perfmodel_display"
|
|
#define PROGNAME "starpu_perfmodel_display"
|
|
|
|
|
|
/* display all available models */
|
|
/* display all available models */
|
|
-static int list = 0;
|
|
|
|
|
|
+static int plist = 0;
|
|
/* what kernel ? */
|
|
/* what kernel ? */
|
|
-static char *symbol = NULL;
|
|
|
|
|
|
+static char *psymbol = NULL;
|
|
/* what parameter should be displayed ? (NULL = all) */
|
|
/* what parameter should be displayed ? (NULL = all) */
|
|
-static char *parameter = NULL;
|
|
|
|
|
|
+static char *pparameter = NULL;
|
|
/* which architecture ? (NULL = all)*/
|
|
/* which architecture ? (NULL = all)*/
|
|
-static char *arch = NULL;
|
|
|
|
|
|
+static char *parch = NULL;
|
|
/* should we display a specific footprint ? */
|
|
/* should we display a specific footprint ? */
|
|
-unsigned display_specific_footprint;
|
|
|
|
-uint32_t specific_footprint;
|
|
|
|
|
|
+static unsigned pdisplay_specific_footprint;
|
|
|
|
+static uint32_t pspecific_footprint;
|
|
|
|
|
|
static void usage(char **argv)
|
|
static void usage(char **argv)
|
|
{
|
|
{
|
|
@@ -85,28 +85,28 @@ static void parse_args(int argc, char **argv)
|
|
{
|
|
{
|
|
case 'l':
|
|
case 'l':
|
|
/* list all models */
|
|
/* list all models */
|
|
- list = 1;
|
|
|
|
|
|
+ plist = 1;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 's':
|
|
case 's':
|
|
/* symbol */
|
|
/* symbol */
|
|
- symbol = optarg;
|
|
|
|
|
|
+ psymbol = optarg;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'p':
|
|
case 'p':
|
|
/* parameter (eg. a, b, c, mean, stddev) */
|
|
/* parameter (eg. a, b, c, mean, stddev) */
|
|
- parameter = optarg;
|
|
|
|
|
|
+ pparameter = optarg;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'a':
|
|
case 'a':
|
|
/* architecture (cpu, cuda, gordon) */
|
|
/* architecture (cpu, cuda, gordon) */
|
|
- arch = optarg;
|
|
|
|
|
|
+ parch = optarg;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'f':
|
|
case 'f':
|
|
/* footprint */
|
|
/* footprint */
|
|
- display_specific_footprint = 1;
|
|
|
|
- sscanf(optarg, "%08x", &specific_footprint);
|
|
|
|
|
|
+ pdisplay_specific_footprint = 1;
|
|
|
|
+ sscanf(optarg, "%08x", &pspecific_footprint);
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'h':
|
|
case 'h':
|
|
@@ -125,7 +125,7 @@ static void parse_args(int argc, char **argv)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (!symbol && !list)
|
|
|
|
|
|
+ if (!psymbol && !plist)
|
|
{
|
|
{
|
|
fprintf(stderr, "Incorrect usage, aborting\n");
|
|
fprintf(stderr, "Incorrect usage, aborting\n");
|
|
usage(argv);
|
|
usage(argv);
|
|
@@ -133,19 +133,20 @@ static void parse_args(int argc, char **argv)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void display_history_based_perf_model(struct starpu_per_arch_perfmodel *per_arch_model)
|
|
|
|
|
|
+static
|
|
|
|
+void starpu_perfmodel_print_history_based(struct starpu_per_arch_perfmodel *per_arch_model, char *parameter, uint32_t *footprint, FILE *f)
|
|
{
|
|
{
|
|
struct starpu_history_list *ptr;
|
|
struct starpu_history_list *ptr;
|
|
|
|
|
|
ptr = per_arch_model->list;
|
|
ptr = per_arch_model->list;
|
|
|
|
|
|
if (!parameter && ptr)
|
|
if (!parameter && ptr)
|
|
- fprintf(stderr, "# hash\t\tsize\t\tmean\t\tdev\t\tn\n");
|
|
|
|
|
|
+ fprintf(f, "# hash\t\tsize\t\tmean\t\tdev\t\tn\n");
|
|
|
|
|
|
while (ptr)
|
|
while (ptr)
|
|
{
|
|
{
|
|
struct starpu_history_entry *entry = ptr->entry;
|
|
struct starpu_history_entry *entry = ptr->entry;
|
|
- if (!display_specific_footprint || (entry->footprint == specific_footprint))
|
|
|
|
|
|
+ if (!footprint || entry->footprint == *footprint)
|
|
{
|
|
{
|
|
if (!parameter)
|
|
if (!parameter)
|
|
{
|
|
{
|
|
@@ -173,7 +174,7 @@ static void display_history_based_perf_model(struct starpu_per_arch_perfmodel *p
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void display_perf_model(struct starpu_perfmodel *model, enum starpu_perf_archtype arch, unsigned nimpl)
|
|
|
|
|
|
+static void starpu_perfmodel_print(struct starpu_perfmodel *model, enum starpu_perf_archtype arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *f)
|
|
{
|
|
{
|
|
struct starpu_per_arch_perfmodel *arch_model = &model->per_arch[arch][nimpl];
|
|
struct starpu_per_arch_perfmodel *arch_model = &model->per_arch[arch][nimpl];
|
|
char archname[32];
|
|
char archname[32];
|
|
@@ -181,7 +182,7 @@ static void display_perf_model(struct starpu_perfmodel *model, enum starpu_perf_
|
|
if (arch_model->regression.nsample || arch_model->regression.valid || arch_model->regression.nl_valid || arch_model->list)
|
|
if (arch_model->regression.nsample || arch_model->regression.valid || arch_model->regression.nl_valid || arch_model->list)
|
|
{
|
|
{
|
|
starpu_perfmodel_get_arch_name(arch, archname, 32, nimpl);
|
|
starpu_perfmodel_get_arch_name(arch, archname, 32, nimpl);
|
|
- fprintf(stderr, "performance model for %s\n", archname);
|
|
|
|
|
|
+ fprintf(f, "performance model for %s\n", archname);
|
|
}
|
|
}
|
|
|
|
|
|
if (parameter == NULL)
|
|
if (parameter == NULL)
|
|
@@ -189,34 +190,34 @@ static void display_perf_model(struct starpu_perfmodel *model, enum starpu_perf_
|
|
/* no specific parameter was requested, so we display everything */
|
|
/* no specific parameter was requested, so we display everything */
|
|
if (arch_model->regression.nsample)
|
|
if (arch_model->regression.nsample)
|
|
{
|
|
{
|
|
- fprintf(stderr, "\tRegression : #sample = %d\n", arch_model->regression.nsample);
|
|
|
|
|
|
+ fprintf(f, "\tRegression : #sample = %d\n", arch_model->regression.nsample);
|
|
}
|
|
}
|
|
|
|
|
|
/* Only display the regression model if we could actually build a model */
|
|
/* Only display the regression model if we could actually build a model */
|
|
if (arch_model->regression.valid)
|
|
if (arch_model->regression.valid)
|
|
{
|
|
{
|
|
- fprintf(stderr, "\tLinear: y = alpha size ^ beta\n");
|
|
|
|
- fprintf(stderr, "\t\talpha = %e\n", arch_model->regression.alpha);
|
|
|
|
- fprintf(stderr, "\t\tbeta = %e\n", arch_model->regression.beta);
|
|
|
|
|
|
+ fprintf(f, "\tLinear: y = alpha size ^ beta\n");
|
|
|
|
+ fprintf(f, "\t\talpha = %e\n", arch_model->regression.alpha);
|
|
|
|
+ fprintf(f, "\t\tbeta = %e\n", arch_model->regression.beta);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- //fprintf(stderr, "\tLinear model is INVALID\n");
|
|
|
|
|
|
+ //fprintf(f, "\tLinear model is INVALID\n");
|
|
}
|
|
}
|
|
|
|
|
|
if (arch_model->regression.nl_valid)
|
|
if (arch_model->regression.nl_valid)
|
|
{
|
|
{
|
|
- fprintf(stderr, "\tNon-Linear: y = a size ^b + c\n");
|
|
|
|
- fprintf(stderr, "\t\ta = %e\n", arch_model->regression.a);
|
|
|
|
- fprintf(stderr, "\t\tb = %e\n", arch_model->regression.b);
|
|
|
|
- fprintf(stderr, "\t\tc = %e\n", arch_model->regression.c);
|
|
|
|
|
|
+ fprintf(f, "\tNon-Linear: y = a size ^b + c\n");
|
|
|
|
+ fprintf(f, "\t\ta = %e\n", arch_model->regression.a);
|
|
|
|
+ fprintf(f, "\t\tb = %e\n", arch_model->regression.b);
|
|
|
|
+ fprintf(f, "\t\tc = %e\n", arch_model->regression.c);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- //fprintf(stderr, "\tNon-Linear model is INVALID\n");
|
|
|
|
|
|
+ //fprintf(f, "\tNon-Linear model is INVALID\n");
|
|
}
|
|
}
|
|
|
|
|
|
- display_history_based_perf_model(arch_model);
|
|
|
|
|
|
+ starpu_perfmodel_print_history_based(arch_model, parameter, footprint, f);
|
|
|
|
|
|
#if 0
|
|
#if 0
|
|
char debugname[1024];
|
|
char debugname[1024];
|
|
@@ -267,18 +268,18 @@ static void display_perf_model(struct starpu_perfmodel *model, enum starpu_perf_
|
|
|
|
|
|
if ((strcmp(parameter, "mean") == 0) || (strcmp(parameter, "stddev")))
|
|
if ((strcmp(parameter, "mean") == 0) || (strcmp(parameter, "stddev")))
|
|
{
|
|
{
|
|
- display_history_based_perf_model(arch_model);
|
|
|
|
|
|
+ starpu_perfmodel_print_history_based(arch_model, parameter, footprint, f);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
/* TODO display if it's valid ? */
|
|
/* TODO display if it's valid ? */
|
|
|
|
|
|
- fprintf(stderr, "Unknown parameter requested, aborting.\n");
|
|
|
|
|
|
+ fprintf(f, "Unknown parameter requested, aborting.\n");
|
|
exit(-1);
|
|
exit(-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
|
|
|
|
+static void starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *f)
|
|
{
|
|
{
|
|
if (arch == NULL)
|
|
if (arch == NULL)
|
|
{
|
|
{
|
|
@@ -289,7 +290,7 @@ static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
{
|
|
{
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
{ /* Display all codelets on each arch */
|
|
{ /* Display all codelets on each arch */
|
|
- display_perf_model(model, (enum starpu_perf_archtype) archid, implid);
|
|
|
|
|
|
+ starpu_perfmodel_print(model, (enum starpu_perf_archtype) archid, implid, parameter, footprint, f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -299,7 +300,7 @@ static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
{
|
|
{
|
|
unsigned implid;
|
|
unsigned implid;
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
- display_perf_model(model, STARPU_CPU_DEFAULT,implid); /* Display all codelets on cpu */
|
|
|
|
|
|
+ starpu_perfmodel_print(model, STARPU_CPU_DEFAULT,implid, parameter, footprint, f); /* Display all codelets on cpu */
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -309,13 +310,13 @@ static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
/* For combined CPU workers */
|
|
/* For combined CPU workers */
|
|
if ((k < 1) || (k > STARPU_MAXCPUS))
|
|
if ((k < 1) || (k > STARPU_MAXCPUS))
|
|
{
|
|
{
|
|
- fprintf(stderr, "Invalid CPU size\n");
|
|
|
|
|
|
+ fprintf(f, "Invalid CPU size\n");
|
|
exit(-1);
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
|
|
unsigned implid;
|
|
unsigned implid;
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
- display_perf_model(model, (enum starpu_perf_archtype) (STARPU_CPU_DEFAULT + k - 1), implid);
|
|
|
|
|
|
+ starpu_perfmodel_print(model, (enum starpu_perf_archtype) (STARPU_CPU_DEFAULT + k - 1), implid, parameter, footprint, f);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -329,8 +330,8 @@ static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
{
|
|
{
|
|
char archname[32];
|
|
char archname[32];
|
|
starpu_perfmodel_get_arch_name((enum starpu_perf_archtype) archid, archname, 32, implid);
|
|
starpu_perfmodel_get_arch_name((enum starpu_perf_archtype) archid, archname, 32, implid);
|
|
- fprintf(stderr, "performance model for %s\n", archname);
|
|
|
|
- display_perf_model(model, (enum starpu_perf_archtype) archid, implid);
|
|
|
|
|
|
+ fprintf(f, "performance model for %s\n", archname);
|
|
|
|
+ starpu_perfmodel_print(model, (enum starpu_perf_archtype) archid, implid, parameter, footprint, f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
return;
|
|
@@ -345,20 +346,20 @@ static void display_all_perf_models(struct starpu_perfmodel *model)
|
|
unsigned archid = STARPU_CUDA_DEFAULT+ gpuid;
|
|
unsigned archid = STARPU_CUDA_DEFAULT+ gpuid;
|
|
unsigned implid;
|
|
unsigned implid;
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
- display_perf_model(model, (enum starpu_perf_archtype) archid, implid);
|
|
|
|
|
|
+ starpu_perfmodel_print(model, (enum starpu_perf_archtype) archid, implid, parameter, footprint, f);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if (strcmp(arch, "gordon") == 0)
|
|
if (strcmp(arch, "gordon") == 0)
|
|
{
|
|
{
|
|
- fprintf(stderr, "performance model for gordon\n");
|
|
|
|
|
|
+ fprintf(f, "performance model for gordon\n");
|
|
unsigned implid;
|
|
unsigned implid;
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++)
|
|
- display_perf_model(model, STARPU_GORDON_DEFAULT, implid);
|
|
|
|
|
|
+ starpu_perfmodel_print(model, STARPU_GORDON_DEFAULT, implid, parameter, footprint, f);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- fprintf(stderr, "Unknown architecture requested, aborting.\n");
|
|
|
|
|
|
+ fprintf(f, "Unknown architecture requested, aborting.\n");
|
|
exit(-1);
|
|
exit(-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -372,7 +373,7 @@ int main(int argc, char **argv)
|
|
|
|
|
|
parse_args(argc, argv);
|
|
parse_args(argc, argv);
|
|
|
|
|
|
- if (list)
|
|
|
|
|
|
+ if (plist)
|
|
{
|
|
{
|
|
int ret = starpu_perfmodel_list(stdout);
|
|
int ret = starpu_perfmodel_list(stdout);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -384,13 +385,18 @@ int main(int argc, char **argv)
|
|
else
|
|
else
|
|
{
|
|
{
|
|
struct starpu_perfmodel model;
|
|
struct starpu_perfmodel model;
|
|
- int ret = starpu_perfmodel_load_symbol(symbol, &model);
|
|
|
|
|
|
+ int ret = starpu_perfmodel_load_symbol(psymbol, &model);
|
|
if (ret == 1)
|
|
if (ret == 1)
|
|
{
|
|
{
|
|
- fprintf(stderr, "The performance model for the symbol <%s> could not be loaded\n", symbol);
|
|
|
|
|
|
+ fprintf(stderr, "The performance model for the symbol <%s> could not be loaded\n", psymbol);
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
- display_all_perf_models(&model);
|
|
|
|
|
|
+ uint32_t *footprint = NULL;
|
|
|
|
+ if (pdisplay_specific_footprint == 1)
|
|
|
|
+ {
|
|
|
|
+ footprint = &pspecific_footprint;
|
|
|
|
+ }
|
|
|
|
+ starpu_perfmodel_print_all(&model, parch, pparameter, footprint, stdout);
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|