コード例 #1
0
ファイル: ejercicio1.c プロジェクト: Miguelrn/MPI
int main(int argc, char *argv[]){
	
	srand (time(NULL));
	int i, j, z;
	int f = 4, c = 4;
	double startwtime, endwtime;
	int myrank, size;

	float** matrizA, **matrizB, **matrizC;

	matrizC = (float**) malloc (sizeof(float*)*f);
	for(i = 0; i < f; i++){
		matrizC[i] = (float*) malloc(sizeof(float)*f);
	}

	matrizA = get_matriz(f,c);
	matrizB = get_matriz(c,f);

	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &size);	
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

	if(c <= 8 && f <= 8) {	
		print_matriz ( matrizA, f, c);
		print_matriz ( matrizB, c, f);
	}

	startwtime = MPI_Wtime();

	for(i = 0; i < f; i++)//cada fila del proceso, sobre la matriz A
    {
    	for (j=0; j < c; j++)//cada columna del proceso
        {
        	matrizC[i][j] = 0;
            for (z = 0; z < c ; z++){//cada fila de la columna j
            	matrizC[i][j] += matrizA[i][z] * matrizB[z][j];
			}
		}            
   	} 

	endwtime = MPI_Wtime();

	if(c <= 8 && f <= 8) {
		print_matriz ( matrizC, f, f);	
	}       	
	printf("Tiempo de ejecucion: %f, usando %d+1 maquinas\n", endwtime - startwtime, size - 1);		  
	if (matrizA!=NULL) free(matrizA);
	if (matrizB!=NULL) free(matrizB);
	if (matrizC!=NULL) free(matrizC);


	MPI_Finalize();	
	return 0;

}
コード例 #2
0
ファイル: ejercicio2.c プロジェクト: Miguelrn/MPI
int main(int argc, char *argv[]){
	
	srand (time(NULL));
	int myrank, size;
	int i, j, z, x, y, k;
	int f = 200, c = f;
	int completados = 0;
	int res;
	int *resRow;
	int *rowA;
	MPI_Status status;
	MPI_Request request;
	int suma;
 	double startwtime, endwtime;
	int filasEnviadas = 0, filasRecibidas = 0;
	int receptor = 0;

	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &size);	
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

	int **matrizA = get_matriz(f,c);//reserva, pero no inicializa
	int **matrizB = get_matriz(c,f);//reserva, pero no inicializa
	int **matrizC = get_matriz(f,f);//reserva, pero no inicializa

	rowA   = malloc((1+((f*c)/size)) * sizeof(int));//mandamos	
	resRow = malloc((1+((f*c)/size)) * sizeof(int));//recibimos

	if (myrank== 0){

		//inicializamos
		inicializa_matriz(matrizA, f, c);
		inicializa_matriz(matrizB, c, f);
				
		if(c <= 8 && f <= 8) {
			print_matriz(matrizA, f, c);
			print_matriz(matrizB, c, f);	
		}

		if((f % size) != 0 ){ 
			printf("Necesita tener un numero par (correcto) de procesos\n"); return 0;
		}

		
		while(filasEnviadas < f-(f/size)){//el proceso coordinador va enviar un trozo de la matriz a cada uno(excepto a el mismo)

			for(i = 0; i < (f/size); i++){
				for(j = 0; j < c; j++){
					rowA[i*f+j] = matrizA[(filasEnviadas+i)][j];
				}
			}
			rowA[((f*c)/size)] = filasEnviadas;//apuntamos que fila estamos mandando(puede ser mas de una pero estan seguidas)

			receptor++;
			MPI_Send(&rowA[0], f*c/size+1, MPI_INT, receptor, 2, MPI_COMM_WORLD);//etiqueta 2
			
			filasEnviadas += f/size;

		}

		for(i = 0; i < (f/size); i++){
			for(j = 0; j < c; j++){
				rowA[i*f+j] = matrizA[(filasEnviadas+i)][j];
			}
		}

		rowA[((f*c)/size)] = filasEnviadas;//apuntamos que fila estamos mandando(puede ser mas de una pero estan seguidas)
    } 	
	else{//el coordinador no recibe nada
		MPI_Recv(&rowA[0], c*f/size+1, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
	}

	res = MPI_Bcast(&matrizB[0][0], c*f, MPI_INT, 0, MPI_COMM_WORLD);

	startwtime = MPI_Wtime();


	//Procesamiento
	for (k = 0; k < f/size; k++){
		for(i = 0; i < c; i++){//numero de columnas de B
			suma = 0;
			for(j = 0; j < f; j++){
				suma += (rowA[k*f + j] * matrizB[j][i]);
			}
			resRow[k*f +i] = suma;
		}
	}
	resRow[((f*c)/size)] = rowA[((f*c)/size)];

	endwtime = MPI_Wtime();

	if(myrank != 0){//solo los trabajadores mandan
		MPI_Send(&resRow[0], c*f/size+1, MPI_INT, 0, 1, MPI_COMM_WORLD);//send
	}
	else{//cordinador recibe y los coloca en matrizC

		int fila = rowA[c*f/size];//la fila que vamos a tratar de la matriz A
		for(i = 0; i < (f/size); i++){
			for(j = 0; j < c; j++){
				matrizC[fila+i][j] = resRow[i*f+j];
			}
		}

		while(filasRecibidas < (f-(f/size))){
			MPI_Recv(&resRow[0], c*f/size+1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);
			
			int fila = resRow[c*f/size];//la fila que vamos a tratar de la matriz A
			for(i = 0; i < (f/size); i++){
				for(j = 0; j < c; j++){
					matrizC[fila+i][j] = resRow[i*f+j];
				}
			}
			filasRecibidas += f/size;
		}

	}
  

	if(myrank == 0) {	
		if(c <= 8 && f <= 8) print_matriz(matrizC,f,f);

		printf("Tiempo de ejecucion: %f, usando %d+1 maquinas\n", endwtime - startwtime, size - 1);
	}

	if (matrizA!=NULL) free(matrizA);
	if (matrizB!=NULL) free(matrizB);
	if (matrizC!=NULL) free(matrizC);
	if (resRow!=NULL) free(resRow);
	if (rowA!=NULL) free(rowA); 

	MPI_Finalize();	

	return 0;

}
コード例 #3
0
ファイル: enlace.c プロジェクト: nishida93/Redes-B
int *iniciaEnlace() {

    no_do_enlace = info.no_de_inicio;


    int node=0;
    int number;
    int elem1;
    int elem2;
    int elem3;
    int elem4;
    int porta;



    char str[50];
    FILE *arq;

    int ret=6;

    printf("\n%s\n",info.arg);
    arq = fopen(info.arg, "r");


    if(arq == NULL)
        printf("Erro, nao foi possivel abrir o arquivo\n");
    else {



        fscanf(arq,"%s",str);

        char aux[10]="";
        do {


            ret = fscanf(arq,"%d: IP = %d.%d.%d.%d, Porta = %d;", &number,&elem1,&elem2,&elem3,&elem4,&porta);

            if(ret >= 6) {

                if(node != 4) {


                    nos[node].no = number;
                    nos[node].porta = porta;
                    fflush(stdout);
                    fflush(stdin);
                    sprintf(nos[node].ip,"%d.%d.%d.%d",elem1,elem2,elem3,elem4);
                    fflush(stdin);
                    fflush(stdout);


                    node++;
                }
            }
        } while(ret >= 6);

        ret=3;
        fscanf(arq,"%s",str);

        do {
            ret = fscanf(arq,"%d -> %d, MTU = %d;", &number,&elem1,&elem2);

            if(ret >= 3) {

                matriz[number-1][elem1-1]=1;
                matriz[elem1-1][number-1]=1;
                mtu[number-1][elem1-1]=elem2;
                mtu[elem1-1][number-1]=elem2;
            }
        } while(ret >= 3);






    }


//Testando funcoes

    printf("%d: IP:::::::::%s,PORTA = %d\n",nos[0].no,nos[0].ip,nos[0].porta );
    printf("%d: IP:::::::::%s,PORTA = %d\n",nos[1].no,nos[1].ip,nos[1].porta );
    printf("%d: IP:::::::::%s,PORTA = %d\n",nos[2].no,nos[2].ip,nos[2].porta );
    printf("%d: IP:::::::::%s,PORTA = %d\n",nos[3].no,nos[3].ip,nos[3].porta );
    fclose(arq);

    printf("\n");
    print_matriz(4,4);
    printf("\n");
    print_mtu(4,4);
    printf("\n");

    printf("\ntem ligacao:%d\n\n", tem_ligacao(1,2));

    printf("\nMTU:%d\n\n", getMtu(1,2));

////UDP
    printf("\nFRI:%s\n\n", nos[2].ip);






    pthread_t t1;

    int a1 = 1;



    //Recebe


    pthread_create(&t1, NULL, recebe_Datagrama, (void *)(&a1));

    pthread_t t2;

    int a2 = 2;
    //Envia
    pthread_create(&t2, NULL, envia_Datagrama, (void *)(&a2));





    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    return 0;

}
コード例 #4
0
ファイル: ejercicio5.c プロジェクト: Miguelrn/MPI
int main(int argc, char *argv[]){
	
	srand (time(NULL));
	int myrank, size;
	int i, j, z, x, y, k;
	int f = 16, c = 16;
	int completados = 0;
	int res;
	int *resRow;
	int *rowA;
	MPI_Status stats;
	MPI_Request request;
	int suma;
 	double startwtime, endwtime;
	int filasEnviadas = 0, filasRecibidas = 0;
	int receptor;

	
	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &size);	
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
	int restantes = (f*c)%size;//elementos restantes
    int *cantidadMandados;//array de elementos enviados a cada trabajador    
    int *desplazamiento;//desplazamiento entre los envios (total datos / size)
	int sum = 0;

	int **matrizA = get_matriz(f,c);//reserva, pero no inicializa
	int **matrizB = get_matriz(c,f);//reserva, pero no inicializa
	int **matrizC = get_matriz(f,f);//reserva, pero no inicializa

    cantidadMandados = malloc(sizeof(int)*size);
    desplazamiento = malloc(sizeof(int)*size);

	if (myrank== 0){

		//inicializamos
		inicializa_matriz(matrizA,f,c);
		inicializa_matriz(matrizB,c,f);
				
		if(c <= 8 && f <= 8) {
			print_matriz(matrizA, f, c);
			print_matriz(matrizB, c, f);	
		}		
    } 
	
	for (i = 0; i < size; i++) {
		cantidadMandados[i] = (f*c - sum)/(size - i);
		
		if((cantidadMandados[i] % f) != 0){//es decir no tiene la ultima fila completa
			cantidadMandados[i] += (f - (cantidadMandados[i] % f));
		}
		desplazamiento[i] = sum;
		sum += cantidadMandados[i];
	
    }

	rowA = malloc(cantidadMandados[myrank] * sizeof(int));	
	resRow = malloc(cantidadMandados[myrank] * sizeof(int));
	/*if (0 == myrank) {
        for (i = 0; i < size; i++) {
            printf("cantidadMandados[%d] = %d\tdesplazamiento[%d] = %d\n", i, cantidadMandados[i], i, desplazamiento[i]);
        }
    }*/


	res = MPI_Bcast(&matrizB[0][0], c*f, MPI_INT, 0, MPI_COMM_WORLD);

	MPI_Scatterv(&matrizA[0][0], cantidadMandados, desplazamiento, MPI_INT, &rowA[0], cantidadMandados[myrank], MPI_INT, 0, MPI_COMM_WORLD);

	if(myrank == 0)
		startwtime = MPI_Wtime();
	
	//Procesamiento
	for (k = 0; k < cantidadMandados[myrank]/f; k++){
		for(i = 0; i < c; i++){//numero de columnas de B
			suma = 0;
			for(j = 0; j < f; j++){
				suma += (rowA[k*f + j] * matrizB[j][i]);
			}
			resRow[k*f +i] = suma;
		}
	}

	if(myrank == 0)
		endwtime = MPI_Wtime();

	MPI_Gatherv(&resRow[0], cantidadMandados[myrank], MPI_INT, &matrizC[0][0], cantidadMandados, &desplazamiento[myrank], MPI_INT, 0, MPI_COMM_WORLD);//5º parametro es int *recvcount
	
	MPI_Finalize();	  

	if(myrank == 0) {	

		if(c <= 8 && f <= 8) print_matriz(matrizC,f,f);

		printf("Tiempo de ejecucion: %f, usando %d+1 maquinas\n", endwtime - startwtime, size - 1);
	}

	if (matrizA!=NULL) free(matrizA);
	if (matrizB!=NULL) free(matrizB);
	if (matrizC!=NULL) free(matrizC);
	if (resRow!=NULL) free(resRow);
	if (rowA!=NULL) free(rowA); 

	return 0;

}