Differences
This shows you the differences between the selected revision and the current version of the page.
ipar:modelo 2007/11/19 17:59 | ipar:modelo 2007/12/24 17:45 current | ||
---|---|---|---|
Line 1: | Line 1: | ||
===== Descrição do modelo de paralelização ===== | ===== Descrição do modelo de paralelização ===== | ||
+ | O framework **ipar** foi desenvolvido em Java com o objetivo de controlar a distribuição de tarefas em aplicações paralelas de alto desempenho. Seu modelo foi desenvolvido tendo como foco plataformas tipo cluster que utilizem sistema operacional Linux sistema de arquivos compartilhado (NFS). O modelo inicial do framework **ipar** utiliza o modelo de paralelismo Bag-of-Tasks. | ||
- | ==== Programa a ser paralelizado ==== | + | Aplicações Bag-of-Tasks são aplicações paralelas cujo resultado final pode ser obtido particionando-se o problema em tarefas independentes. Este modelo apesar de simples, é muito utilizado em várias áreas. |
+ | |||
+ | |||
+ | ===== O framework ===== | ||
+ | |||
+ | O **ipar** gerencia a chamada de tarefas em nodos do cluster segundo uma lista criada pela aplicação a ser paralelizada (esta será chamada de apenas de aplicação no decorrer do texto). A aplicação consiste de um programa escrito em Java que deve seguir uma estrutura bem definida. Quando o ipar é iniciado, este executa um shell script que deve conter a chamada do clall da aplicação que tiver a função main. Esta estrutura será descrita na seção //Aplicação a ser paralelizada//. | ||
+ | |||
+ | |||
+ | ==== Estrutura Básica ==== | ||
+ | |||
+ | Tem uma estrutura básica organizada da seguinte forma: | ||
+ | |||
+ | Tem uma lista com os nodos a serão utilizados, que é passada como parâmetro de entrada. Sendo o primeiro da lista o nodo onde o gerente está rodando. | ||
+ | |||
+ | //Lista de nodos//: é um Vector Vectror. Cada posição do Vector "pai" representa um nodo (Vector filho). O Vector filho possui dois elementos: | ||
+ | |||
+ | * elemento 1: String: host do nodo | ||
+ | * elemento 2: Byte: status do nodo (0: aguardando; 1: processando) | ||
+ | |||
+ | //Lista de Tarefas//: é um vector em que cada elemento é outro vector. No vector principal ("pai"), cada indice corresponde a uma tarefa a ser executada e no vector interno ("filho" - cada indice do vector principal), tem três elementos: | ||
+ | |||
+ | * elemento 1: tipo String - corresponde a tarefa. Será passada para o executa quando a tarefa for distribuída | ||
+ | * elemento 2: tipo byte - corresponde ao status da tarefa. | ||
+ | * Valor 0: aguardando | ||
+ | * Valor 1: processando | ||
+ | * Valor 2: finalizada | ||
+ | |||
+ | * elemento 3: id do nodo que esta processando a tarefa, que é o índice do Vector "pai" da lista de nodos | ||
+ | |||
+ | * elemento 4: tipo tempo - tempo de inicio da tarefa | ||
+ | |||
+ | * elemento 5: tipo tempo - tempo gasto na realização da tarefa | ||
+ | |||
+ | O identificador da tarefa é o próprio indice do vector principal. | ||
+ | |||
+ | Este vector é prenchido em tempo de execução quando for chamado o método rmi "listaTarefas([]listaTarefas)". **Deve** ser chamado no início do programa a ser paralelizado(método "inicia()") e **pode** ser chamado pelo método "executa(parametros)" | ||
+ | |||
+ | De tempos em tempos este vector com as tarefas deve ser gravado em arquivo para que se possa monitorar o status do processamento | ||
+ | |||
+ | ==== Algorítmo: ==== | ||
+ | |||
+ | início | ||
+ | |||
+ | * start do servidor rmi | ||
+ | * chamada do método "inicia" (pode ser no nodo local ou em outro) | ||
+ | * aguarda a conexao rmi para informar a lista de tarefas | ||
+ | * monta a lista de tarefas | ||
+ | * inicio do escalonador para distribuir as tarefas | ||
+ | * verifica se tem nodo livre | ||
+ | * se tem, varre lista de tarefas a procura de uma tarefa a ser distribuída | ||
+ | * se encontra tarefa, encaminha para o nodo disponível (chama vis rsh um script rum_cliente que deve chamar do metodo "executa" do programa a ser paralelizado.), muda o status do nodo para processando e atribui o id do nodo a tarefa | ||
+ | * quando todas as tarefas forem finalizadas, chama o metodo "finaliza" do programa a ser paralelizado. | ||
+ | |||
+ | |||
+ | ===== Aplicação a ser paralelizada ===== | ||
Deve ter no mínimo 3 métodos: //inicia(); finaliza(); executa(parametros)// | Deve ter no mínimo 3 métodos: //inicia(); finaliza(); executa(parametros)// | ||
Line 12: | Line 67: | ||
Qualquer um dos métodos acima, após concluir sua computação, deve fazer uma conexão rmi retornando os resultados de suas computações para o gerente. Apenas uma conexão rmi deve ser realizada por cada computação, e após ela ser feita o programa deve ser finalizado. | Qualquer um dos métodos acima, após concluir sua computação, deve fazer uma conexão rmi retornando os resultados de suas computações para o gerente. Apenas uma conexão rmi deve ser realizada por cada computação, e após ela ser feita o programa deve ser finalizado. | ||
- | === Descrição dos métodos === | + | ==== Descrição dos métodos ==== |
**Método //inicia()//** | **Método //inicia()//** | ||
Line 49: | Line 104: | ||
No caso de redistribuíção de tarefas será subentendido que a tarefa foi concluída com exito e foi quebrada em outras subtarefas. | No caso de redistribuíção de tarefas será subentendido que a tarefa foi concluída com exito e foi quebrada em outras subtarefas. | ||
- | + | ||
- | === O que pode ser uma tarefa === | + | ==== O que pode ser uma tarefa ==== |
Um exemplo de tarefa seria uma figura ao qual deve ser aplicado um algorítmo. Portanto o método "inicia" pode particionar uma determinada imagem em várias subimagens para poder computar cada uma em um nodo diferente. Desta maneira o nome de cada subimagem pode ser a tarefa, logo quando o "gerente" distribuir as tarefas ele vai passar o seu nome para o método executa. depois de todas as tarefas terem sido executadas, o método "finaliza" é chamado para computar os resultados parciais que devem obrigatoriamente estarem armazenados em arquivos. | Um exemplo de tarefa seria uma figura ao qual deve ser aplicado um algorítmo. Portanto o método "inicia" pode particionar uma determinada imagem em várias subimagens para poder computar cada uma em um nodo diferente. Desta maneira o nome de cada subimagem pode ser a tarefa, logo quando o "gerente" distribuir as tarefas ele vai passar o seu nome para o método executa. depois de todas as tarefas terem sido executadas, o método "finaliza" é chamado para computar os resultados parciais que devem obrigatoriamente estarem armazenados em arquivos. | ||
- | ==== O programa gerente ==== | + | ==== Modelo de implementação do Programa a ser paralelizado ==== |
- | + | ||
- | É quem controla a distribuíção das tarefas nos nodos. Sua impmementação é feita em java. | + | |
- | + | ||
- | === estrutura básica === | + | |
- | + | ||
- | Tem uma estrutura básica organizada da seguinte forma: | + | |
- | + | ||
- | Tem uma lista com os nodos a serão utilizados, que é passada como parâmetro de entrada. Sendo o primeiro da lista o nodo onde o gerente está rodando. | + | |
- | + | ||
- | //Lista de nodos//: é um Vector Vectror. Cada posição do Vector "pai" representa um nodo (Vector filho). O Vector filho possui dois elementos: | + | |
- | + | ||
- | * elemento 1: String: host do nodo | + | |
- | * elemento 2: Byte: status do nodo (0: aguardando; 1: processando) | + | |
- | + | ||
- | //Lista de Tarefas//: é um vector em que cada elemento é outro vector. No vector principal ("pai"), cada indice corresponde a uma tarefa a ser executada e no vector interno ("filho" - cada indice do vector principal), tem três elementos: | + | |
- | + | ||
- | * elemento 1: tipo String - corresponde a tarefa. Será passada para o executa quando a tarefa for distribuída | + | |
- | * elemento 2: tipo byte - corresponde ao status da tarefa. | + | |
- | ** Valor 0: aguardando | + | |
- | ** Valor 1: processando | + | |
- | ** Valor 2: finalizada | + | |
- | + | ||
- | * elemento 3: id do nodo que esta processando a tarefa, que é o índice do Vector "pai" da lista de nodos | + | |
- | + | ||
- | * elemento 4: tipo tempo - tempo de inicio da tarefa | + | |
- | + | ||
- | * elemento 5: tipo tempo - tempo gasto na realização da tarefa | + | |
- | + | ||
- | O identificador da tarefa é o próprio indice do vector principal. | + | |
- | + | ||
- | Este vector é prenchido em tempo de execução quando for chamado o método rmi "listaTarefas([]listaTarefas)". **Deve** ser chamado no início do programa a ser paralelizado(método "inicia()") e **pode** ser chamado pelo método "executa(parametros)" | + | |
- | + | ||
- | De tempos em tempos este vector com as tarefas deve ser gravado em arquivo para que se possa monitorar o status do processamento | + | |
- | + | ||
- | === Algorítmo: === | + | |
- | + | ||
- | + | ||
- | início | + | |
- | + | ||
- | * start do servidor rmi | + | |
- | * chamada do método "inicia" (pode ser no nodo local ou em outro) | + | |
- | * aguarda a conexao rmi para informar a lista de tarefas | + | |
- | * monta a lista de tarefas | + | |
- | * inicio do escalonador para distribuir as tarefas | + | |
- | * verifica se tem nodo livre | + | |
- | * se tem, varre lista de tarefas a procura de uma tarefa a ser distribuída | + | |
- | * se encontra tarefa, encaminha para o nodo disponível (chama vis rsh um script rum_cliente que deve chamar do metodo "executa" do programa a ser paralelizado.), muda o status do nodo para processando e atribui o id do nodo a tarefa | + | |
- | * quando todas as tarefas forem finalizadas, chama o metodo "finaliza" do programa a ser paralelizado. | + | |
- | + | ||
- | ==== Modelo de implementação do Programa a ser paralelizado. ==== | + | |
Line 239: | Line 244: | ||
</code> | </code> | ||
- | |||