/* ------------------------------------------------------------------------- O unico parametro a ser passado para esse agente e' o numero do processa- dor em que esta executando o 'ns'. ------------------------------------------------------------------------- */ main(int argc,char *argv[]) { MPI_Init(&argc, &argv); int method = 0, flagConnectMD = 1, flagConnectMP = 1, position = 0; char portMD[MPI_MAX_PORT_NAME], portMP[MPI_MAX_PORT_NAME], bufferMD[100], bufferMP[100]; MPI_Comm commServerMD; MPI_Comm commServerMP; flagConnectMD = MPI_Lookup_name("ServerMD", MPI_INFO_NULL, portMD); flagConnectMP = MPI_Lookup_name("ServerMP", MPI_INFO_NULL, portMP); method = DUMP_MEMORY; int i = 0; int message = 1224; if (!flagConnectMD) { MPI_Comm_connect(portMD, MPI_INFO_NULL, 0, MPI_COMM_SELF, &commServerMD); MPI_Pack(&method, 1, MPI_INT, bufferMD, 100, &position, commServerMD); MPI_Send(bufferMD, position, MPI_PACKED, 0, 1, commServerMD); MPI_Send(&message, 1, MPI_INT, 0, 1, commServerMD); MPI_Comm_disconnect(&commServerMD); } else printf("\n\n* Memoria de solucoes duais nao iniciada *\n\n"); position = 0; if (!flagConnectMP) { MPI_Comm_connect(portMP, MPI_INFO_NULL, 0, MPI_COMM_SELF, &commServerMP); MPI_Pack(&method, 1, MPI_INT, bufferMP, 100, &position, commServerMP); MPI_Send(bufferMP, position, MPI_PACKED, 0, 1, commServerMP); MPI_Send(&message, 1, MPI_INT, 0, 1, commServerMP); MPI_Comm_disconnect(&commServerMP); } else printf("\n\n* Memoria de solucoes primais nao iniciada *\n\n"); if ((flagConnectMD) && (flagConnectMP)){ printf("\n\n* Nenhum dos servidores de memoria do ATeam esta ativo *\n");fflush(stdout); }else printf("\n* A escrita do conteudo das memorias ativas foi realizada *\n"); MPI_Finalize(); }
void MPICommunicator::establishConnection(std::string& clientName){ // This function will connect to a Cn which has opened a port and started a service in its own name. MPI_Info info = MPI_INFO_NULL; std::string service = clientName; char *portName = new char[MPI_MAX_PORT_NAME]; MPI_Lookup_name((char*)(service.c_str()), info, portName); MPI_Comm clientComm = NULL; MPI_Comm_connect(portName, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &clientComm); delete [] portName; }
MPI_Comm client_init( MPI_Comm comm ) { MPI_Comm newcomm; int ret; char port_name[ MPI_MAX_PORT_NAME ]; ret = MPI_Lookup_name( "mpe_port_name", MPI_INFO_NULL, port_name ); if ( ret != MPI_SUCCESS ) { handle_error( ret, "MPI_Lookup_name" ); return 0; } fprintf( stdout, "client: found open port at %s\n", port_name ); MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, comm, &newcomm ); return newcomm; }
/* ------------------------------------------------------------------------- O primeiro parametro a ser passado para esse agente e' o numero do proce- ssador em que esta executando o 'ns' e o segundo parametro e' o nome do arquivo que contem a instancia do SCP. ------------------------------------------------------------------------- */ main(int argc, char *argv[]) { int flagConnect = 1; char port[MPI_MAX_PORT_NAME]; MPI_Comm commServerMD; MPI_Init(&argc, &argv); MPI_Comm_get_parent(&interfaceComm); /* Tetativa de conectar com o servidor */ flagConnect = MPI_Lookup_name("ServerMD", MPI_INFO_NULL, port); if(flagConnect) { printf("\n\n* Termino do Agente Dual Greedy *"); printf("\n* ERRO : A memoria de solucoes duais nao foi iniciada. *"); fflush(stdout); } else { /* TimeSleeping = (int) ReadAteamParam(1); MaxLenDualMem = (int) ReadAteamParam(2); CutsofSol = (int) ReadAteamParam(6); MaxExeTime = (int) ReadAteamParam(11); ReducPerc = (int) ReadAteamParam(12); RandomDual = (char) ReadAteamParam(17); */ TimeSleeping = atoi(argv[2]); MaxLenDualMem = atoi(argv[3]); CutsofSol = atoi(argv[4]); MaxExeTime = atoi(argv[5]); ReducPerc = atoi(argv[6]); RandomDual = (char) atoi(argv[7]); if (!(finput = fopen(argv[1],"r"))) { printf("\n\n* Erro na abertura do arquivo %s. *\n",argv[1]); exit(1); } ReadSource(); fclose(finput); Reduction(NULL,NULL); srand48(time(NULL)); MPI_Comm_connect(port, MPI_INFO_NULL, 0, MPI_COMM_SELF, &commServerMD); ExecAgDual(commServerMD); printf("\n\n* Agente Dual Greedy finalizado *"); printf("\n* Servidor finalizou processamento. *\n"); } /* Finaliza comunicacao com o servidor */ int message = 1224; MPI_Send(&message, 1, MPI_INT, 0, 1, commServerMD); /* Envia mensagem de Finalizacao para interface */ //message = 1; //MPI_Send(&message, 1, MPI_INT, 0, 1, interfaceComm); MPI_Comm_disconnect(&commServerMD); MPI_Finalize(); printf("\n ==== ag_dual FINALIZADO \n", message); }
/* ------------------------------------------------------------------------- O primeiro parametro a ser passado para esse agente e' o numero do proce- ssador em que esta executando o 'ns', o segundo parametro e' o nome do arquivo que contem a instancia do SCP e o terceiro e' o nome do diretorio em que serao gerados os arquivos de estatisticas. ------------------------------------------------------------------------- */ main(int argc,char *argv[]) { int numSpawns = 1, /* Qtd de processos de serverMD */ errcodes[numSpawns], /* Array de erros para o spawn. Um */ /* código por processo */ /* Variáveis de controle de um grupo de processos da MPI*/ size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm interComSpawn; char *look = NULL, path[200]; unsigned long NbServerMD = 0; /* MaxLenDualMem = (int) ReadAteamParam(2); ReducPerc = (int) ReadAteamParam(12); RandomInitMD = (char) ReadAteamParam(16); */ MaxLenDualMem = atoi(argv[3]); ReducPerc = atoi(argv[4]); RandomInitMD = (char) atoi(argv[5]); /* OBS: Esse arquivo de ser passado por argv[2] */ if (!(finput = fopen(argv[1],"r"))) { printf("\n\n* Erro na abertura do arquivo %s. *",argv[1]); exit(1); } ReadSource(); /* Localizada em readsc.c */ fclose(finput); Reduction(NULL,NULL); /* Localizada em reduction.c */ srand48(time(NULL)); if (argc == 10) strcpy(path,argv[2]); else strcpy(path,"./"); look = argv[1]; while (look) if (look = (char *) strstr(argv[1],"/")) argv[1] = (look + 1); strcat(path,argv[1]); // char *param = malloc(200 * sizeof(char)); // strcpy(param, path); char *param[7]; param[0] = (char *) malloc (512 * sizeof(char)); param[1] = (char *) malloc (16 * sizeof(char)); param[2] = (char *) malloc (16 * sizeof(char)); param[3] = (char *) malloc (16 * sizeof(char)); param[4] = (char *) malloc (16 * sizeof(char)); param[5] = (char *) malloc (16 * sizeof(char)); param[6] = NULL; strcpy(param[0], path); strcpy(param[1], argv[3]); strcpy(param[2], argv[6]); strcpy(param[3], argv[7]); strcpy(param[4], argv[8]); strcpy(param[5], argv[9]); /* ------------------------------------------------------------------------- */ /* Iniciando o serverMD */ MPI_Comm_spawn("../../AteamMPI/bin/serverMD", param, 1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &interComSpawn, errcodes); /* ------------------------------------------------------------------------- */ /* Espera bloqueante necessária para não dar crash */ char messageBlock[1]; MPI_Status status; MPI_Recv(messageBlock, 1, MPI_CHAR, 0, MPI_ANY_TAG, interComSpawn, &status); /* ------------------------------------------------------------------------- */ int method = INIT_GLOBAL_VARS, /* Primeira função a ser chamada pelo */ /* serverMD (INIT_GLOBAL_VARS) */ position = 0, /* Marca as posicoes de cada dado empacotado */ flagConnect = 1; /* Flag para verificar se conectou com o servidor */ char * buffer, /* Buffer contendo a mensagem a ser enviada*/ port[MPI_MAX_PORT_NAME]; /* Porta para conectar com o serverMD */ MPI_Comm commServerMD; /* Comunicador retornado apos a conexao com serverMD */ /* Verificando a existencia do serverMD - se sim recebe a porta */ /* para conectar */ flagConnect = MPI_Lookup_name("ServerMD", MPI_INFO_NULL, port); if(flagConnect) { printf("\n\n Erro: Porta não concebida \n\n");fflush(stdout); }else{ /* Conecta como serverMD */ MPI_Comm_connect(port, MPI_INFO_NULL, 0, MPI_COMM_SELF, &commServerMD); buffer = malloc(3 * sizeof(int) + sizeof(float) + sizeof(unsigned long)); /* Sequência de empacotamento da primeira mensagem */ MPI_Pack(&method, 1, MPI_INT, buffer, 3 * sizeof(int) + sizeof(float) + sizeof(unsigned long), &position, commServerMD); /* * Position foi incrementada: passa a referenciar a primeira * posição livre no buffer e assim sucessivamente. */ MPI_Pack(&nb_lin, 1, MPI_INT, buffer, 3 * sizeof(int) + sizeof(float) + sizeof(unsigned long), &position, commServerMD); MPI_Pack(&nb_col, 1, MPI_INT, buffer, 3 * sizeof(int) + sizeof(float) + sizeof(unsigned long), &position, commServerMD); MPI_Pack(&density, 1, MPI_FLOAT, buffer, 3 * sizeof(int) + sizeof(float) + sizeof(unsigned long), &position, commServerMD); MPI_Pack(&NbServerMD, 1, MPI_UNSIGNED_LONG, buffer, 3 * sizeof(int) + sizeof(float) + sizeof(unsigned long), &position, commServerMD); /* * Envia a mensagem empacotada para o serverMD, fazendo uso do comu- * nicador interComSpawn resultante da chamada a rotina spawn */ MPI_Send(buffer, position, MPI_PACKED, 0, 1, commServerMD); free(buffer); } /* A heuristica dual gulosa sera chamada <MaxLenDualMem> vezes para gerar solucoes que permitam preencher total ou parcialmente a memoria de solu- coes duais. */ ExecAgInitMD(commServerMD); FreeSource(); int i = 0; int message = 1224; //printf("\n \n Messagen 1224 %d: \n", message); MPI_Send(&message, 1, MPI_INT, 0, 1, commServerMD); MPI_Comm_disconnect(&commServerMD); //printf("\n\n* Termino do Agente InitMD *"); //printf("\n* A memoria de solucoes duais foi inicializada. *\n"); MPI_Finalize(); }