quinta-feira, 25 de outubro de 2012

Timeout para kernel CUDA que leva muito tempo para executar

Certo, antes de qualquer coisa, este é um post que deve ser usado com muito cuidado, pois ele pode ocasionar que sua tela "congele" se usado indiscriminadamente, pois nele vamos desabilitar a função do X que impede processos do display de rodarem por um tempo muio longo (longo eu quero dizer mais que alguns segundos).

Explicando o contexto no qual necessitei disto, você notará que é um caso bastante específico onde eu tenho certeza que a chance do meu processo travar era mínima.

Eu estou realizando testes de processamento  de propósito geral na placa gráfica como parte do meu TCC. Então, obviamente como eu desejo testar o limite da placa gráfica meus testes podem levar vários segundos.

Porém os drivers gráficos quando utilizados como displays (isto é, você tem um monitor ligado na placa gráfica) não permite que processos levem mais que alguns poucos segundos para serem executados e simplesmente mata os processos que ultrapassarem o limite definido.

Isto é realmente desejável quando você está rodando uma interface gráfica com o usuário e evitar que aquele programa que travou "congele" toda sua máquina e sua única solução seja desligar a força e religa-la.

Porém eu necessito rodar meus testes em uma NVIDIA GeForce GT520M, que possui a tecnologia Optimus (conforme detalhado no post anterior) e exige que em Linux seja utilizado o bumblebee para utilizar a placa gráfica. E o bumblebee depende de uma sessão do X para funcionar.

Então meus testes mais pesados falhavam pois o driver da NVIDIA os matava antes de seu fim.

O mais aconselhado para este caso é iniciar uma sessão sem o X ou utilizar duas placas gráficas diferentes. A primeira é inviável pois dependo do X para usar o bumblebee e a segunda não é possível para o meu notebook.

Por sorte a NVIDIA, provavelmente após ouvir muitas reclamações, disponibilizou uma opção de configuração do X para seus drivers, que desabilita esta funcionalidade e deve ser utilizada como último recurso, como é o meu caso. Confira na integra em: http://nvidia.custhelp.com/app/answers/detail/a_id/3029/~/using-cuda-and-x

Então basta abrir seu arquivo de configuração do X, no caso do bumblebee /etc/bumblebee/xorg.conf.nvidia, e adicionar a seguinte opção dentro do escopo de device:

Option "Interactive" "false"

Se você não estiver utilizando o bumblebee, reinicie sua máquina e pronto! Depois de fazer o que pretende, não se esqueça de reverter esta modificação. E lembrando mais uma vez isto é um último recurso quando nenhuma das outras opções é viável.

sexta-feira, 17 de agosto de 2012

Ubuntu 12.04 + NVIDIA 304.37 + Bumblebee

Os drivers da NVIDIA que os  repositórios oficiais do Ubuntu oferecem são conhecidamente desatualizados por uma questão de um minimo de estabilidade que devem ter antes de serem oficialmente suportados. Hoje o driver oferecido oficialmente é 0 295, mas a NVIDIA já lançou o 304.

Mas quem quer os últimos drivers para linux tem uma opção simples que funciona em 90% dos casos:  um repositório mantido pelos desenvoldores do Xorg com o que há de mais recente.

Para utilizá-lo, em um terminal, faça:

sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
sudo apt-get update

Isso já será o bastante para que você possa atualizar seu driver.

Agora, usuários de notebook sofrem com o optimus, que teoricamente deveria usar a GPU onboard, deixando a offboard desligada para economizar energia, para tarefas simples e, quando fosse necessária aceleração gráfica , ligar a offboard.
Acontece que a NVIDIA não oferece suporte a esta tecnologia no Linux. Ou seja, quem usa GPUs com Optimus está 100% do tempo rodando na placa onboard quando no Linux.
Para suprir esta falha, a comunidade de software livre mantém o projeto Bumblebee, que lhe permite usar sua GPU com optimus no Linux, embora não de forma automatizada. Ou seja, é possível usar a GPU, mas é preciso preceder seu comando por um segungo. Algo da forma:

optirun <comando>

Para instalar o Bumblebee é bastante simples também. Em um terminal faça:

sudo add-apt-repository ppa:bumblebee/stable
sudo apt-get update
sudo apt-get install bumblebee bumblebee-nvidia

Por fim reinicie o computador.

Agora você se lembra que no inicio eu mencionei que os drivers mais novos nem sempre estão 100%. Bem, o Bumblebee com o driver 304.37 da NVIDIA não se deram muito bem. Se você está nesta situação deve receber um erro do tipo:

[ERROR]Cannot access secondary GPU - error: Could not load GPU driver
[ERROR]Aborting because fallback start is disabled.

Por sorte o pessoal do Bumblebee já conseguiu contornar. Para isso será preciso fazer as seguintes edições no arquivo /etc/bumblebee/bumblebee.conf :

Module=nvidia -> Module=nvidia-current
KernelDriver=nvidia-current -> KernelDriver=nvidia
Driver= -> Driver=nvidia
Com a "seta" (->) eu quero dizer o antes e o depois.

Fontes:
http://bumblebee-project.org/install.html
https://github.com/Bumblebee-Project/Bumblebee/issues/232

sábado, 30 de junho de 2012

Cilindro conectando dois pontos em OpenGL

Como parte do meu TCC, eu tive que quebrar um pouco a cabeça para conseguir dois pontos com um cilindro. Parece fácil, mas a única implementação que encontrei tinha um erro que demorei um pouco a encontrar.

Segue o minha classe C++ para isso:

#include<GL/glut.h>
#include<GL/gl.h>
#include<cmath>
 class Cylinder{
public:
GLdouble _x1;
GLdouble _y1;
GLdouble _z1;
GLdouble _x2;
GLdouble _y2;
GLdouble _z2;
Cylinder(double x1, double y1, double z1, double x2, double y2, double z2);
void render(GLfloat red, GLfloat green, GLfloat blue, GLdouble angle_x, GLdouble angle_y);
};

#define CYLINDER_RADIUS 0.75
#define CYLINDER_SUBDIVISIONS 36

Cylinder::Cylinder(double x1, double y1, double z1, double x2, double y2, double z2){
_x1 = x1;
_y1 = y1;
_z1 = z1;
_x2 = x2;
_y2 = y2;
_z2 = z2;
}

void Cylinder::render(GLfloat red, GLfloat green, GLfloat blue, GLdouble angle_x, GLdouble angle_y){
GLdouble vx, vy, vz, v, ax;
GLUquadricObj *_quadric;

_quadric = gluNewQuadric();
gluQuadricNormals(_quadric, GLU_SMOOTH);

vx = _x2 - _x1;
vy = _y2 - _y1;
vz = _z2 - _z1;

//handle the degenerate case of z1 == z2 with an approximation
if (vz > -0.000001 && vz < 0.000001){
if (vz >= 0.0){
vz = 0.000001;
}else{
vz = -0.000001;
}
}

if (vy > -0.000001 && vy < 0.000001){
if (vy >= 0.0){
vy = -0.000001;
}else{
vy = 0.000001;
}
}

if (vx > -0.000001 && vx < 0.000001){
if (vx >= 0.0){
vx = 0.000001;
}else{
vx = -0.000001;
}
}

v = sqrt( vx*vx + vy*vy + vz*vz );
ax = (180.0/M_PI)*acos( vz/v );

if( vz < 0.0 ) ax = -ax;

glPushMatrix();
glColor3f(red, green, blue);
glRotated(angle_x, 1.0, 0.0, 0.0);
glRotated(angle_y, 0.0, 1.0, 0.0);

//draw the cylinder body
glTranslated( _x1, _y1, _z1 );
glRotated(ax, -vy, vx, 0.0);
gluQuadricOrientation(_quadric,GLU_OUTSIDE);
gluCylinder(_quadric, CYLINDER_RADIUS, CYLINDER_RADIUS, v, CYLINDER_SUBDIVISIONS, 1);

//draw the first cap
gluQuadricOrientation(_quadric,GLU_INSIDE);
gluDisk(_quadric, 0.0, CYLINDER_RADIUS, CYLINDER_SUBDIVISIONS, 1);
glTranslated( 0,0,v );

//draw the second cap
gluQuadricOrientation(_quadric,GLU_OUTSIDE);
gluDisk(_quadric, 0.0, CYLINDER_RADIUS, CYLINDER_SUBDIVISIONS, 1);
glPopMatrix();

gluDeleteQuadric(_quadric);
}

A matemática por trás de todo este código é a seguinte:

Com os dois pontos que desejo conectar obtenho um vetor direção para o meu cilindro. Descubro o angulo entre a direção atual do cilindro e a que quero que ele sigo. Depois calculo o vetor ortogonal à direção original e à final para ter o eixo de rotação. Enfim rotaciono sobre o eixo que descobri pelo ângulo que descobri.

O código original foi escrito por Curran Kelleher e pode ser encontrado em http://lifeofaprogrammergeek.blogspot.com.br/2008/08/opengl-example-rendering-cylinders.html.
A descrição em pseudocódigo que me levou a entender a correção necessária foi escrita por Toby H. J. Smith e pode ser encontrada em http://www.thjsmith.com/40/cylinder-between-two-points-opengl-c

segunda-feira, 11 de junho de 2012

Visão Geral sobre o Pivotal Tracker

"Collaborative, lightweight agile project management tool, brought to you by the experts in agile software development."

É uma ferramenta online gratuita para projetos públicos ou privados com fins acadêmicos e paga para projetos privados. Ganhadora de prêmios como o Jolt de 2009, é interessante para uma série de situações: desde times que não podem se reunir fisicamente até times experientes que simplesmente querem liberar espaço em suas lousas para outras coisas.

Seu ponto forte é agregar vários elementos de um ambiente informativo como o kanban, gráficos burn-up e burn-down e ainda ser capaz de trazer novidades como epics.

Logo quando se cria um projeto é fácil ver sua grande inspiração que é a estrutura de um kanban: icebox é como uma lista de idéias futuras; backlog é o todo de todas as iterações programadas, current é um misto das estórias prontas, sendo feitas e previstas para a iteração atual.
Esta mistura não fica confusa! Cada estória tem um ciclo de vida que vai desde ser estimada, passar por ser começada por alguém, ela então é terminada, entregue e, por fim, pode ser rejeitada ou aceita contando pontos para a iteração atual.
Seus desenvolvedores ainda perceberam que muitos times gostam de categorizar suas estórias em três tipos: funcionalidades; bugs; e "chores" (um tipo de pequenas tarefas que não agragam valor direto a aplicação, mas são importantes para os desenvolvedores). Além destes três tipos, ainda é possível criar releases com datas e acompanhar o quão próximo do seu objetivo você está.

A melhor forma de entender todas estas coisas que mencionei e tudo mais é usando em www.pivotaltracker.com. Mas ainda posso acrescentar a possibilidade de criar tags para estorias, adicionar comentários e anexos nestas, integrar ao github para mensagens de commit sejam mostradas junto da estória e tem uma ferramenta de busca de estórias bem legal (então chega de cartões perdidos =D).

Eu já trabalho com ela há quase 3 anos e não tenho do que reclamar. Vale a pena dar uma chance.

sexta-feira, 1 de junho de 2012

Instalando o Bugzilla no Ubuntu 12.04

Bugzilla é uma ferramenta de gerenciamento de bugs criada e utilizada pela Mozilla Fundation. Ele é bastante interessante para sistemas de código aberto ou sistemas onde o usuário tem uma aior familiaridade com softwares. Uma grande desvantagem dele é a ausência de uma tradução para o português.
Sempre que procuro informações sobre como fazer algo encontro instruções expplicações comando a comando sobre o que cada coisa significa. Na verdade, elas sempre me atrapalharam pois na maior parte dos casos o que me interessa é a "receita de bolo". Então, se quiser mais informações, sinta-se livre para comentar!

O Bugzilla tem as seguintes dependências que podemos resolver com o apt-get:

sudo apt-get install perl mysql-client apache2

Para baixar e descompactar o software no local correto faça:

wget http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.2.1.tar.gz
tar -xvf bugzilla-4.2.1.tar.gz
sudo mv bugzilla-4.2.1 /usr/local/

Execute os seguintes comandos:
cd /usr/local/bugzilla-4.2.1
sudo perl install-module.pl --all
sudo ./checksetup.pl

Em um editor de texto abra o arquivo localconfig e mude o sequinte:

$webservergroup = 'www-data';
$db_host = '<seu host>';
$db_name = '<nome do banco que você já criou>';
$db_user = '<usuário para acesso ao banco>';
$db_pass = '<senha de acesso do usuário>';

Execute novamente o comando:

sudo ./checksetup.pl

E forneça os dados pedidos pelo script.

Em /etc/apache2/sites-avaible crie o arquivo bugzilla com o seguinte conteúdo:

<VirtualHost localhost:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www

Alias /bugzilla/ /var/www/bugzilla/
<Directory /var/www/bugzilla/>
AddHandler cgi-script .cgi .pl
Options +Indexes +FollowSymLinks +MultiViews +ExecCGI
DirectoryIndex index.cgi
AllowOverride Limit FileInfo Indexes
Order allow,deny
Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Por fim execute os comandos:

sudo chmod 644 sites-enabled/bugzilla
cd sites-enabled/
sudo ln -s ../sites-available/bugzilla
sudo /etc/init.d/apache2 restart

Agora você deve conseguir acessar a aplicação por http://localhost/bugzilla

Adaptado do tutorial encontrado em http://vibhurishi.blogspot.com.br/2009/05/howto-install-bugzilla-on-ubuntu-9.html e da documentação oficial http://www.bugzilla.org/docs/4.2/en/html/configuration.html

quinta-feira, 31 de maio de 2012

Como energizar pessoas

Resumo: Appelo, Jurgen - Management 3.0 - How to energize People

O livro define todo time como um sistema que consome informação e produz inovação, onde os principais agentes deste sistema são as pessoas. Para que este sistema funcione bem existem cinco fatores fundamentais: conhecimento; criatividade; motivação; diversidade; e personalidade. Como gerenciamento de conhecimento é um tópico muito vasto, neste capítulo os outro quatro fundamentos são abordados e o conhecimento é tratado mais a frente (quem sabe em outro resumo então =D).

 Então para poder incentivar a criatividade é preciso primeiro entender um pouco o que ela é. Podemos dividi-la em três fases: pré-convencional (quando você não conhece os limites do problema e cria de maneira espontânea e emocional sem muito pensamento); convencional (envolve pensamento, mas é dominada pelos limites e convenções do problema, o que ainda a limita); e pós-convencional ou a "mentalidade de iniciante" (é caracterizada por você conhecer as limitações e convenções, mas sem que elas te "seguem" para alternativas). Normalmente as pessoas se acomodam na fase convencional e é nosso objetivo incentiva-las a avançar ao estágio pós-convencional.
 Criatividade requer disponibilidade de informação e conhecimento combinados com motivação e uma boa mistura de personalidades. Da mesma forma que devemos incentivar a mentalidade de iniciante, é importante não se esquecer do ambiente, pois em um ambiente criativo as pessoas tendem a ser criativas. Elas devem se sentir seguras para arriscar e errar, jogos desafiam a mente, fazendo com que pratiquem sua criatividade, não deixe o time cair na rotina (mesmo em trabalhos rotineiros busque alguma varição), por fim procure sempreque cada
 pessoa tenha um trabalho desafiador mas que seja possível (ou seja, ela não vai se frustar causando um efeito oposto ao que você pretende).
 Por fim, caracterizamos as técnicas para estimular a criatividade em 4 categorias: processo (um número finito de passos que podem ser repetidos até se alcançar o objetivo); definição do problema (ou seja, redefini-lo em outras palavras); geração de idéias (brainstorm é um exemplo); e seleção de idéias (as idéias que vão ser aplicadas precisam ser escolhidas).

 Para falar sobre motivação, primeiro é preciso desmitificar o fato de que você não pode motivar alguém, mas sim retirar os impedimentos para que ela esteja motivada. Na verdade, você tirar os impedimentos, como atrasos de salário e condições impróprias de trabalho (chamados de fatores de higiene), não vai motivar ninguém a fazer um trabalho melhor. Fatores motivadores, são a oportunidade de ter um trabalho desafiador e que possa proporcionar crescimento pessoal por exemplo.
 Dito isto, podemos dividir a motivação em dois tipos diferentes: extrínseca e intrínseca, A primeira diz respeito a motivar o time por meio de prêmios, bônus ou qualquer outro tipo de "suborno" para que as coisas saiam como o esperado. Esta, na verdade é bastante perigosa, pois pode levar a problemas como competições internas, performance reduzida na solução de problemas e minar a motivação intrínseca. A recomendação é não usar este tipo de motivação a menos que exista certeza sobre seus resultados e, mesmo assim, deixar para que o time defina como que estes incentivos devem ser distribuídos. Já motivação intrínseca parte do pressuposto de que as pessoas gostam daquilo que fazem e que o que fazemos é uma recompensa por si só (ou seja, um trabalho desafiador, como foi dito anteriormente).
Para motivar um time podemos tentar a todo tempo oferecer 10 necessidades (na verdade são 16, mas algumas o trabalho não pode supririr =D) de todo ser humano: sentir-se competente; aceitação; curiosidade; honra; idealismo; independencia, ordem; poder; contato social; e status. é importante regularmente rever esta lista, buscando onde você pode melhorar com cada indivíduo e o time todo. Caso você não saiba como motivar alguém, simplesmente pergunte: "O que eu posso fazer para ajuda-lo a fazer seu melhor trabalho?".

 Partindo para a discussão sobre como incentivar a diversidade dentro de um time, é desmentido antes o pensamento de que diversidade significa incluir mais mulheres no time. Na verdade, a diversidade deve se estimulada com o pensamento em como os indivíduos vão se relacionar, pois quando existe um bom relacionamento entre os indivíduos, o time como um todo começa a se sair melhor.

 Da mesma forma, um time precisa conhecer sua personalidade. É importante para o membro do time se conhecer. Mas isso não deve ser imposto. Você que deve tomar o primeiro passo, realizando um teste de personalidade e compartilhando seus resultados com o time (desta forma você está dando o exemplo ao time para fazer o mesmo e está deixando o time saber o que esperar de você). Seu papel depois disso é incentiva-los a fazer o mesmo teste e deixar que seja escolha de cada um revelar ou não seus resultados (uma boa idéia é compartilhar os resultados em uma conversa descontrída entre todos fora do ambiente de trabalho).