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; }
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; }
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; }
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; }