Implementação de MPI em Java

Texto

(1)

Implementac¸˜ao de MPI em Java

Claudio Schepke cschepke@inf.ufrgs.br

1

PPGC - Instituto de Inform´atica - UFRGS Programac¸˜ao com Objetos Distribu´ıdos

Professor Cl´audio Geyer

Resumo. MPI ´e um padr˜ao para a comunicac¸˜ao paralela e distribu´ıda ampla- mente utilizado em aplicac¸˜oes desenvolvidas em linguagem como Fortran, C e C++. Com o surgimento de Java, in´umeras propostas foram apresentadas para a utilizac¸˜ao de MPI nessa linguagem. Estas propostas est˜ao baseadas na cha- mada de m´etodos nativos ou na utilizac¸˜ao de implementac¸˜oes especialmente de- senvolvidas com os recursos de comunicac¸˜ao existentes em Java. Neste sentido, esse trabalho apresenta algumas bibliotecas desenvolvidas para a utilizac¸˜ao de MPI em Java, buscando destacar as diferentes estrat´egias de comunicac¸˜ao es- colhidas em cada caso.

1. Introduc¸˜ao

Java ´e uma linguagem de programac¸˜ao orientada o objetos que possibilita a f´acil abstrac¸˜ao de um problema, al´em de disponibilizar recursos para a programac¸˜ao distribu´ıda (RMI e sockets) e concorrente (threads) [6, 5]. No entanto, a linguagem n˜ao oferece ne- nhum recurso de alto n´ıvel para a comunicac¸˜ao via troca de mensagens, voltado para a computac¸˜ao paralela, que suporte diretamente o modelo SPMD (Single Program Mul- tiple Data) de programac¸˜ao. Neste contexto, diversos trabalhos foram desenvolvidos para que fosse poss´ıvel explorar esse paradigma de comunicac¸˜ao. Estas propostas est˜ao baseadas em modificac¸˜oes dos mecanismos disponibilizados pela linguagem (RMI, Ja- vaSpaces), atrav´es do desenvolvimento de novas metodologias de programac¸˜ao para- lela [11, 10, 4], como tamb´em pela adoc¸˜ao de recursos disponibilizados para outras lin- guagens de programac¸˜ao, tais como PVM e MPI [3, 13].

A adoc¸˜ao de recursos de comunicac¸˜ao existentes em outras linguagens possui al- gumas vantagens. O fato desses modelos ter sido validado e utilizado por um grande n´umero de programadores garante uma f´acil adaptac¸˜ao, tanto na implementac¸˜ao como na utilizac¸˜ao dos recursos em Java. Este ´e o caso de MPI, que atualmente ´e um padr˜ao para a programac¸˜ao paralela. A utilizac¸˜ao de MPI em Java pode ser feita atrav´es de diferentes formas, tanto atrav´es do acesso `a vers˜oes j´a existentes, compiladas para uma determinada arquitetura, como atrav´es de implementac¸˜oes feitas diretamente em Java [2].

Este trabalho apresenta algumas bibliotecas MPI propostas para Java, buscando

descrever as principais caracter´ısticas e estrat´egias de implementac¸˜ao adotadas em cada

uma delas. A pr´oxima sec¸˜ao descreve as duas abordagens adotadas para a utilizac¸˜ao de

MPI em Java. Na seq¨uˆencia s˜ao discutidas algumas implementac¸˜oes que exemplificam

essas abordagens. A sec¸˜ao seguinte resume as caracter´ısticas encontradas nessas bibli-

otecas, buscando relacionar as diferenc¸as existentes entre as ferramentas. Por fim s˜ao

apresentadas as conclus˜oes obtidas com a realizac¸˜ao deste trabalho.

(2)

2. Implementac¸˜ao de MPI em Java

MPI (Message Passing Interface) [13] ´e uma especificac¸˜ao para a implementac¸˜ao de bibli- otecas de comunicac¸˜ao via troca de mensagens. A especificac¸˜ao prop˜oem a padronizac¸˜ao de func¸˜oes que realizam a comunicac¸˜ao e sincronizac¸˜ao de processos. Para tanto, MPI define diferentes formas de comunicac¸˜ao, tais como comunicac¸˜oes ponto a ponto, cole- tivas e em grupos, as quais s˜ao realizadas atrav´es dum amplo conjunto de func¸˜oes. Es- tas operac¸˜oes podem ser disponibilizadas em diferentes implementac¸˜oes como MPICH, LAM-MPI e WMPI, cada qual expressando o mesmo conjunto de funcionalidades.

Uma das formas de utilizac¸˜ao de MPI em Java ´e atrav´es de JNI (Java Native Inter- face, que possibilita o acesso `as funcionalidades compiladas para uma arquitetura nativa.

Desta forma, uma das abordagens de implementac¸˜ao adotadas est´a no desenvolvimento de interfaces que realizem a invocac¸˜ao das func¸˜oes compiladas quando um m´etodo MPI

´e chamado em Java. Essa escolha possibilita obter um bom n´ıvel de desempenho nas comunicac¸˜oes em relac¸˜ao as implementac¸˜oes nativas, gerando apenas um sobrecusto de- vido `a manipulac¸˜ao de m´etodos em Java. Por outro lado, um ponto negativo ´e o fato de que a portabilidade caracter´ıstica de Java ´e perdida, uma vez que o uso das interfaces limita o uso da linguagem a uma determinada distribuic¸˜ao de MPI.

Outra forma poss´ıvel para a utilizac¸˜ao de MPI em Java ´e atrav´es de implementac¸˜oes desenvolvidas diretamente nessa linguagem. Neste caso a portabilidade

´e garantida, no entanto os custos de comunicac¸˜ao s˜ao geralmente maiores. Este fato ocorre devido a ineficiˆencia na serializac¸˜ao dos dados e na inexistˆencia de m´etodos de comunicac¸˜ao de dados tipados [12]. A transmiss˜ao dos dados em Java ocorre atrav´es dos m´etodos java.io.InputStream e java.io.OutputStream. Estes m´etodos permitem que sejam transmitidos apenas um vetor de bytes. Para a transmiss˜ao de outros tipos de dados

´e necess´ario a serializac¸˜ao dos mesmos, o que ´e bastante ineficiente em Java uma vez que

´e necess´ario a c´opia de uma regi˜ao da mem´oria. Assim, a partir da vers˜ao 1.4, este pro- blema foi resolvido com a incorporac¸˜ao da classe Java.nio, o que permitiu o surgimento de bibliotecas que apresentam mecanismos de comunicac¸˜ao mais eficientes [12].

3. Implementac¸˜oes baseadas na chamada de m´etodos nativos

Nesta sec¸˜ao s˜ao descritas as implementac¸˜oes de JavaMPI e mpiJava, as duas principais interfaces de acesso as func¸˜oes de MPI nativas. Para cada uma delas s˜ao descritas as caracter´ısticas e os testes de desempenho apresentados em artigos publicados.

3.1. JavaMPI

JavaMPI ´e uma das primeiras interfaces que permite ligar Java a uma implementac¸˜ao de MPI [8]. Para tanto, ´e utilizado o gerador JCI (Java-to-C Interface), respons´avel pela criac¸˜ao da interface a partir do arquivo header de uma implementac¸˜ao de MPI. Desta forma, JCI gera arquivos com as classes Java e as declarac¸˜oes dos m´etodos nativos, al´em de func¸˜oes stub em C e arquivos de shell script, utilizados na compilac¸˜ao e ligac¸˜ao do c´odigo `a implementac¸˜ao de MPI. Atrav´es dessa t´ecnica, JavaMPI permite ligar dinami- camente uma biblioteca MPI `a m´aquina virtual Java (JVM) em tempo de execuc¸˜ao, pos- sibilitando o acesso a todas as funcionalidades de uma implementac¸˜ao completa de MPI atrav´es de JNI (Java Native Interface).

Do ponto de vista do programador, o estilo de programac¸˜ao em JavaMPI ´e um

pouco mais complicado do que os apresentados em outras linguagens. Por exemplo, o

acesso a todas as constantes de MPI ´e feito atrav´es da instanciac¸˜ao de um objeto da classe

de constantes. O mesmo ocorre `as func¸˜oes de MPI, que s˜ao invocadas atrav´es dos m´etodos

(3)

de outra classe espec´ıfica, respons´avel pela definic¸˜ao de todos os m´etodos. J´a os tipos primitivos recebem outra nomenclatura, tentando contornar o fato de que os tipos em Java e C podem ser representados por diferentes tamanhos.

A validac¸˜ao do modelo apresentado em [8] mostra que os tempos de comunicac¸˜ao e execuc¸˜ao em Java para a implementac¸˜ao paralela do programa IS (ordenamento inteiros) do benchmark NAS s˜ao bastante altos. No entanto, a medida em que um n´umero maior de processadores ´e utilizado, a diferenc¸a entre os tempos das implementac¸˜oes em C e Java diminui. Para o caso em que s˜ao utilizados 16 processadores, o tempo de comunicac¸˜ao em Java fica em m´edia duas vezes maior.

3.2. mpiJava

A interface mpiJava busca prover uma completa programac¸˜ao orientac¸˜ao a objetos, dis- ponibilizando tamb´em o acesso a todas as funcionalidades de uma implementac¸˜ao t´ıpica de MPI [1]. O acesso `as func¸˜oes nativas de MPI tamb´em ´e feito atrav´es de JNI, conforme ocorre em JavaMPI. No entanto, a interface Java n˜ao ´e gerada automaticamente. J´a a estrutura da biblioteca mpiJava est´a organizada numa hierarquia de classes semelhante as implementac¸˜oes realizadas em C++, onde em cada uma delas s˜ao definidas determinados tipos de func¸˜oes, conforme as caracter´ısticas das operac¸˜oes. No topo da hierarquia existe uma classe chamada mpi, que precisa ser inclu´ıda no c´odigo-fonte escrito em Java para que seja poss´ıvel o acesso aos m´etodos.

A implementac¸˜ao de mpiJava possui algumas modificac¸˜oes em relac¸˜ao `as implementac¸˜oes nativas na lista de argumentos. Isso ´e feito devido ao fato de que n˜ao

´e poss´ıvel a passagem de argumentos por referˆencia em Java. No caso do retorno de um vetor, geralmente s˜ao transmitidos apenas a seq¨uˆencia de dados, sem o uso de uma estru- tura mais complexa. J´a para as func¸˜oes que deveriam retornar um flag de status ´e feito o retorno de um objeto, cujo valor ´e null caso algum erro de operac¸˜ao tenha ocorrido.

Quanto a programac¸˜ao, o suporte de mpiJava em relac¸˜ao `a JavaMPI ´e melhor, podendo utilizar diferentes implementac¸˜oes de MPI como substrato.

Os resultados de um pingue-pongue apresentados em [1] mostram que o desem- penho da implementac¸˜ao apresenta um aproveitamento da largura de banda menor para mensagens com at´e 128 KB em testes realizados com mem´oria compartilhada, tanto sob as implementac¸˜oes MPICH como WMPI, sendo que a ´ultima apresentou um desempe- nho melhor. O mesmo acontece em sistemas com mem´oria distribu´ıda. No entanto, a implementac¸˜ao utilizando WMPI apresentou um desempenho mais pr´oximo da vers˜ao nativa. J´a para os casos em que s˜ao utilizados tamanhos de mensagem maiores, ambos tendem a ter uma vaz˜ao de dados semelhante.

4. Implementac¸˜oes utilizando mecanismos de comunicac¸˜ao de Java

A utilizac¸˜ao de MPI atrav´es de bibliotecas desenvolvidas em Java pode ser feita atrav´es de diferentes implementac¸˜oes. Cada uma delas explora uma determinada abordagem de comunicac¸˜ao, resultando em diferentes valores na vaz˜ao de dados, conforme ser´a visto nas implementac¸˜oes de MPIJ, PJMPI, JMPI e MPJava a seguir.

4.1. MPIJ

MPIJ ´e uma implementac¸˜ao completamente desenvolvida em Java, que busca apresentar

uma boa relac¸˜ao de desempenho em relac¸˜ao as implementac¸˜oes nativas [7]. Para tanto, a

serializac¸˜ao de um vetor de dados ´e feita atrav´es do uso de m´etodos nativos, uma vez que a

serializac¸˜ao em Java ´e um processo que apresenta um grande custo, devido a necessidade

(4)

de c´opia de mem´oria. Assim, quando MPIJ ´e iniciada, ela primeiramente busca uma biblioteca de serializac¸˜ao nativa. Caso nenhuma biblioteca for encontrada, MPIJ faz uso dos recursos existentes em Java.

A implementac¸˜ao de MPIJ busca aumentar o desempenho na comunicac¸˜ao sob diferentes formas. Uma delas consiste em explorar o compartilhamento de vari´aveis em sistemas multiprocessados, o que permite a c´opia direta de dados entre buffers, aumen- tando eficiˆencia em ambientes com essa caracter´ıstica. MPIJ prop˜oem tamb´em o envio de dados tipados, uma vez que esta seria uma alternativa que dispensaria o processo de serializac¸˜ao da forma em que ele ´e feito em Java. A adoc¸˜ao dessa t´ecnica n˜ao prenderia a biblioteca a um determinado ambiente, como ocorre nos casos em que a serializac¸˜ao ´e feita atrav´es de m´etodos nativos.

Os testes de desempenho, conforme descritos em [7], mostram que os tempos de ping-pong e ping-ping (m´aximo de largura de banda quando duas mensagens s˜ao trans- mitidas em direc¸˜oes opostas) s˜ao semelhantes em sistemas com mem´oria distribu´ıda. J´a para sistemas com mem´oria compartilhada a vaz˜ao de MPIJ ´e um pouco menor que o de WMPI. Isto se explica devido a diferenc¸a de latˆencia que existe em cada um desses ambi- entes, sendo menor para MPIJ num sistema com mem´oria distribu´ıda. Outros resultados demonstram que a utilizac¸˜ao de m´etodos de serializac¸˜ao nativos aumenta a vaz˜ao para ti- pos primitivos, tanto em relac¸˜ao a WMPI, quanto em relac¸˜ao a serializac¸˜ao feita em Java.

Quanto aos testes realizados com a func¸˜ao barreira, em alguns casos a implementac¸˜ao com MPIJ se mostrou melhor.

4.2. PJMPI

PJMPI ´e uma implementac¸˜ao de MPI puramente desenvolvida em Java, onde a comunicac¸˜ao entre processos ´e feita atrav´es da utilizac¸˜ao de sockets. [14]. Em cada n´o existe um processo ServerSocket, respons´avel por escutar continuamente uma de- terminada porta. Quando uma solicitac¸˜ao ´e feita por uma central de controle, ´e ge- rada uma comunicac¸˜ao ponto-a-ponto atrav´es de sockets. Assim, a comunicac¸˜ao ´e feita atrav´es dos m´etodos DataInputStream e DataOutputStream. De forma especial, para as comunicac¸˜oes n˜ao bloqueantes s˜ao usadas threads e duas filas para envio e recebimento de dados.

Algumas caracter´ısticas espec´ıficas da biblioteca s˜ao:

• A existˆencia de todos os tipos de dados b´asicos de MPI, al´em da possibilidade de criac¸˜ao de novos tipos baseada numa classe abstrata;

• O uso de vetores que substituem o acesso aos dados atrav´es de ponteiros;

O uso da classe Object para o armazenamento de diferentes tipos de vetores;

• A recuperac¸˜ao de um tipo de dados atrav´es de um m´etodo espec´ıfico;

• A simplificac¸˜ao da chamada dos m´etodos, explorando o polimorfismo de Java;

• O mecanismo de leitura dinˆamica de uma classe que ´e enviada pela central de controle.

Os resultados apresentados em [14] apontam para o fato de que desempenho de PJMPI se apresentou similar ao de WMPI para o programa cpi, sendo levemente superior.

J´a para a multiplicac¸˜ao de matrizes a diferenc¸a de tempo ´e bastante expressiva, tanto pelas operac¸˜oes com vetores serem mais lentas em Java, como devido ao custo de serializac¸˜ao dos dados.

4.3. JMPI

JMPI ´e uma implementac¸˜ao de MPI que utiliza RMI, serializac¸˜ao de objetos e

introspecc¸˜ao para a troca de mensagens [9]. A estrutura de JMPI ´e formada pela API

(5)

de MPI, respons´avel pela definic¸˜ao das func¸˜oes, pela camada de comunicac¸˜ao que de- fine o n´ucleo de primitivas de comunicac¸˜ao e pela JVM, respons´avel pela compilac¸˜ao e execuc¸˜ao do c´odigo bin´ario. A camada de comunicac¸˜ao da biblioteca ´e formada por m´ultiplas threads, sendo respons´avel pela inicializac¸˜ao da JVM, por coordenar as mensa- gens entre os processos e pelo conjunto de primitivas de comunicac¸˜ao. As mensagens s˜ao passadas atrav´es dos argumentos das chamadas RMI. Para as chamadas ass´ıncronas s˜ao utilizadas threads, respons´aveis pela comunicac¸˜ao n˜ao bloqueante.

JMPI apresenta recursos para a programac¸˜ao e serializac¸ ˜ao eficiente de dados.

No caso da programac¸˜ao, a biblioteca apresenta suporte a vetores multi-dimensionais armazenados seq¨uencialmente na mem´oria. Atrav´es da introspecc¸˜ao ´e poss´ıvel definir o n´umero de dimens˜oes desses vetores.J´a a serializac¸˜ao eficiente ´e feita atrav´es de KaRMI, um recurso desenvolvido pela SUN capaz de melhor tamb´em o desempenho das chamadas de RMI [9].

A validac¸˜ao da implementac¸˜ao foi feita atrav´es de comparac¸˜oes entre mpiJava, JMPI usando RMI e JMPI usando KaRMI, conforme apresentado em [9]. Os resultados mostram que a implementac¸˜ao utilizando KaRMI tem uma vaz˜ao de dados significativa- mente melhor em relac¸˜ao a implementac¸˜ao com RMI numa implementac¸˜ao de ping-pong.

No entanto, o uso de mpiJava apresenta uma vaz˜ao melhor para mensagens com tamanhos de at´e 30 KBs. Outros valores obtidos numa implementac¸˜ao paralela de fractais de Man- delbrot mostram que o tempo de execuc¸˜ao de JMPI ´e um pouco mais de duas vezes mais lento.

4.4. MPJava

MPJava tamb´em ´e uma implementac¸˜ao desenvolvida completamente em Java, mas que n˜ao realiza acesso a m´etodos nativos para a serializac¸˜ao de objetos [12]. Ao inv´es disso, a biblioteca faz uso dos recursos disponibilizados pelo pacote Java.nio, integrado a lin- guagem a partir da vers˜ao 1.4. O pacote permite a c´opia direta de tipos nativos de/para buffers, algo que n˜ao era poss´ıvel de ser feito com vetores atrav´es do pacote Java.io. O novo pacote possibilita tamb´em o acesso direto dos buffers de Java aos buffers alocados numa pilha em C, os quais n˜ao ser˜ao removidos pelo coletor de lixo.

MPJava baseia-se no fato de que cada m´aquina possui uma JVM funcionando e que a comunicac¸˜ao entre elas ´e feita atrav´es dum TCP SocketChannel do pacote NIO.

A rede de comunicac¸˜ao criada a partir de TCP SocketChannel ´e inicializada por um n´o mestre, que serve meramente de coordenador dos n´os escravos. Para tanto, duas pos- sibilidades podem ser adotadas: A primeira ´e a chamada de lamexec, um utilit´ario da implementac¸˜ao LAM-MPI. A segunda consiste na execuc¸˜ao de daemons nos n´os escra- vos, os quais esperam uma solicitac¸˜ao do n´o mestre atrav´es dum canal multicast. Os n´os que respondem a solicitac¸˜ao recebem uma mensagem com uma lista de parˆametros, os quais s˜ao utilizados na execuc¸˜ao da m´aquina virtual invocada atrav´es do m´etodo java.lang.Runtime.exec().

Outras caracter´ısticas da implementac¸˜ao s˜ao:

A capacidade de uma ´unica thread controlar v´arios sockets de comunicac¸˜ao, evi- tando que uma sobrecarga muito grande fosse gerada no gerenciamento caso cada socket fosse gerenciado por uma thread;

A existˆencia de dois algoritmos para broadcast: concorrente e paralelo. Na implementac¸˜ao concorrente, cada processo possui uma thread de envio e recebi- mento. Na paralela, a transmiss˜ao dos dados ocorre de forma logar´ıtmica. sendo utilizado somente uma thread para isso;

A alocac¸˜ao pr´evia de buffers, buscando aumentar o desempenho e facilitar o ge-

renciamento dos recursos.

(6)

Os resultados mostrados em [12] apontam para uma melhor vaz˜ao de MPJava em relac¸˜ao a utilizac¸˜ao de LAM-MPI e java.io nos testes de ping-pong. Para os valo- res obtidos atrav´es da comunicac¸˜ao todos-com-todos, o desempenho de MPJava ´e me- lhor que o de LAM-MPI quando um n´umero maior de processos ´e utilizado e quando as mensagens n˜ao s˜ao muito pequenas. Os valores tamb´em mostram que o desempe- nho da implementac¸˜ao usando o algoritmo concorrente de broadcast ´e melhor. J´a numa comparac¸˜ao entre execuc¸˜oes de implementac¸˜oes do Gradiente Conjugado em Fortran e em Java os tempos de broadcast obtidos em Java foram bem menores, diminuindo a relac¸˜ao a medida em que um n´umero maior de processadores era utilizado. Por outro lado os tempos das operac¸˜oes de reduc¸˜ao se mostraram favor´aveis a implementac¸˜ao em Fortran.

5. Avaliac¸˜ao das ferramentas

Num primeiro momento, as implementac¸˜oes baseadas no acesso a m´etodos nativos via JNI apresentam-se como uma soluc¸˜ao capaz de prover formas de comunicac¸˜ao eficientes.

Este ´e o caso das interfaces JavaMPI e mpiJava, as implementac¸˜oes mais conhecidas para esta abordagem. A primeira delas foi facilmente criada atrav´es dum gerador JCI. No entanto, a implementac¸˜ao n˜ao faz um uso pleno da orientac¸˜ao a objetos, sendo que a sua utilizac¸˜ao ´e um pouco mais dif´ıcil em relac¸˜ao a mpiJava. Para o segundo caso tem-se uma implementac¸˜ao que explora melhor a orientac¸˜ao a objetos. al´em do fato de mpiJava possibilitar a utilizac¸˜ao de diferentes implementac¸˜oes de MPI. Um aspecto negativo na utilizac¸˜ao das interfaces ´e de que estas n˜ao s˜ao port´aveis, uma vez que s˜ao realizadas chamadas para uma determinada implementac¸˜ao nativa. Al´em disso, os resultados que foram publicados demonstram que os tempos de comunicac¸˜ao s˜ao geralmente um pouco piores.

As implementac¸˜oes desenvolvidas completamente em Java buscam superar di- versos limitantes da linguagem. Uma delas ´e o custo de serializac¸˜ao de objetos e tipos nativos, que precisam ser transformados num vetor de bytes primeiramente. Aliado a isso, existe a falta de m´etodos que possibilitam a comunicac¸˜ao de tipos nativos. A Ta- bela 1 apresenta os mecanismos de comunicac¸˜ao adotados para cada uma das bibliotecas de comunicac¸˜ao analisadas neste trabalho.

Tabela 1 - Mecanismos de comunicac¸˜ao adotados nas bibliotecas MPI de Java Biblioteca Mecanismo

MPIJ Serializac¸˜ao atrav´es de m´etodos nativos e uso mem´oria compartilhada PJMPI Uso de Sockets e serializac¸˜ao de Java

JMPI Uso de RMI e KaRMI

MPJava Pacote Java.nio: c´opia de tipos nativos

Analisando a tabela, pode-se observar que a estrat´egia adotada por MPIJ ´e bastante simples, n˜ao utilizando a forma de serializac¸˜ao proposta por Java. Mesmo assim, este tipo de operac¸˜ao agrega os custos de chamada dos m´etodos. MPIJ tamb´em explora o fato da mem´oria ser compartilhada em arquiteturas multiprocessadas. Desta forma, n˜ao

´e necess´aria nenhum tipo de comunicac¸˜ao via rede. Os resultados dessas abordagens demonstram que a latˆencia da comunicac¸˜ao entre diferentes processadores ´e menor em relac¸˜ao a outras implementac¸˜oes devido a eficiˆencia da serializac¸˜ao.

Diferentemente de MPIJ, PJMPI utiliza a serializac¸˜ao t´ıpica de Java, realizando a

comunicac¸˜ao por sockets. PJMPI ´e uma implementac¸˜ao que explora somente recursos de

Java, visto que sockets e threads s˜ao disponibilizados diretamente pela API. Devido a este

(7)

fato, o desempenho da biblioteca apresenta-se bem inferior as implementac¸˜oes nativas de MPI. J´a a implementac¸˜ao de JMPI ´e feita sob RMI, um recurso de comunicac¸˜ao para sistemas distribu´ıdos. Os resultados obtidos mostram que essa abordagem apresenta- se bastante ruim, uma vez que a comunicac¸˜ao de RMI ´e s´ıncrona. Para a obtenc¸˜ao do assincronismo s˜ao utilizadas threads, gerando um sobrecusto a mais nas comunicac¸˜oes.

Todas as bibliotecas citadas anteriormente possuem como substrato de comunicac¸˜ao a classe Java.io. O mesmo n˜ao ocorre com MPJava, que utiliza a classe Java.nio para a chamada dos m´etodos de comunicac¸˜ao de mais baixo n´ıvel. Os testes comparativos feitos com implementac¸˜oes nativas e com Java.io demonstram o quanto estas introduc¸˜oes feitas em Java ajudam a diminuir a latˆencia na transmiss˜ao de dados, especialmente para mensagens grandes e que envolvem um n´umero maior de processado- res.

6. Conclus˜ao

Apesar de in´umeros esforc¸os terem sido apresentados para que fosse poss´ıvel a utilizac¸˜ao de MPI em Java, nota-se que a sua utilizac¸˜ao limitou-se apenas ao campo da pesquisa. Em parte, este fato ocorreu devido a falta de recursos espec´ıficos de programac¸˜ao voltados para a computac¸˜ao num´erica e, ao mesmo tempo, devido a existˆencia dos mesmos em linguagens de programac¸˜ao mais tradicionais, limitando assim a utilizac¸˜ao de Java. Outro motivo que pode ser considerado est´a no fato de que as primeiras implementac¸˜oes n˜ao conseguiram obter um bom n´ıvel de desempenho, sem ferir as caracter´ısticas b´asicas de Java.

Neste sentido, este trabalho contribui com uma an´alise de diferentes implementac¸˜oes de MPI para Java, mostrando que existem diferentes possibilida- des de implementac¸˜ao, tanto atrav´es do acesso a m´etodos nativos, como atrav´es de implementac¸˜oes puras em Java. De forma especial, cabe ressaltar a importˆancia das modificac¸˜oes inseridas na API Java atrav´es da classe Java.nio, o que possibilitou a c´opia de tipos nativos e, desta forma, melhorar o mecanismo de comunicac¸˜ao de Java.

Para trabalhos futuros pretende-se realizar a instalac¸˜ao das ferramentas, buscando realizar uma comparac¸˜ao pr´atica entre elas atrav´es de aplicac¸˜oes num´ericas t´ıpicas. Outra tarefa a ser feita ´e a an´alise de outras formas de comunicac¸ ˜ao paralelas, os quais exploram outros paradigmas de programac¸˜ao. Em termos de pesquisa, existe ainda a possibilidade de realizar modificac¸˜oes nas bibliotecas apresentadas, buscando extrair delas uma maior desempenho.

Referˆencias

[1] Mark Baker, Bryan Carpenter, Geoffrey Fox, Sung Hoon Ko, and Sang Lim. MPIJAVA:

An Object-Oriented JAVA Interface to MPI. In Proceedings of the 11 IPPS/SPDP’99 Workshops Held in Conjunction with the 13th International Parallel Processing Symposium and 10th Symposium on Parallel and Distributed Processing, pages 748–762, London, UK, 1999. Springer-Verlag.

[2] Bryan Carpenter, Vladimir Getov, Glenn Judd, Anthony Skjellum, and Geoffrey Fox.

MPJ: MPI-like message passing for Java. Concurrency: Practice and Experience, 12(11):1019–1038, 2000.

[3] A. Geist, A. Beguelin, J. Dongarra, W. Jiang, R. Manchek, and V. Sunderam. PVM: Pa-

rallel Virtual Maching - A User’s Guide and Tutorial for Networked Parallel Com-

puting. The MIT Press, Cambridge, Massachusetts, 1994.

(8)

[4] Paul A. Gray and Vaidy S. Sunderam. IceT: distributed computing and Java. Concur- rency: Practice and Experience, 9(11):1161–1167, 1997.

[5] Gregory R. Andrews. Foundations of Multithreaded, Parallel, and Distributed Program- ming. Addison-Wesley, USA, 2001.

[6] Paul Hyde. Java Thread Programming. Sams Publishing, Indianapolis, Indiana, USA, 1999.

[7] Glenn Judd, Mark Clement, Quinn Snell, and Vladimir Getov. Design issues for effici- ent implementation of MPI in Java. In JAVA ’99: Proceedings of the ACM 1999 conference on Java Grande, pages 58–65, New York, NY, USA, 1999. ACM Press.

[8] Sava Mintchev and Vladimir Getov. Towards Portable Message Passing in Java: Binding MPI. In PVM/MPI, pages 135–142, 1997.

[9] Steven Morin, Israel Koren, and C. Mani Krishna. JMPI: Implementing the Message Passing Standard in Java. In IPDPS ’02: Proceedings of the 16th International Parallel and Distributed Processing Symposium, page 191, Washington, DC, USA, 2002. IEEE Computer Society.

[10] Hernˆani Pedroso, Luis M. Silva, and Jo˜ao Gabriel Silva. Web-based metacomputing with JET. Concurrency: Practice and Experience, 9(11):1169–1173, 1997.

[11] Michael Philippsen and Matthias Zenger. JavaParty — transparent remote objects in Java.

Concurrency: Practice and Experience, 9(11):1225–1242, November 1997.

[12] William Pugh and Jaime Spacco. MPJava: High-Performance Message Passing in Java using Java.nio. In Proceedings of MASPLAS 03 Mid-Atlantic Student Workshop on Programming Languages and Systems. Haverford College, 2003.

[13] Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker, and Jack Dongarra. MPI:

The Complete Reference. The MIT Press, Cambridge, Massachusetts, 1996.

[14] WeiQin Tong, Hua Ye, and WenSheng Yao. PJMPI: Pure Java Implementation of MPI.

vol. 01(no. 1):p. 533, 2000.

Imagem

Referências

temas relacionados :