| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015  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. *//* * for i from 0 to nbA *  insert task handles[i] in STARPU_RW|STARPU_COMMUTE *  for j from 0 to nbA *	  if i != j			 insert task handles[i] in STARPU_RW|STARPU_COMMUTE, and handles[j] in STARPU_RW|STARPU_COMMUTE */// @FUSE_STARPU#include <starpu.h>#include "../helper.h"#include <vector>#include <unistd.h>#ifdef STARPU_QUICK_CHECK#define SLEEP_SLOW 6000#define SLEEP_FAST 1000#else#define SLEEP_SLOW 600000#define SLEEP_FAST 100000#endifstatic unsigned nb, nb_slow;void callback(void * /*buffers*/[], void * /*cl_arg*/){	unsigned val;	val = STARPU_ATOMIC_ADD(&nb, 1);	FPRINTF(stdout,"callback in (%d)\n", val); fflush(stdout);	usleep(SLEEP_FAST);	val = STARPU_ATOMIC_ADD(&nb, -1);	FPRINTF(stdout,"callback out (%d)\n", val); fflush(stdout);}void callback_slow(void * /*buffers*/[], void * /*cl_arg*/){	unsigned val;	val = STARPU_ATOMIC_ADD(&nb_slow, 1);	FPRINTF(stdout,"callback_slow in (%d)\n", val); fflush(stdout);	usleep(SLEEP_SLOW);	val = STARPU_ATOMIC_ADD(&nb_slow, -1);	FPRINTF(stdout,"callback_slow out (%d)\n", val); fflush(stdout);}int main(int /*argc*/, char** /*argv*/){	int ret;	struct starpu_conf conf;	starpu_arbiter_t arbiter, arbiter2;	ret = starpu_conf_init(&conf);	STARPU_ASSERT(ret == 0);	//conf.ncpus = 1;//// 4	ret = starpu_init(&conf);	if (ret == -ENODEV) return STARPU_TEST_SKIPPED;	STARPU_ASSERT(ret == 0);	FPRINTF(stdout, "Max Thread %d\n", starpu_worker_get_count());	//////////////////////////////////////////////////////	starpu_codelet normalCodelete;	{		memset(&normalCodelete, 0, sizeof(normalCodelete));		normalCodelete.where = STARPU_CPU;		normalCodelete.cpu_funcs[0] = callback;		normalCodelete.nbuffers = 2;		normalCodelete.modes[0] = starpu_data_access_mode(STARPU_RW|STARPU_COMMUTE);		normalCodelete.modes[1] = starpu_data_access_mode(STARPU_RW|STARPU_COMMUTE);		normalCodelete.name = "normalCodelete";	}	starpu_codelet slowCodelete;	{		memset(&slowCodelete, 0, sizeof(slowCodelete));		slowCodelete.where = STARPU_CPU;		slowCodelete.cpu_funcs[0] = callback_slow;		slowCodelete.nbuffers = 1;		slowCodelete.modes[0] = starpu_data_access_mode (STARPU_RW|STARPU_COMMUTE);		slowCodelete.name = "slowCodelete";	}	//////////////////////////////////////////////////////	//////////////////////////////////////////////////////	///const int nbA = 3;	const int nbA = 10;	FPRINTF(stdout, "Nb A = %d\n", nbA);	std::vector<starpu_data_handle_t> handleA(nbA);	std::vector<int> dataA(nbA);	arbiter = starpu_arbiter_create();	arbiter2 = starpu_arbiter_create();	for(int idx = 0 ; idx < nbA ; ++idx)	{		dataA[idx] = idx;	}	for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle)	{		starpu_variable_data_register(&handleA[idxHandle], 0, (uintptr_t)&dataA[idxHandle], sizeof(dataA[idxHandle]));		starpu_data_assign_arbiter(handleA[idxHandle], arbiter);	}	//////////////////////////////////////////////////////	//////////////////////////////////////////////////////	FPRINTF(stdout,"Submit tasks\n");	for(int idxHandleA1 = 0 ; idxHandleA1 < nbA ; ++idxHandleA1)	{		ret = starpu_task_insert(&slowCodelete,				(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1],				0);		if (ret == -ENODEV) goto out;		for(int idxHandleA2 = 0 ; idxHandleA2 < nbA ; ++idxHandleA2)		{			if(idxHandleA1 != idxHandleA2)			{				ret = starpu_task_insert(&normalCodelete,						(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1],						(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA2],						0);				if (ret == -ENODEV) goto out;			}		}	}	//////////////////////////////////////////////////////	FPRINTF(stdout,"Wait task\n");	starpu_task_wait_for_all();	//////////////////////////////////////////////////////	FPRINTF(stdout,"Release data\n");	for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle)	{		starpu_data_unregister(handleA[idxHandle]);	}	//////////////////////////////////////////////////////	FPRINTF(stdout,"Proceed gain, with several arbiters\n");	for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle)	{		starpu_variable_data_register(&handleA[idxHandle], 0, (uintptr_t)&dataA[idxHandle], sizeof(dataA[idxHandle]));		starpu_data_assign_arbiter(handleA[idxHandle], idxHandle%2?arbiter:arbiter2);	}	//////////////////////////////////////////////////////	//////////////////////////////////////////////////////	FPRINTF(stdout,"Submit tasks\n");	for(int idxHandleA1 = 0 ; idxHandleA1 < nbA ; ++idxHandleA1)	{		ret = starpu_task_insert(&slowCodelete,				(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1],				0);		if (ret == -ENODEV) goto out;		for(int idxHandleA2 = 0 ; idxHandleA2 < nbA ; ++idxHandleA2)		{			if(idxHandleA1 != idxHandleA2)			{				ret = starpu_task_insert(&normalCodelete,						(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA1],						(STARPU_RW|STARPU_COMMUTE), handleA[idxHandleA2],						0);				if (ret == -ENODEV) goto out;			}		}	}	//////////////////////////////////////////////////////	FPRINTF(stdout,"Wait task\n");out:	starpu_task_wait_for_all();	//////////////////////////////////////////////////////	FPRINTF(stdout,"Release data\n");	for(int idxHandle = 0 ; idxHandle < nbA ; ++idxHandle)	{		starpu_data_unregister(handleA[idxHandle]);	}	starpu_arbiter_destroy(arbiter);	starpu_arbiter_destroy(arbiter2);	//////////////////////////////////////////////////////	FPRINTF(stdout,"Shutdown\n");	starpu_shutdown();	return 0;}
 |