| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 | 
							- /* StarPU --- Runtime system for heterogeneous multicore architectures.
 
-  *
 
-  * Copyright (C) 2010-2020  Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
 
-  *
 
-  * StarPU is free software; you can redistribute it and/or modify
 
-  * it under the terms of the GNU Lesser General Public License as published by
 
-  * the Free Software Foundation; either version 2.1 of the License, or (at
 
-  * your option) any later version.
 
-  *
 
-  * StarPU is distributed in the hope that it will be useful, but
 
-  * WITHOUT ANY WARRANTY; without even the implied warranty of
 
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-  *
 
-  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
 
-  */
 
- #include "sched_ctx_utils.h"
 
- #include <starpu.h>
 
- unsigned size1;
 
- unsigned size2;
 
- unsigned nblocks1;
 
- unsigned nblocks2;
 
- unsigned cpu1;
 
- unsigned cpu2;
 
- unsigned gpu;
 
- unsigned gpu1;
 
- unsigned gpu2;
 
- struct params
 
- {
 
- 	unsigned id;
 
- 	unsigned ctx;
 
- 	int the_other_ctx;
 
- 	int *procs;
 
- 	int nprocs;
 
- 	void (*bench)(unsigned, unsigned);
 
- 	unsigned size;
 
- 	unsigned nblocks;
 
- };
 
- struct retvals
 
- {
 
- 	double flops;
 
- 	double avg_timing;
 
- };
 
- #define NSAMPLES 1
 
- int first = 1;
 
- starpu_pthread_mutex_t mut;
 
- struct retvals rv[2];
 
- struct params p1, p2;
 
- 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;
 
- 	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)
 
- {
 
- 	struct params *p = (struct 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->size, p->nblocks);
 
- 	if(p->ctx != 0)
 
- 	{
 
- 		STARPU_PTHREAD_MUTEX_LOCK(&mut);
 
- 		if(first)
 
- 		{
 
- 			starpu_sched_ctx_delete(p->ctx);
 
- 		}
 
- 		first = 0;
 
- 		STARPU_PTHREAD_MUTEX_UNLOCK(&mut);
 
- 	}
 
- 	rv[p->id].flops /= NSAMPLES;
 
- 	rv[p->id].avg_timing /= NSAMPLES;
 
- 	return NULL;
 
- }
 
- void start_2benchs(void (*bench)(unsigned, unsigned))
 
- {
 
- 	p1.bench = bench;
 
- 	p1.size = size1;
 
- 	printf("size %u\n", size1);
 
- 	p1.nblocks = nblocks1;
 
- 	p2.bench = bench;
 
- 	p2.size = size2;
 
- 	printf("size %u\n", size2);
 
- 	p2.nblocks = nblocks2;
 
- 	starpu_pthread_t tid[2];
 
- 	STARPU_PTHREAD_MUTEX_INIT(&mut, NULL);
 
- 	double start;
 
- 	double end;
 
- 	start = starpu_timing_now();
 
- 	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);
 
- 	end = starpu_timing_now();
 
- 	STARPU_PTHREAD_MUTEX_DESTROY(&mut);
 
- 	double timing = end - start;
 
- 	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)(unsigned, unsigned))
 
- {
 
- 	p1.bench = bench;
 
- 	p1.size = size1;
 
- 	p1.nblocks = nblocks1;
 
- 	double start;
 
- 	double end;
 
- 	start = starpu_timing_now();
 
- 	start_bench((void*)&p1);
 
- 	end = starpu_timing_now();
 
- 	STARPU_PTHREAD_MUTEX_DESTROY(&mut);
 
- 	double timing = end - start;
 
- 	timing /= 1000000;
 
- 	printf("%2.2f ", rv[0].flops);
 
- 	printf("%2.2f %2.2f\n", rv[0].avg_timing, timing);
 
- }
 
- void start_2ndbench(void (*bench)(unsigned, unsigned))
 
- {
 
- 	p2.bench = bench;
 
- 	p2.size = size2;
 
- 	p2.nblocks = nblocks2;
 
- 	double start;
 
- 	double end;
 
- 	start = starpu_timing_now();
 
- 	start_bench((void*)&p2);
 
- 	end = starpu_timing_now();
 
- 	STARPU_PTHREAD_MUTEX_DESTROY(&mut);
 
- 	double timing = end - start;
 
- 	timing /= 1000000;
 
- 	printf("%2.2f ", rv[1].flops);
 
- 	printf("%2.2f %2.2f\n", rv[1].avg_timing, timing);
 
- }
 
- void construct_contexts()
 
- {
 
- 	unsigned nprocs1 = cpu1 + gpu + gpu1;
 
- 	unsigned nprocs2 = cpu2 + gpu + gpu2;
 
- 	unsigned n_all_gpus = gpu + gpu1 + gpu2;
 
- 	int procs[nprocs1];
 
- 	unsigned i;
 
- 	int k = 0;
 
- 	for(i = 0; i < gpu; i++)
 
- 	{
 
- 		procs[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	for(i = gpu; i < gpu + gpu1; i++)
 
- 	{
 
- 		procs[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	for(i = n_all_gpus; i < n_all_gpus + cpu1; i++)
 
- 	{
 
- 		procs[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	printf("\n ");
 
- 	p1.ctx = starpu_sched_ctx_create(procs, nprocs1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0);
 
- 	p2.the_other_ctx = (int)p1.ctx;
 
- 	p1.procs = procs;
 
- 	p1.nprocs = nprocs1;
 
- 	int procs2[nprocs2];
 
- 	k = 0;
 
- 	for(i = 0; i < gpu; i++)
 
- 	{
 
- 		procs2[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	for(i = gpu + gpu1; i < gpu + gpu1 + gpu2; i++)
 
- 	{
 
- 		procs2[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	for(i = n_all_gpus  + cpu1; i < n_all_gpus + cpu1 + cpu2; i++)
 
- 	{
 
- 		procs2[k++] = i;
 
- 		printf("%u ", i);
 
- 	}
 
- 	printf("\n");
 
- 	p2.ctx = starpu_sched_ctx_create(procs2, nprocs2, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0);
 
- 	p1.the_other_ctx = (int)p2.ctx;
 
- 	p2.procs = procs2;
 
- 	starpu_sched_ctx_set_inheritor(p1.ctx, p2.ctx);
 
- 	starpu_sched_ctx_set_inheritor(p2.ctx, p1.ctx);
 
- 	p2.nprocs = nprocs2;
 
- }
 
- 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);
 
- 		}
 
- 	}
 
- }
 
 
  |