123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 |
- #include "sched_ctx_utils.h"
- #include <starpu.h>
- #include "sc_hypervisor.h"
- #define NSAMPLES 3
- unsigned size1;
- unsigned size2;
- unsigned nblocks1;
- unsigned nblocks2;
- unsigned cpu1;
- unsigned cpu2;
- unsigned gpu;
- unsigned gpu1;
- unsigned gpu2;
- typedef struct
- {
- unsigned id;
- unsigned ctx;
- int the_other_ctx;
- int *workers;
- int nworkers;
- void (*bench)(float*, unsigned, unsigned);
- unsigned size;
- unsigned nblocks;
- float *mat[NSAMPLES];
- } params;
- typedef struct
- {
- double flops;
- double avg_timing;
- } retvals;
- int first = 1;
- starpu_pthread_mutex_t mut;
- retvals rv[2];
- params p1, p2;
- int it = 0;
- int it2 = 0;
- starpu_pthread_key_t key;
- void init()
- {
- size1 = 4*1024;
- size2 = 4*1024;
- nblocks1 = 16;
- nblocks2 = 16;
- cpu1 = 0;
- cpu2 = 0;
- gpu = 0;
- gpu1 = 0;
- gpu2 = 0;
- rv[0].flops = 0.0;
- rv[1].flops = 0.0;
- rv[1].avg_timing = 0.0;
- rv[1].avg_timing = 0.0;
- p1.ctx = 0;
- p2.ctx = 0;
- p1.id = 0;
- p2.id = 1;
- starpu_pthread_key_create(&key, NULL);
- }
- void update_sched_ctx_timing_results(double flops, double avg_timing)
- {
- unsigned *id = starpu_pthread_getspecific(key);
- rv[*id].flops += flops;
- rv[*id].avg_timing += avg_timing;
- }
- void* start_bench(void *val)
- {
- params *p = (params*)val;
- int i;
- starpu_pthread_setspecific(key, &p->id);
- if(p->ctx != 0)
- starpu_sched_ctx_set_context(&p->ctx);
- for(i = 0; i < NSAMPLES; i++)
- p->bench(p->mat[i], p->size, p->nblocks);
-
-
-
-
-
-
-
-
-
-
- sc_hypervisor_stop_resize(p->the_other_ctx);
- rv[p->id].flops /= NSAMPLES;
- rv[p->id].avg_timing /= NSAMPLES;
- }
- float* construct_matrix(unsigned size)
- {
- float *mat;
- starpu_malloc((void **)&mat, (size_t)size*size*sizeof(float));
- unsigned i,j;
- for (i = 0; i < size; i++)
- {
- for (j = 0; j < size; j++)
- {
- mat[j +i*size] = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f);
-
- }
- }
- return mat;
- }
- void start_2benchs(void (*bench)(float*, unsigned, unsigned))
- {
- p1.bench = bench;
- p1.size = size1;
- p1.nblocks = nblocks1;
- p2.bench = bench;
- p2.size = size2;
- p2.nblocks = nblocks2;
- int i;
- for(i = 0; i < NSAMPLES; i++)
- {
- p1.mat[i] = construct_matrix(p1.size);
- p2.mat[i] = construct_matrix(p2.size);
- }
- starpu_pthread_t tid[2];
- starpu_pthread_mutex_init(&mut, NULL);
- struct timeval start;
- struct timeval end;
- gettimeofday(&start, NULL);
- starpu_pthread_create(&tid[0], NULL, (void*)start_bench, (void*)&p1);
- starpu_pthread_create(&tid[1], NULL, (void*)start_bench, (void*)&p2);
- starpu_pthread_join(tid[0], NULL);
- starpu_pthread_join(tid[1], NULL);
- gettimeofday(&end, NULL);
- starpu_pthread_mutex_destroy(&mut);
- double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
- timing /= 1000000;
- printf("%2.2f %2.2f ", rv[0].flops, rv[1].flops);
- printf("%2.2f %2.2f %2.2f\n", rv[0].avg_timing, rv[1].avg_timing, timing);
- }
- void start_1stbench(void (*bench)(float*, unsigned, unsigned))
- {
- p1.bench = bench;
- p1.size = size1;
- p1.nblocks = nblocks1;
- int i;
- for(i = 0; i < NSAMPLES; i++)
- {
- p1.mat[i] = construct_matrix(p1.size);
- }
- struct timeval start;
- struct timeval end;
- gettimeofday(&start, NULL);
- start_bench((void*)&p1);
- gettimeofday(&end, NULL);
- starpu_pthread_mutex_destroy(&mut);
- double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
- timing /= 1000000;
- printf("%2.2f ", rv[0].flops);
- printf("%2.2f %2.2f\n", rv[0].avg_timing, timing);
- }
- void start_2ndbench(void (*bench)(float*, unsigned, unsigned))
- {
- p2.bench = bench;
- p2.size = size2;
- p2.nblocks = nblocks2;
- int i;
- for(i = 0; i < NSAMPLES; i++)
- {
- p2.mat[i] = construct_matrix(p2.size);
- }
- struct timeval start;
- struct timeval end;
- gettimeofday(&start, NULL);
- start_bench((void*)&p2);
- gettimeofday(&end, NULL);
- starpu_pthread_mutex_destroy(&mut);
- double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
- timing /= 1000000;
- printf("%2.2f ", rv[1].flops);
- printf("%2.2f %2.2f\n", rv[1].avg_timing, timing);
- }
- void construct_contexts(void (*bench)(float*, unsigned, unsigned))
- {
- struct sc_hypervisor_policy policy;
- policy.custom = 0;
- policy.name = "idle";
- void *perf_counters = sc_hypervisor_init(&policy);
- int nworkers1 = cpu1 + gpu + gpu1;
- int nworkers2 = cpu2 + gpu + gpu2;
- unsigned n_all_gpus = gpu + gpu1 + gpu2;
- int i;
- int k = 0;
- nworkers1 = 12;
- p1.workers = (int*)malloc(nworkers1*sizeof(int));
-
-
-
-
-
-
- for(i = 0; i < 12; i++)
- p1.workers[i] = i;
- p1.ctx = starpu_sched_ctx_create(p1.workers, nworkers1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0);
- starpu_sched_ctx_set_perf_counters(p1.ctx, perf_counters);
- p2.the_other_ctx = (int)p1.ctx;
- p1.nworkers = nworkers1;
- sc_hypervisor_register_ctx(p1.ctx, 0.0);
-
-
-
-
-
-
-
-
-
-
- sc_hypervisor_ctl(p1.ctx,
- SC_HYPERVISOR_GRANULARITY, 2,
- SC_HYPERVISOR_MIN_TASKS, 1000,
- SC_HYPERVISOR_MIN_WORKERS, 6,
- SC_HYPERVISOR_MAX_WORKERS, 12,
- NULL);
- k = 0;
- p2.workers = (int*)malloc(nworkers2*sizeof(int));
-
-
-
-
-
-
- p2.ctx = starpu_sched_ctx_create(p2.workers, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0);
- starpu_sched_ctx_set_perf_counters(p2.ctx, perf_counters);
- p1.the_other_ctx = (int)p2.ctx;
- p2.nworkers = 0;
- sc_hypervisor_register_ctx(p2.ctx, 0.0);
-
-
-
-
-
-
-
-
-
-
- sc_hypervisor_ctl(p2.ctx,
- SC_HYPERVISOR_GRANULARITY, 2,
- SC_HYPERVISOR_MIN_TASKS, 500,
- SC_HYPERVISOR_MIN_WORKERS, 0,
- SC_HYPERVISOR_MAX_WORKERS, 6,
- NULL);
- }
- void set_hypervisor_conf(int event, int task_tag)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- void end_contexts()
- {
- free(p1.workers);
- free(p2.workers);
- sc_hypervisor_shutdown();
- }
- void parse_args_ctx(int argc, char **argv)
- {
- init();
- int i;
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-size1") == 0) {
- char *argptr;
- size1 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-nblocks1") == 0) {
- char *argptr;
- nblocks1 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-size2") == 0) {
- char *argptr;
- size2 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-nblocks2") == 0) {
- char *argptr;
- nblocks2 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-cpu1") == 0) {
- char *argptr;
- cpu1 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-cpu2") == 0) {
- char *argptr;
- cpu2 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-gpu") == 0) {
- char *argptr;
- gpu = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-gpu1") == 0) {
- char *argptr;
- gpu1 = strtol(argv[++i], &argptr, 10);
- }
- if (strcmp(argv[i], "-gpu2") == 0) {
- char *argptr;
- gpu2 = strtol(argv[++i], &argptr, 10);
- }
- }
- }
|