Help Viewer
- Posted by acidx on August 1st, 2009 filed in geek
- 1 Comment »
Uma das funcionalidades que os usuários do HardInfo sempre pedem é a documentação online. Nem sempre é possível abrir um browser e mostrar a documentação, mas é o que está sendo feito hoje. Existem várias soluções para este problema, mas eu preferi fazer como frequentemente faço quando não estou satisfeito com as soluções que encontro: reinventando a roda.

Com pequenas alterações no egg-markdown (encontrado nos fontes do GNOME PackageKit), e uma versão estendida do GtkTextView que suporta hyperlinks, comecei a fazer um leitor de documentação leve, com o intuito de ser incluso em aplicações GTK+. Existem alguns problemas a serem resolvidos, entretanto:
- Inclusão de imagens;
- Suporte à internacionalização;
- Encontrar uma maneira eficiente de armazenar um arquivo de ajuda;
- Índice para busca textual (a princípio, somente para cabeçalhos nível 1 e 2).
Resolver o primeiro vai dar um bocado de trabalho, pois estender o markup do Pango é muito chato. Os links são implementados de uma forma meio hackish (usando atributos geralmente não usados do tag <span>) e eu não queria ter que implementar imagens dessa forma também.
Para os curiosos e interessados em ajudar a terminar a implementação, o código está disponível no github. Forks e pull requests são aceitos.
HardInfo 0.5.1
- Posted by acidx on April 20th, 2009 filed in geek
- 1 Comment »
Esqueci de avisar aqui, mas no dia 6 de Abril eu lancei a versão 0.5.1 do HardInfo.
Demorei tanto para lançar esta versão que, ao invés de numerá-la 0.4.3, resolvi numerá-la de 0.5. As novidades já anunciadas estão obviamente inclusas, mas existem algumas outras:
- Adição de novos benchmarks (Transformada Rápida de Fourier, N-Rainhas e Junção dos testes de cálculo de MD5 e SHA-1 em um único benchmark);
- Suporte para UPS da APC (através do apcupsd);
- Exibe informações sobre cada cache do processador;
- Porte para libsoup 2.4;
- Atualização da lista de fabricantes via rede;
- Correções de defeitos e vazamentos de memória.
Como sempre, todo o código fonte pode ser obtido no site ou diretamente do GitHub. Algumas distribuições já empacotaram esta versão (procure no gerenciador de pacote delas). Infelizmente, não consegui lançar esta versão a tempo dela aparecer no Ubuntu 9.04; mas pacotes prontos são distribuídos no GetDeb.
HardInfo 0.4.3 (beta)
- Posted by acidx on December 30th, 2008 filed in geek
- Comment now »
Fiz o upload do AutoPackage do beta do HardInfo 0.4.3. Esta versão inclui algumas novidades:
- Benchmarks com suporte a processadores multicore
- Suporte à interfaces de rede sem fio (mostra coisas como SSID, potência de transmissão, etc)
- Suporte à DMI (mostra o fabricante da placa mãe, etc)
- Exibição da alocação de recursos de I/O (portas de I/O, memória e DMA)
- Suporte à nova interface de USB do kernel 2.6
- Polimento da interface gráfica
- Melhorias na estabilidade, consumo de memória, etc
Está disponível aqui, por enquanto apenas para x86. Agradeço quem puder testar e comentar.
Laço “for” paralelo em C
- Posted by acidx on November 1st, 2008 filed in geek
- Comment now »
A OpenMP é fantástica: poderosa, fácil de usar e há suporte para vários compiladores. Entretanto, nem sempre é possível (ou desejável) usá-la; eu não gosto de aumentar o número de dependências dos meus programas, portanto tento encontrar soluções “feitas em casa” quando possível. Reinventar a roda também é uma boa maneira para aprender como as coisas funcionam.
Uma das funcionalidades que os usuários do HardInfo mais pedem é a realização de benchmarks levando em consideração máquinas multiprocessadas. Somente depois de conhecer o modelo fork-join que a OpenMP usa, que eu consegui implementar isso no HardInfo. Para quem não conhece esse modelo, é bem simples: em pontos paralelizáveis de seu código, n linhas de execução são criadas (aqui, n equivale ao número de núcleos) — e a execução linear do programa só retoma após um ponto de encontro. A criação das threads é o “fork”, e o ponto de encontro é o “join”.
A OpenMP facilita a vida provendo alguns #pragmas: o compilador com suporte a ela, então, gera o código responsável pela criação das threads e pelo ponto de encontro. Um desses pragmas é o “parallel for“, que divide um laço ao estilo do for em n linhas distintas. Essa construção tem suas limitações — só deve ser usada em laços vanilla: aqueles que apenas contam de um número até outro (a linguagem C permite fazer praticamente qualquer coisa num for e isso não é suportado pela OpenMP).
Como os benchmarks do HardInfo são geralmente feitos dentro de um laço for, repetindo testes pequenos várias vezes e contando o tempo (o que causa alguns problemas de precisão, mas ainda não consegui encontrar maneira melhor), recriar essa construção do OpenMP foi a saída mais natural.
A recriação foi trivial: o modelo é simples e eu tenho como obter o número de núcleos tranquilamente (afinal, o HardInfo é um programa de informações de hardware). Como a implementação foi feita sem requerer suporte do compilador (apenas usando funções), há a necessidade da criação de uma função, e da substituição do laço por uma chamada de função.
Por exemplo, se houvesse o interesse em paralelizar o seguinte código:
for (i = 0; i < 1000; i++) {
vetor[i] = i * 3;
}
Eu criaria uma função:
void preenche_vetor(guint start, guint end, gpointer data)
{
int *vetor = (int *)data;
for (i = start; i < end; i++) {
vetor[i] = i * 3;
}
}
E substituiria o laço por uma chamada ao paralelizador de for:
parallel_for(preenche_vetor, 0, 1000, vetor);
A função parallel_for então determinaria o número de núcleos, criaria uma linha de execução para cada elas, e se encarregaria de esperar pelo término de todas elas. Como bônus, ela também retorna o tempo gasto desde a criação das threads até o término de todas elas — ignorados neste exemplo.
Paralelizei dois benchmarks no HardInfo: o de compressão/descompressão com a zlib, e o ray tracer. O ganho, em um Pentium Dual Core (E2160), foi da ordem de 1,86x mais rápido no caso da zlib, e 1,41x no caso do ray tracer.
O código está disponível no repositório git mestre do HardInfo, disponível na minha conta do github.











