heuristicas.c
int nn(int task_id, int x_Taskmestre, int y_Taskmestre){

	int proc_address;
	int canditate_proc = -1;
	int ROTX=XCLUSTER;   //X E Y DO CLUSTER, ARQUIVO kernel_pkg.h da HeMPS, em cada aplicacao, (hemps/hemps8.5/testcases/example/include)
	int ROTY=YCLUSTER;
	int begin, end;
   	int primeiravez;
   	int esquerda, direita;
   	int XMASTER, YMASTER;
   	int z;
   	int tam;
   	int vetX[2][2*ROTX];
   	int vetY[2][2*ROTX];
   	int *sX;
   	int *sY;
   	int pt;
   	int *tX;
   	int *tY;
   	int *aX;
   	int *aY;
   	int tmpX, tmpY;

	XMASTER = x_Taskmestre;
   	YMASTER = y_Taskmestre;
   	vetX[0][0] = XMASTER;
   	vetY[0][0] = YMASTER;
   	sX = &vetX[0][0];
   	sY = &vetY[0][0];
   	tX = &vetX[1][0];
   	tY = &vetY[1][0];
   	primeiravez=1;
   	esquerda = 1;
   	direita = 1;;
   	tam = 0;
   	begin=1;
   	end=1;
	
	while(1){
	      	// inicial, somente o endereço do mestre está na fila
		if(primeiravez){
			primeiravez=0;
		 	pt=0;
			if(sX[0]>0){           //verifica se tem alguem na esquerda
		    		tX[pt] = sX[0]-1;
		    		tY[pt] = sY[0];
		    		pt++;
			}
			else{
				esquerda = 0;
			}
			if(sY[0]<ROTY-1){     //verifica se tem alguem acima
		    		tX[pt] = sX[0];
		    		tY[pt] = sY[0]+1;
		    		pt++;
			}
			if(sY[0]>0){          //verifica se tem alguem abaixo
		    		tX[pt] = sX[0];
		    		tY[pt] = sY[0]-1;
		    		pt++;
		 	}
		 	if(sX[0]<ROTX-1){     //verifica se tem alguem a direita
		    		tX[pt] = sX[0]+1;
		    		tY[pt] = sY[0];
		    		pt++;
		 	}
		 	else{
		    		direita = 0;
		 	}
	      	}
	      	//senão
	      	else{
		 	// primeiro
		 	pt=0;
		 	if(esquerda){                //verifica se tem alguem na esquerda
		    		if(sX[0]>0){
		       			tX[pt] = sX[0]-1;tY[pt] = sY[0]; pt++;
		    		}
		    		else{
		       		esquerda = 0;
		    		}
		    		if(sY[0]<ROTY-1){         //verifica se tem alguem acima
		       			tX[pt] = sX[0]; tY[pt] = sY[0]+1; pt++;
		    		}
		    		if(sY[0]>0){              //verifica se tem alguem abaixo
		       			tX[pt] = sX[0]; tY[pt] = sY[0]-1; pt++;
		    		}
			}

		 	// meio
		 	for(z=begin; z<tam-end; z++){
		    		if((sY[z]>YMASTER)&&(sY[z]<ROTY-1)){
		       			tX[pt] = sX[z]; tY[pt] = sY[z]+1; pt++;
		    		}
		    		else{
		       			if((sY[z]<YMASTER)&&(sY[z]>0)){
		          			tX[pt] = sX[z]; tY[pt] = sY[z]-1; pt++;
		       			}
		       			else{
		         			if(sY[z]==YMASTER){
		             				tX[pt] = sX[z]; tY[pt] = sY[z]-1; pt++;
		             				tX[pt] = sX[z]; tY[pt] = sY[z]+1; pt++;
		          			}
		       			}
		    		}
		 	}
		 	// ultimo
		 	if(direita){
		    		if(sY[tam-1]<ROTY-1){
		       			tX[pt] = sX[tam-1]; tY[pt] = sY[tam-1]+1; pt++;
		    		}
		    		if(sY[tam-1]>0){
		       			tX[pt] = sX[tam-1]; tY[pt] = sY[tam-1]-1; pt++;
		    		}
		    		if(sX[tam-1]<ROTX-1){
		       			tX[pt] = sX[tam-1]+1; tY[pt] = sY[tam-1]; pt++;
		    		}
		    		else{
		       			direita = 0;
		    		}
		 	}
	      	}
	      	begin = esquerda;
	      	end = direita;
	      	tam = pt;
	      	aX = tX;
	      	aY = tY;
	      	tX = sX;
	      	tY = sY;
	      	sX = aX;
	      	sY = aY;

	      	if(!tam){
			puts("ERRO SNN - Posicionador SNN não achou ninguém \n");
		 	return -1; //returna -1
	      	}
	      	for(z=0; z<tam; z++){
			tmpX = aX[z];
			tmpY = aY[z];
		    	proc_address = tmpX*256 + tmpY;//cria o endereço de processador
		    	if ( proc_address != 0  &&  get_proc_free_pages(proc_address) > 0){
				canditate_proc = proc_address;

				puts("Mapeam. para tarefa "), puts(itoa(task_id)); puts(" mapeada no processador "); puts(itoh(canditate_proc)); puts("\n");
				return canditate_proc; //retorna o endereço do processador selecionado
		 	}
	      	}
	}	
}
// heuristica NN - mapeia a tarefa para o primeiro EP livre em um caminho circular a tarefa mestre, ou seja, a primeira mapeada
heuristica NN - mapeia a tarefa para o primeiro EP livre em um caminho circular a tarefa mestre, ou seja, a primeira mapeada
heuristica NN - mapeia a tarefa para o primeiro EP livre em um caminho circular a tarefa mestre ou seja a primeira mapeada
int nn(int task_id, int x_Taskmestre, int y_Taskmestre){
	int proc_address;
	int canditate_proc = -1;
	int ROTX=XCLUSTER;   
	int ROTY=YCLUSTER;
	int begin, end;
   	int primeiravez;
   	int esquerda, direita;
   	int XMASTER, YMASTER;
   	int z;
   	int tam;
   	int vetX[2][2*ROTX];
   	int vetY[2][2*ROTX];
   	int *sX;
   	int *sY;
   	int pt;
   	int *tX;
   	int *tY;
   	int *aX;
   	int *aY;
   	int tmpX, tmpY;
	XMASTER = x_Taskmestre;
   	YMASTER = y_Taskmestre;
   	vetX[0][0] = XMASTER;
   	vetY[0][0] = YMASTER;
   	sX = &vetX[0][0];
   	sY = &vetY[0][0];
   	tX = &vetX[1][0];
   	tY = &vetY[1][0];
   	primeiravez=1;
   	esquerda = 1;
   	direita = 1;;
   	tam = 0;
   	begin=1;
   	end=1;
	while(1){
		if(primeiravez){
			primeiravez=0;
		 	pt=0;
			if(sX[0]>0){           
		    		tX[pt] = sX[0]-1;
		    		tY[pt] = sY[0];
		    		pt++;
			}
			else{
				esquerda = 0;
			}
			if(sY[0]<ROTY-1){     
		    		tX[pt] = sX[0];
		    		tY[pt] = sY[0]+1;
		    		pt++;
			}
			if(sY[0]>0){          
		    		tX[pt] = sX[0];
		    		tY[pt] = sY[0]-1;
		    		pt++;
		 	}
		 	if(sX[0]<ROTX-1){     
		    		tX[pt] = sX[0]+1;
		    		tY[pt] = sY[0];
		    		pt++;
		 	}
		 	else{
		    		direita = 0;
		 	}
	      	}
	      	else{
		 	pt=0;
		 	if(esquerda){                
		    		if(sX[0]>0){
		       			tX[pt] = sX[0]-1;tY[pt] = sY[0]; pt++;
		    		}
		    		else{
		       		esquerda = 0;
		    		}
		    		if(sY[0]<ROTY-1){         
		       			tX[pt] = sX[0]; tY[pt] = sY[0]+1; pt++;
		    		}
		    		if(sY[0]>0){              
		       			tX[pt] = sX[0]; tY[pt] = sY[0]-1; pt++;
		    		}
			}
		 	for(z=begin; z<tam-end; z++){
		    		if((sY[z]>YMASTER)&&(sY[z]<ROTY-1)){
		       			tX[pt] = sX[z]; tY[pt] = sY[z]+1; pt++;
		    		}
		    		else{
		       			if((sY[z]<YMASTER)&&(sY[z]>0)){
		          			tX[pt] = sX[z]; tY[pt] = sY[z]-1; pt++;
		       			}
		       			else{
		         			if(sY[z]==YMASTER){
		             				tX[pt] = sX[z]; tY[pt] = sY[z]-1; pt++;
		             				tX[pt] = sX[z]; tY[pt] = sY[z]+1; pt++;
		          			}
		       			}
		    		}
		 	}
		 	if(direita){
		    		if(sY[tam-1]<ROTY-1){
		       			tX[pt] = sX[tam-1]; tY[pt] = sY[tam-1]+1; pt++;
		    		}
		    		if(sY[tam-1]>0){
		       			tX[pt] = sX[tam-1]; tY[pt] = sY[tam-1]-1; pt++;
		    		}
		    		if(sX[tam-1]<ROTX-1){
		       			tX[pt] = sX[tam-1]+1; tY[pt] = sY[tam-1]; pt++;
		    		}
		    		else{
		       			direita = 0;
		    		}
		 	}
	      	}
	      	begin = esquerda;
	      	end = direita;
	      	tam = pt;
	      	aX = tX;
	      	aY = tY;
	      	tX = sX;
	      	tY = sY;
	      	sX = aX;
	      	sY = aY;
	      	if(!tam){
			puts("ERRO SNN - Posicionador SNN não achou ninguém \n");
		 	return -1; 
	      	}
	      	for(z=0; z<tam; z++){
			tmpX = aX[z];
			tmpY = aY[z];
		    	proc_address = tmpX*256 + tmpY;
		    	if ( proc_address != 0  &&  get_proc_free_pages(proc_address) > 0){
				canditate_proc = proc_address;
				puts("Mapeam. para tarefa "), puts(itoa(task_id)); puts(" mapeada no processador "); puts(itoh(canditate_proc)); puts("\n");
				return canditate_proc; 
		 	}
	      	}
	}	
}
int nn ( int task_id , int x_Taskmestre , int y_Taskmestre ) { int proc_address ; int canditate_proc = -1 ; int ROTX = XCLUSTER ; int ROTY = YCLUSTER ; int begin , end ; int primeiravez ; int esquerda , direita ; int XMASTER , YMASTER ; int z ; int tam ; int vetX [ 2 ] [ 2 * ROTX ] ; int vetY [ 2 ] [ 2 * ROTX ] ; int * sX ; int * sY ; int pt ; int * tX ; int * tY ; int * aX ; int * aY ; int tmpX , tmpY ; XMASTER = x_Taskmestre ; YMASTER = y_Taskmestre ; vetX [ 0 ] [ 0 ] = XMASTER ; vetY [ 0 ] [ 0 ] = YMASTER ; sX = & vetX [ 0 ] [ 0 ] ; sY = & vetY [ 0 ] [ 0 ] ; tX = & vetX [ 1 ] [ 0 ] ; tY = & vetY [ 1 ] [ 0 ] ; primeiravez = 1 ; esquerda = 1 ; direita = 1 ; ; tam = 0 ; begin = 1 ; end = 1 ; while ( 1 ) { if ( primeiravez ) { primeiravez = 0 ; pt = 0 ; if ( sX [ 0 ] > 0 ) { tX [ pt ] = sX [ 0 ] - 1 ; tY [ pt ] = sY [ 0 ] ; pt ++ ; } else { esquerda = 0 ; } if ( sY [ 0 ] < ROTY - 1 ) { tX [ pt ] = sX [ 0 ] ; tY [ pt ] = sY [ 0 ] + 1 ; pt ++ ; } if ( sY [ 0 ] > 0 ) { tX [ pt ] = sX [ 0 ] ; tY [ pt ] = sY [ 0 ] - 1 ; pt ++ ; } if ( sX [ 0 ] < ROTX - 1 ) { tX [ pt ] = sX [ 0 ] + 1 ; tY [ pt ] = sY [ 0 ] ; pt ++ ; } else { direita = 0 ; } } else { pt = 0 ; if ( esquerda ) { if ( sX [ 0 ] > 0 ) { tX [ pt ] = sX [ 0 ] - 1 ; tY [ pt ] = sY [ 0 ] ; pt ++ ; } else { esquerda = 0 ; } if ( sY [ 0 ] < ROTY - 1 ) { tX [ pt ] = sX [ 0 ] ; tY [ pt ] = sY [ 0 ] + 1 ; pt ++ ; } if ( sY [ 0 ] > 0 ) { tX [ pt ] = sX [ 0 ] ; tY [ pt ] = sY [ 0 ] - 1 ; pt ++ ; } } for ( z = begin ; z < tam - end ; z ++ ) { if ( ( sY [ z ] > YMASTER ) && ( sY [ z ] < ROTY - 1 ) ) { tX [ pt ] = sX [ z ] ; tY [ pt ] = sY [ z ] + 1 ; pt ++ ; } else { if ( ( sY [ z ] < YMASTER ) && ( sY [ z ] > 0 ) ) { tX [ pt ] = sX [ z ] ; tY [ pt ] = sY [ z ] - 1 ; pt ++ ; } else { if ( sY [ z ] == YMASTER ) { tX [ pt ] = sX [ z ] ; tY [ pt ] = sY [ z ] - 1 ; pt ++ ; tX [ pt ] = sX [ z ] ; tY [ pt ] = sY [ z ] + 1 ; pt ++ ; } } } } if ( direita ) { if ( sY [ tam - 1 ] < ROTY - 1 ) { tX [ pt ] = sX [ tam - 1 ] ; tY [ pt ] = sY [ tam - 1 ] + 1 ; pt ++ ; } if ( sY [ tam - 1 ] > 0 ) { tX [ pt ] = sX [ tam - 1 ] ; tY [ pt ] = sY [ tam - 1 ] - 1 ; pt ++ ; } if ( sX [ tam - 1 ] < ROTX - 1 ) { tX [ pt ] = sX [ tam - 1 ] + 1 ; tY [ pt ] = sY [ tam - 1 ] ; pt ++ ; } else { direita = 0 ; } } } begin = esquerda ; end = direita ; tam = pt ; aX = tX ; aY = tY ; tX = sX ; tY = sY ; sX = aX ; sY = aY ; if ( ! tam ) { puts ( " ") ; return -1 ; } for ( z = 0 ; z < tam ; z ++ ) { tmpX = aX [ z ] ; tmpY = aY [ z ] ; proc_address = tmpX * 256 + tmpY ; if ( proc_address != 0 && get_proc_free_pages ( proc_address ) > 0 ) { canditate_proc = proc_address ; puts ( " " ) , puts ( itoa ( task_id ) ) ; puts ( " " ) ; puts ( itoh ( canditate_proc ) ) ; puts ( " \n " ) ; return canditate_proc ; } } } }
heuristica NN - mapeia a tarefa para o primeiro EP livre em um caminho circular a tarefa mestre, ou seja, a primeira mapeada
heuristica NN - mapeia a tarefa para o primeiro EP livre em um caminho circular a tarefa mestre ou seja a primeira mapeada
//X E Y DO CLUSTER, ARQUIVO kernel_pkg.h da HeMPS, em cada aplicacao, (hemps/hemps8.5/testcases/example/include) // inicial, somente o endereço do mestre está na fila //verifica se tem alguem na esquerda //verifica se tem alguem acima //verifica se tem alguem abaixo //verifica se tem alguem a direita //senão // primeiro //verifica se tem alguem na esquerda //verifica se tem alguem acima //verifica se tem alguem abaixo // meio // ultimo //returna -1 //cria o endereço de processador //retorna o endereço do processador selecionado