quarta-feira, 29 de abril de 2009

Paralelização: comando Wait()

O código ao lado exemplifica o uso do comando wait(). Este comando é útil para ajudar na paralelização que foi realizada com o auxílio do comando fork(). A função essencial do comando wait() é esperar o fim do processo filho para dá continuidade ao código (Atenção: ele deve ser utilizado no processo correto.) Ele é importante quando se faz necessário unir os resultados obtidos em cada processo. No programa ao lado temos um exemplo no qual cada processo realiza uma parte de uma conta e grava o resultado em arquivo.

O comando fork() não permite o compartilhamento fácil de memória, uma vez que ele duplica tudo (código e variáveis). Vamos ver como compatilhar memória utilizando Threads no futuro.

sexta-feira, 24 de abril de 2009

Recursividade.



Implementando um dos algoritmos de percolação que pretendo utilizar em minhas pesquisas (Leath Algorithm), fiquei espantado com o fato de que a versão recursiva do mesmo (que fiz por curiosidade), se revelou mais rápida que a versão não recursiva. Como um programador educado em linguagem estrutural (Pascal), sempre tive aversão à recursividade. Investigando a respeito, encontrei este artigo: Recursion versus non-recursion in Pascal: recursion can be faster.
Nele o autor argumenta que devido à modernidade dos computadores e dos compiladores (daquela época, 1987), alguns códigos podem ser mais rápidos quando utilizam recursividade: vivendo e aprendendo.

quarta-feira, 22 de abril de 2009

Quem sou eu?


Darlan Araújo Moreira, Doutor em Física pela UFRN (Currículo Lattes), Técnico em Informática pelo então CEFET-ETFRN (agora IFRN). Possuo bastante interesse em assuntos desafiadores ligados a qualquer área do conhecimento (desde que o problema seja solúvel computacionalmente :D ). De Abril/2005 até Janeiro/2009 fui o responsável pelo cluster do DFTE-UFRN.

terça-feira, 21 de abril de 2009

Paralelização


Uma maneira de paralelizar códigos em C++ (ou C) é utilizar o comando fork(). Este comando pertence à biblioteca unistd.h e retorna o tipo pid_t da biblioteca sys/types.h. No instante em que é executado, todo o código passa a rodar em duas instâncias: no processo pai e no processo filho. A forma de diferenciar ambos os processos, e com isso conseguir a paralelização, é obter o número do processo gerado. No processo filho, este será zero (uma vez que este não gerou ninguém. Foi gerado). Obviamente este tipo de paralelização é útil em sistemas com mais de um processador, uma vez que o sistema operacional distribui o processo entre processadores diferentes (sempre é assim?). Talvez seja útil no OpenMosix.