<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Cómo aprender cuda en un mes...</title>
	<atom:link href="http://cudagpu.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://cudagpu.wordpress.com</link>
	<description>...y otros cuentos</description>
	<lastBuildDate>Thu, 23 Jun 2011 08:35:41 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='cudagpu.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Cómo aprender cuda en un mes...</title>
		<link>http://cudagpu.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://cudagpu.wordpress.com/osd.xml" title="Cómo aprender cuda en un mes..." />
	<atom:link rel='hub' href='http://cudagpu.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Cómo añadir un paso de compilación personalizada con NSIGHT para CUDA</title>
		<link>http://cudagpu.wordpress.com/2011/06/22/como-anadir-un-paso-de-compilacion-personalizada-con-nsight-para-cuda/</link>
		<comments>http://cudagpu.wordpress.com/2011/06/22/como-anadir-un-paso-de-compilacion-personalizada-con-nsight-para-cuda/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 10:57:30 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[CUDA]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=233</guid>
		<description><![CDATA[Problema común: he instalado NSIGHT y he creado un nuevo proyecto con un par de ficheros .cu que quiero compilar con CUDA pero no encuentro la manera de hacerlo. La solución es fácil, lo que hay que hacer es indicarle que se debe compilar con un paso de compilación personalizada. El problema es que en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=233&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Problema común: he instalado NSIGHT y he creado un nuevo proyecto con un par de ficheros .cu que quiero compilar con CUDA pero no encuentro la manera de hacerlo.</p>
<p>La solución es fácil, lo que hay que hacer es indicarle que se debe compilar con un paso de compilación personalizada. El problema es que en la lista no aparece este paso si no lo activamos en el proyecto. Para eso hay que ir a <em>Proyecto/Personalizaciones de compilación.</em></p>
<p><a href="http://cudagpu.files.wordpress.com/2011/06/personalizaciones-de-compilacion.png"><img class="aligncenter size-thumbnail wp-image-234" title="personalizaciones de compilacion" src="http://cudagpu.files.wordpress.com/2011/06/personalizaciones-de-compilacion.png?w=150&#038;h=119" alt="" width="150" height="119" /></a></p>
<p>Ahí debemos marcar la casilla de la versión de CUDA que queramos activar, en mi caso <em>CUDA 3.2 (.targets, .props)</em>. Siguiente paso es clic derecho en el fichero <em>.cu</em> y <em>Propiedades</em>. Ahí marcamos en <em>General/Tipo de elemento</em> la opción <em>CUDA C/C++</em>.</p>
<p><a href="http://cudagpu.files.wordpress.com/2011/06/tipo-de-elemento.png"><img class="aligncenter size-thumbnail wp-image-235" title="tipo de elemento" src="http://cudagpu.files.wordpress.com/2011/06/tipo-de-elemento.png?w=150&#038;h=65" alt="" width="150" height="65" /></a> Con esto indicamos que ese fichero se compilará con CUDA 3.2, además ahora en las propiedades del proyecto aparecerá un desplegable <em>CUDA C/C++</em> con algunas opciones avanzadas que es mejor no tocar.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/233/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/233/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/233/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=233&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2011/06/22/como-anadir-un-paso-de-compilacion-personalizada-con-nsight-para-cuda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>

		<media:content url="http://cudagpu.files.wordpress.com/2011/06/personalizaciones-de-compilacion.png?w=150" medium="image">
			<media:title type="html">personalizaciones de compilacion</media:title>
		</media:content>

		<media:content url="http://cudagpu.files.wordpress.com/2011/06/tipo-de-elemento.png?w=150" medium="image">
			<media:title type="html">tipo de elemento</media:title>
		</media:content>
	</item>
		<item>
		<title>Comunicación entre QThread con slot y signal</title>
		<link>http://cudagpu.wordpress.com/2011/06/06/comunicacion-entre-qthread-con-slot-y-signal/</link>
		<comments>http://cudagpu.wordpress.com/2011/06/06/comunicacion-entre-qthread-con-slot-y-signal/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 10:09:53 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=223</guid>
		<description><![CDATA[Es habitual crear un hilo QThread que haga un proceso en segundo plano y vaya avisando de su estado. En mi caso tengo un QTextEdit que me sirve de log para escribir cualquier cosa. El problema es que QT tiene mecanismos de seguridad que impiden a un QThread comunicarse con un QObject creado en otro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=223&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Es habitual crear un hilo QThread que haga un proceso en segundo plano y vaya avisando de su estado. En mi caso tengo un QTextEdit que me sirve de log para escribir cualquier cosa. El problema es que QT tiene mecanismos de seguridad que impiden a un QThread comunicarse con un QObject creado en otro hilo, como es la interfaz.</p>
<p>Para eso se aprovecha el sistema de signals y slots que permiten la comunicación.</p>
<h2>Emisor: clase QThread</h2>
<p>Hay que definir una signal en la clase emisora (que será un hilo QThread), el código queda así:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
class FileAccess : public QObject, public QThread{
 Q_OBJECT
 public:

  FileAccess(Logic *myLogic){}
  ~FileAccess(){}
  void run(){
    emit writeState(&quot;Running thread&quot;);
  }
 signals:
  void writeState(QString q);
};
</pre>
<p>Como se puede apreciar, hemos creado nuestra propia señal de nombre <em>writeState</em> que recibe una <em>QString</em> y se emite nada más entrar en la ejecución del hilo.</p>
<h2>Conexión con el receptor</h2>
<p>Esta señal debe conectarse con el receptor, en mi caso un QTextEdit, para eso se utiliza el método connect():</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
fa = new FileAccess(); //nuevo hilo
QObject::connect(fa, SIGNAL(writeState(QString)), myTextEdit, SLOT(append(QString)), Qt::QueuedConnection);
fa-&gt;start(); //lanzar hilo
fa-&gt;wait(); //esperar a que el hilo termine o hacer nuestras tareas
</pre>
<p>Destaco la segunda línea: conectamos la señal <em>writeState</em> del objeto <em>fa</em> con el slot <em>append</em> del objeto <em>myTextEdit</em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=223&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2011/06/06/comunicacion-entre-qthread-con-slot-y-signal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Evitar que se haga un salto de línea en Fortran</title>
		<link>http://cudagpu.wordpress.com/2011/06/03/evitar-que-se-haga-un-salto-de-linea-en-fortran/</link>
		<comments>http://cudagpu.wordpress.com/2011/06/03/evitar-que-se-haga-un-salto-de-linea-en-fortran/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 10:41:45 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=218</guid>
		<description><![CDATA[Desde tierras muy lejanas dejo aquí esta información sobre cómo evitar que un WRITE (VWRITE) haga un salto de línea y poder concatenar en una misma línea varios formatos de Fortran (Fortran Format). Basta con poner un $ como último carácter del formato Fortran: *CFOPEN,'elements','txt',' ' *VWRITE,e1(1,1), e2(1,1), e3(1,1), e4(1,1), e5(1,1),[...] (19(' ',F10.0),$) *VWRITE, e20(1,1) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=218&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Desde tierras muy lejanas dejo aquí esta información sobre cómo evitar que un WRITE (VWRITE) haga un salto de línea y poder concatenar en una misma línea varios formatos de Fortran (Fortran Format).</p>
<p>Basta con poner un $ como último carácter del formato Fortran:</p>
<pre>*CFOPEN,'elements','txt',' '
 *VWRITE,e1(1,1), e2(1,1), e3(1,1), e4(1,1), e5(1,1),[...]
 (19(' ',F10.0),$)
 *VWRITE, e20(1,1)
 (1(' ',F10.0),' ')</pre>
<p><a href="http://www.nsc.liu.se/~boein/f77to90/a2.html">Fuente</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/218/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=218&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2011/06/03/evitar-que-se-haga-un-salto-de-linea-en-fortran/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Empieza el proyecto BRUMA</title>
		<link>http://cudagpu.wordpress.com/2011/03/24/empieza-el-proyecto-bruma/</link>
		<comments>http://cudagpu.wordpress.com/2011/03/24/empieza-el-proyecto-bruma/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 14:02:59 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=211</guid>
		<description><![CDATA[Llega un momento en la vida de todo desarrollador en que se da cuenta de que todo lo que había hecho hasta ese momento no sirve para nada. El proyecto ha terminado, ¡viva el proyecto! Esta vez probablemente no va a haber desarrollo en CUDA, por lo que dejaré de aprender esta tecnología. Aunque lo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=211&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Llega un momento en la vida de todo desarrollador en que se da cuenta de que todo lo que había hecho hasta ese momento no sirve para nada. El proyecto ha terminado, ¡viva el proyecto!</p>
<p>Esta vez probablemente no va a haber desarrollo en CUDA, por lo que dejaré de aprender esta tecnología. Aunque lo hecho hasta ahora me servirá para un futuro, no he llegado nunca a ahondar y profundizar en este tipo de programación tanto como me gustaría. Quién sabe si más adelante me serán útiles estos conocimientos, dejaremos pasar el tiempo a ver qué pasa.</p>
<p>Este nuevo proyecto, codename BRUMA (BReast Ultrasound and Magnetic resonance Alignment) va a permitir deformar una resonancia magnética según los datos que se reciben de una <a href="http://en.wikipedia.org/wiki/Time-of-flight">cámara TOF</a>. La deformación de la resonancia magnética la podrá ver el médico en el momento de la operación y se le mostrará en la posición y orientación en la que maneje un ecógrafo.</p>
<p>BRUMA tiene tres grandes retos:</p>
<ol>
<li>Conseguir deformar una textura 3D de forma que los niveles de gris se interpolen correctamente y tener así una deformación de la resonancia acorde con la deformación a la que está sometida en realidad</li>
<li>Captación del mapa de profunidad que viene de la cámara TOF y registro del mapa con la resonancia para su posterior deformación</li>
<li>Tracking del ecógrafo y muestra de la resonancia en la posición y orientación del mismo</li>
</ol>
<p>Y estas van a ser las tareas a las que me voy a dedicar ahora. Cambio y corto.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/211/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=211&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2011/03/24/empieza-el-proyecto-bruma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Crear una ventana de carga en un hilo y comunicarla con un Widget de QT</title>
		<link>http://cudagpu.wordpress.com/2011/02/28/crear-una-ventana-de-carga-en-un-hilo-y-comunicarla-con-un-widget-de-qt/</link>
		<comments>http://cudagpu.wordpress.com/2011/02/28/crear-una-ventana-de-carga-en-un-hilo-y-comunicarla-con-un-widget-de-qt/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 09:38:01 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=198</guid>
		<description><![CDATA[Desde hace tiempo tengo un botón que lanza un proceso externo (concretamente ANSYS) y normalmente tarda varios minutos. Esto provoca que la interfaz se congele hasta que el proceso termina, con la consiguiente falta de información, bloqueo de ventanas&#8230; Crear un hilo con QT Como parece que ahora la aplicación tiene que servir para otras [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=198&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Desde hace tiempo tengo un botón que lanza un proceso externo (concretamente ANSYS) y normalmente tarda varios minutos. Esto provoca que la interfaz se congele hasta que el proceso termina, con la consiguiente falta de información, bloqueo de ventanas&#8230;</p>
<h2>Crear un hilo con QT</h2>
<p>Como parece que ahora la aplicación tiene que servir para otras personas, era hora de hacer eso bien y tener una pantallita típica de &#8220;Running&#8230;&#8221; con su botón de <em>Abort </em>y todo esto sin bloquear la interfaz, claro. Para eso tenemos que usar hilos y QT tiene sus propios hilos: <em>QThread</em>.</p>
<p>La creación de una clase que sea hilo simplemente debe heredar de <em>QThread</em>, aquí hay una muestra básica:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
class MiHilo: public QThread{
  private:
  //mis variables
  public:
  void run(){ //método que se ejecutará al hacer start
    //hacer cosas
  }
};

int main(){
  MiHilo th;
  th.start(); //lanza el hilo
  th.wait(); //espera a que el hilo termine
}
</pre>
<p>Aunque lo mejor es leerse la <a href="http://doc.qt.nokia.com/latest/qthread.html" target="_blank">documentación de QThread</a> para ver todos los métodos.</p>
<h2>Mostrar una ventana de carga</h2>
<p>Ahora lo interesante es tener una ventanita que indique que el hilo está haciendo cosas y que <em>bloquee </em>la ejecución del programa principal hasta que se cierre esa ventana, ya sea por acción del usuario o porque el proceso lanzado ha terminado. Para sacar una ventana modal (bloqueante) lo más sencillo es lo siguiente:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
th.start();

loadingBox.setText(&quot;Process is running...&quot;);
loadingBox.setWindowTitle(&quot;Please wait&quot;);
loadingBox.setWindowModality(Qt::ApplicationModal);
loadingBox.setStandardButtons(QMessageBox::Abort);
loadingBox.setIcon(QMessageBox::Warning);

int r=loadingBox.exec();

th.wait();
</pre>
<p>Esta ventana tiene además un botón de <em>Abort </em>con el que podemos hacer lo que queramos al mirar el valor de la variable <em>r</em>. La ventana, al ser modal, no permite que el programa principal ejecute el <em>wait()</em> hasta que se haya cerrado, en caso contrario, el programa principal seguiría su ejecución de forma independiente.</p>
<h2>Cerrar la ventana con un evento</h2>
<p>Siguiente paso: que la ventana se cierre cuando el proceso termine. Aunque pueda parecer sencillo, es más complicado de lo que parece puesto que QT impide enviar eventos directamente entre hilos distintos. Por lo tanto, la clase MiHilo no podrá mandar un <em>close()</em> directamente a <em>loadingBox</em>. Según parece se puede montar un sistema con <em>signals </em>y <em>slots </em>que permitan mandar una señal de cierre, pero no lo he conseguido&#8230;</p>
<p>Lo que sí he conseguido es enviar un evento desde un hilo distinto al de la aplicación principal mediante <em>postEvent</em>. Esta función permite mandar un evento a la cola de eventos del objeto receptor definido, entonces, al finalizar la ejecución del programa que está lanzandose en el hilo, se pasa lo siguiente:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
QApplication::postEvent(&amp;padre-&gt;loadingBox,new QCloseEvent()); //padre es la clase que contiene el objeto loadingBox y que el hilo debe conocer
</pre>
<p>Y, aunque hay un new, <a href="http://doc.trolltech.com/latest/qcoreapplication.html#postEvent" target="_blank">el evento se borra automáticamente al procesarse</a>, si lo borramos después con un delete tendremos errores difíciles de entender.</p>
<p>Todo esto nos ha permitido lanzar un proceso en un hilo, mostrar una ventana modal que interrumpa el programa principal pero sin bloquear la interfaz y cerrarla al terminar la ejecución del proceso.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/198/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=198&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2011/02/28/crear-una-ventana-de-carga-en-un-hilo-y-comunicarla-con-un-widget-de-qt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Mezclando BOOST, uBLAS y CLAPACK para resolver sistemas de ecuaciones</title>
		<link>http://cudagpu.wordpress.com/2010/10/05/mezclando-boost-ublas-y-clapack-para-resolver-sistemas-de-ecuaciones/</link>
		<comments>http://cudagpu.wordpress.com/2010/10/05/mezclando-boost-ublas-y-clapack-para-resolver-sistemas-de-ecuaciones/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 10:41:20 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=183</guid>
		<description><![CDATA[Si bien anteriormente me entusiasmaron Newmat y MTL4, ninguna de ellas era capaz de resolver lo que necesitaba. La primera no resuelve sistemas y la segunda tardaba muchsímimo y hasta petaba en grandes sistemas (22k ecuaciones). Pero seguí investigando para utilizar las famosas librerías de resolución LAPACK o suery su versión para C: CLAPACK. Sin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=183&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Si bien anteriormente me entusiasmaron <a href="http://cudagpu.wordpress.com/2010/09/24/newmat-buena-biblioteca-para-el-manejo-de-matrices/">Newmat</a> y <a href="http://cudagpu.wordpress.com/2010/10/01/resolucion-de-sistemas-de-ecuaciones-con-mtl4/">MTL4</a>, ninguna de ellas era capaz de resolver lo que necesitaba. La primera no resuelve sistemas y la segunda tardaba muchsímimo y hasta petaba en grandes sistemas (22k ecuaciones). Pero seguí investigando para utilizar las famosas librerías de resolución LAPACK o suery su versión para C: CLAPACK. Sin embargo, esta biblioteca no permite el almacenamiento eficiente de matrices dispersas/simétricas y para eso existe otra biblioteca llamada BLAS y, concretamente, la que viene ya incluida en BOOST: uBLAS.</p>
<p>Este post relata cómo, utilizando el almacenamiento de matrices de uBLAS y un binding sobre BOOST de CLAPACK y el propio CLAPACK, se resuelven sistemas de ecuaciones extremadamente grandes en poco tiempo.</p>
<p>Lo primero es tener <a href="http://www.boostpro.com/download/">instalado</a> y preparado BOOST, con esto ya tenemos uBLAS a punto. Seguidamente podemos probar que esté correcto con un programita simple como este:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
#include &quot;stdafx.h&quot;
#include &lt;boost/numeric/ublas/matrix_sparse.hpp&gt;
#include &lt;boost/numeric/ublas/lu.hpp&gt;
#include &lt;boost/numeric/ublas/io.hpp&gt;

int main(){

 using namespace boost::numeric::ublas;
 mapped_matrix&lt;double&gt; m (5, 5, 3 * 3);
 for (unsigned i = 0; i &lt; m.size1 (); ++ i)
  for (unsigned j = 0; j &lt; m.size2 (); ++ j)
   m (i, j) = 5 * i + j*5.2;

 m(3,3)=10;

 std::cout &lt;&lt; m &lt;&lt; std::endl;

 matrix&lt;double&gt; inv(5,5);

 permutation_matrix&lt;std::size_t&gt; pm(m.size1());
 lu_factorize(m,pm);
 inv.assign(identity_matrix&lt;double&gt;(m.size1()));
 lu_substitute(m,pm,inv);

 std::cout &lt;&lt; inv &lt;&lt; std::endl;

 system(&quot;PAUSE&quot;);
 return 0;
}
</pre>
<p>Lo que hace es rellenar una matriz y luego invertirla. Es la forma más rápida de invertir una matriz utilizando uBLAS que he encontrado.</p>
<p><strong>Matrices dispersas</strong></p>
<p>Existen <a href="http://www.boost.org/doc/libs/1_44_0/libs/numeric/ublas/doc/matrix_sparse.htm">tres maneras de guardar matrices dispersas</a> con uBLAS, yo he utilizado la <em>compressed_matrix</em>, me pareció la más eficiente. Aquí un ejemplo:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">boost::numeric::ublas::compressed_matrix&lt;float&gt; miMatrizDispersa(ancho,alto); </pre>
<p>El acceso para lectura y escritura es con <em>miMatrizDispersa(i,j)</em>, todo muy fácil, rápido y sencillo.</p>
<p><strong>Añadir el binding de LAPACK</strong></p>
<p>Por sí misma, la biblioteca uBLAS no resuelve sistemas, podría utilizarse para invertir una matriz y multiplicarla por un vector, resolviendo así el sistema, pero esto es extremadamente ineficiente y es muy buena idea utilizar CLAPACK. Pero para ello tenemos que añadir el binding uBLAS-LAPACK. Esto es muy sencillo:</p>
<ul>
<li>Colocarse en el directorio donde tengamos BOOST, típicamente: <em>C:/Archivos de programa/boost/boost_1_44/boost/numeric/</em></li>
<li>Crear la carpeta <em>bindings/</em></li>
<li>Utilizar un cliente de SubVersion para bajar todo el árbol de:</li>
</ul>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">svn co http://svn.boost.org/svn/boost/sandbox/numeric_bindings-v1/boost/numeric/bindings</pre>
<ul>
<li>Colocarse en el directorio: <em>C:/Archivos de programa/boost/boost_1_44/libs/numeric/</em></li>
<li>Crear la carpeta <em>bindings/</em></li>
<li>Utilizar un cliente de SubVersion para bajar todo el árbol de:</li>
</ul>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">svn co http://svn.boost.org/svn/boost/sandbox/numeric_bindings-v1/libs/numeric/bindings</pre>
<p>Tendremos ya los bindings instalados y fácilmente comprobable. Pero antes&#8230;</p>
<p><strong>Instalar y vincular CLAPACK</strong></p>
<p>Debemos <a href="http://www.netlib.org/clapack/CLAPACK-3.1.1-VisualStudio.zip">bajar CLAPACK para Visual Studio</a> y colocarlo donde queramos, por ejemplo en C:/CLAPACK-3.1.1-VisualStudio. Importante bajarse las cosas ya compiladas a ser posible. Seguidamente añadimos en Visual Studio los directorios <em>include</em> y <em>lib/Win32</em> como directorios adicionales de inclusión y biblioteca respectivamente.</p>
<p>Luego en el proyecto tenemos que añadir las bibliotecas adicionales: <em>clapackd.lib</em> y <em>BLASd.lib</em> en el vinculador.</p>
<p><strong>Resolver un sistema de ecuaciones</strong></p>
<p>Nos falta una cosa importante para que toda esta mezcla funcione, hay que añadir lo siguiente al principio del fichero donde se incluyan las cosas importantes:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">#define BOOST_NUMERIC_BINDINGS_USE_CLAPACK //¡muy importante para que todo funcione!

#include &lt;boost/numeric/bindings/traits/ublas_matrix.hpp&gt;
#include &lt;boost/numeric/bindings/lapack/gesv.hpp&gt;

#include &lt;boost/numeric/ublas/matrix_sparse.hpp&gt;
#include &lt;boost/numeric/ublas/vector.hpp&gt;

#include &lt;boost/numeric/ublas/io.hpp&gt;
</pre>
<p>Con este define y los includes que necesitemos ya podemos rellenar la matriz y resolver así:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
ublas::matrix&lt;float, ublas::column_major&gt; A(ancho,alto); //importante el column_major para compatibilidad con LAPACK
ublas::matrix&lt;float, ublas::column_major&gt; b(alto,1); //ponemos una matriz alto x 1 para hacerlo más sencillo, pero seguramente con un vector
//rellenar A y b
[...]
bindings::lapack::gesv(A,b); //la solución se  encontrará en b</pre>
<p>Así hemos conseguido finalmente resolver el sistema Ax=b y sorprenderá la velocidad con que lo hace CLAPACK, el cuello de botella de aquí es la inserción de datos en una matriz dispersa.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=183&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2010/10/05/mezclando-boost-ublas-y-clapack-para-resolver-sistemas-de-ecuaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Resolución de sistemas de ecuaciones con MTL4</title>
		<link>http://cudagpu.wordpress.com/2010/10/01/resolucion-de-sistemas-de-ecuaciones-con-mtl4/</link>
		<comments>http://cudagpu.wordpress.com/2010/10/01/resolucion-de-sistemas-de-ecuaciones-con-mtl4/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 11:46:21 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=172</guid>
		<description><![CDATA[Si bien hablé en otro post sobre la biblioteca Newmat, he seguido buscando alternativas pues Newmat no maneja matrices dispersas. He encontrado tres bibliotecas interesantes: SparseLib++, CSparse y MTL4. De ellas decidí probar MTL4 para guardar una matriz de 1.400 millones de elementos y resolver un sistema también muy grande. He tenido bastantes problemillas al [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=172&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Si bien hablé en otro post <a href="http://cudagpu.wordpress.com/2010/09/24/newmat-buena-biblioteca-para-el-manejo-de-matrices/">sobre la biblioteca Newmat</a>, he seguido buscando alternativas pues Newmat no maneja matrices dispersas. He encontrado tres bibliotecas interesantes: <a href="http://math.nist.gov/sparselib++/">SparseLib++</a>, <a href="http://people.sc.fsu.edu/~jburkardt/c_src/csparse/csparse.html">CSparse</a> y <a href="http://osl.iu.edu/research/mtl/mtl4/">MTL4</a>.</p>
<p>De ellas decidí probar MTL4 para guardar una matriz de 1.400 millones de elementos y resolver un sistema también muy grande. He tenido bastantes problemillas al usarlo con Visual Studio 2005, pero al final parece que funciona.</p>
<p>Primeramente, MTL2 lo he descartado por obsoleto y he tirado directamente a MTL4, bajando todo el código del servidor subversion que proporcionan. <a href="http://osl.iu.edu/research/mtl/mtl4/doc/install.html">Las instrucciones</a> están muy bien detalladas y básicamente vienen a decir:</p>
<ul>
<li><a href="http://www.boostpro.com/download/">Descarga e instala Boost C++</a></li>
<li><a href="https://svn.osl.iu.edu/tlc/trunk/mtl4/trunk">Descarga MTL4 del subversion</a> (con <a href="http://tortoisesvn.net/downloads">TortoiseSVN</a> para Windows)</li>
<li>Añadir los directorios de inclusión adicionales en Visual Studio:
<ul>
<li>El de boost, típicamente: C:\Archivos de programa\boost\boost_1_44</li>
<li>El de MTL4, típicamente: C:\mtl4</li>
</ul>
</li>
<li>Incluir las librerías necesarias cuando vayamos a usar MTL</li>
</ul>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">#include &lt;boost/numeric/mtl/mtl.hpp&gt;
#include &lt;boost/numeric/itl/itl.hpp&gt;</pre>
<p>Y ahora dejo unas muestras de código para hacer matrices, invertirlas&#8230;</p>
<p><strong>Matrices densas</strong></p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">dense2D&lt;float&gt;   A(ancho, alto);
A[0][4]=55; //ponemos a 55 el valor de la posición 0,4
float v=A[0][4]; //sacamos el valor 0,4 para guardarlo en v
std::cout &lt;&lt; &quot;A is \n&quot; &lt;&lt; A; //imprimir una matriz es muy fácil
</pre>
<p><strong>Matrices dispersas</strong></p>
<p>Éstas son algo distintas en su manejo, no se pueden rellenar de la misma manera, necesitan un <em>inserter</em>.</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
compressed2D&lt;double&gt;   B(ancho, alto);
if(true){
  matrix::inserter&lt;compressed2D&lt;double&gt;&gt; ins(B); //crear un inserter sobre B
  ins[0][4] &lt;&lt; 55;  //ponemos a 55 el valor de la posición 0,4
}
float v=B[0][4]; //la extracción es igual
std::cout &lt;&lt; &quot;B is \n&quot; &lt;&lt; B;
</pre>
<p>Nótese el <em>if(true)</em>, eso lo he hecho porque <strong>la creación del <em>inserter</em> debe ser dentro de un bloque</strong>. Esto es así porque <strong>hasta que el <em>inserter</em> no se destruya, la matriz no podrá ser accesible</strong> y dará una excepción al intentar hacer <em>B[0][4]</em> o cualquier otro acceso. Se puede meter dentro de un bucle o función para que el <em>inserter</em> se destruya una vez hecho su trabajo.</p>
<p><strong>Resolver un sistema</strong></p>
<p>MTL sólo permite resolver sistemas con matrices densas, una pena. Se deben seguir estos pasos:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">
dense_vector&lt;float&gt; solucion(tam);
dense2D&lt;float&gt; A(tam,tam);
dense_vector&lt;float&gt; b(tam);

solucion=lu_solve(A,b);
</pre>
<p>Obviamente, teniendo en cuenta que todos los tamaños permitan la resolución del sistema.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/172/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/172/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/172/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=172&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2010/10/01/resolucion-de-sistemas-de-ecuaciones-con-mtl4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Newmat, buena biblioteca para el manejo de matrices en C++</title>
		<link>http://cudagpu.wordpress.com/2010/09/24/newmat-buena-biblioteca-para-el-manejo-de-matrices/</link>
		<comments>http://cudagpu.wordpress.com/2010/09/24/newmat-buena-biblioteca-para-el-manejo-de-matrices/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 11:07:32 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=163</guid>
		<description><![CDATA[Puede que no sea la mejor, pero he encontrado una gran biblioteca para el manejo de matrices en C++. Todo ha venido porque hasta ahora estaba usando matrices simples 2D y nos ha surgido el problema de que uno de los modelos FEM tenía tantos nodos que una de las matrices que teníamos que usar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=163&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Puede que no sea la mejor, pero he encontrado una gran biblioteca para el manejo de matrices en C++. Todo ha venido porque hasta ahora estaba usando matrices simples 2D y nos ha surgido el problema de que uno de los modelos FEM tenía tantos nodos que una de las matrices que teníamos que usar para simular una deformación llegaba a ocupar 8GB en memoria, lo cual, obviamente, mata la aplicación.</p>
<p>Me habían mencionado la biblioteca LAPACK, pero no he visto que permita almacenar matrices dispersas o simétricas (como es mi caso), aunque sus funciones sí que son capaces de manejar este tipo de matrices, asumo que ignorando aquellas posiciones simétricas o algo así.</p>
<p>He seguido buscando y me he topado con <a href="http://www.robertnz.net/nm_intro.htm" target="_blank">Newmat</a>:</p>
<blockquote><p>Esta biblioteca C++ está orientada a científicos e ingenieros que necesitan manipular una serie de tipos de matrices usando operaciones estándar. Se ha hecho énfasis en el tipo de operaciones necesarias y cálculos estadísticos como mínimos cuadrados, resolución de sistemas de ecuaciones lineales y eigenvalores.</p></blockquote>
<p>Por lo que he bajado el código y he empezado a trastear con ello, ha compilado perfectamente en Visual Studio 2008. Crear un nuevo proyecto y añadir los .cpp y .h que se indican en <a href="http://www.robertnz.net/VisualC.html">estas instrucciones</a>. Me ha sorprendido que todo funcionara a la primera, en estos casos siempre te falta tal o cual dependencia&#8230;</p>
<p>Además, se ejecuta un ejemplo de uso, lo que viene muy bien para comprobar el funcionamiento y ver algo de código siempre es la mejor manera de conocer una herramienta. Hasta me he atrevido a hacer una matriz simétrica e invertirla para ver el funcionamiento, no puede ser más fácil:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">

SymmetricMatrix SM(2);

SM.Row(1) &lt;&lt; 11;
SM.Row(2) &lt;&lt; -1 &lt;&lt; 22;
SM=SM.i();

cout &lt;&lt; &quot;MI MATRIZ PREFERIDA (&quot;&lt;&lt;SM.Storage()&lt;&lt;&quot;)\n\n&quot;&lt;&lt;setw(10) &lt;&lt; setprecision(5) &lt;&lt;SM&lt;&lt;endl;
</pre>
<p>El funcionamiento está claro, se crea una matriz simétrica de 2&#215;2 y se rellena. Al ser simétrica, en la fila 1 basta con rellenar el primer valor. Además, con SM.Storage() se puede ver cuántas posiciones en memoria se han reservado, y lo hace optimizando la memoria puesto que para la matriz simétrica va a dar 3 y no 4. Si la imprimiéramos la matriz tendría este aspecto:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">11 -1
-1 22</pre>
<p>Al invertirla e imprimirla con el cout el resultado es:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;"> 0.09129 0.00415
0.00415 0.04564</pre>
<p>¡Fácil y sencillo! Y ahora a darse una vuelta <a href="http://www.robertnz.net/nm10.htm">por la documentación</a> y ver todo lo que esta biblioteca permite hacer.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=163&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2010/09/24/newmat-buena-biblioteca-para-el-manejo-de-matrices/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>NSIGHT para depurar CUDA en GPU</title>
		<link>http://cudagpu.wordpress.com/2010/07/28/nsight-para-depurar-cuda-en-gpu/</link>
		<comments>http://cudagpu.wordpress.com/2010/07/28/nsight-para-depurar-cuda-en-gpu/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 09:50:05 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[CUDA]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=155</guid>
		<description><![CDATA[NVIDIA ha publicado (por fin) una herramienta que permitirá depurar CUDA en tiempo real. La depuración de CUDA sobre GPU es muy delicada y no es posible ver el estado de las variables, colocar puntos de ruptura o conocer cómo está funcionando el kernel lanzado. Pero ahora NVIDIA lanza NSIGHT, una herramienta con la que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=155&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>NVIDIA ha publicado </strong>(por fin)<strong> una herramienta que permitirá depurar CUDA en tiempo real</strong>. La depuración de CUDA sobre GPU es muy delicada y no es posible ver el estado de las variables, colocar puntos de ruptura o conocer cómo está funcionando el kernel lanzado.</p>
<p>Pero ahora <a href="http://developer.nvidia.com/object/nsight.html">NVIDIA lanza NSIGHT</a>, una herramienta con la que podremos hacer todas estas tareas y además se integra con Visual Studio sin problemas. Sin embargo tiene algunas peculiaridades que he sufrido.</p>
<p>Sólo funciona con Visual Studio 2008 SP1, aunque dicen que pronto será compatible con VS2010, veremos si vale la pena este nuevo entorno, pero tiene muy buena pinta.</p>
<p>Es necesario (a menos que tengas una configuración de dos GPU en SLI), tener dos máquinas, una de ellas con VS2008 SP1 y NSIGHT instalado y otra de ellas con NSIGHT Monitor instalado y GPU G92 o superior, la segunda será la máquina donde se lanzarán las ejecuciones.</p>
<p>Ambas máquinas deben tener Windows Vista/7 (bye bye XP) y, por supuesto, estar conectadas entre sí. <strong>Es MUY RECOMENDABLE actualizar los controladores gráficos</strong> de NVIDIA a la última versión.</p>
<p>Estoy en estos momentos intentando lanzar mi primera depuración, en otro post haré un breve tutorial de instalación y manejo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/155/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=155&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2010/07/28/nsight-para-depurar-cuda-en-gpu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
		<item>
		<title>¿Por qué un unsigned char no sirve para un bucle de 256 iteraciones?</title>
		<link>http://cudagpu.wordpress.com/2010/07/19/por-que-un-unsigned-char-no-sirve-para-un-bucle-de-256-iteraciones/</link>
		<comments>http://cudagpu.wordpress.com/2010/07/19/por-que-un-unsigned-char-no-sirve-para-un-bucle-de-256-iteraciones/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 11:06:35 +0000</pubDate>
		<dc:creator>cudagpu</dc:creator>
				<category><![CDATA[Otros cuentos]]></category>

		<guid isPermaLink="false">http://cudagpu.wordpress.com/?p=149</guid>
		<description><![CDATA[Necesito iterar sobre una matriz de 256x256x256 elementos, y para ello tengo 3 bucles anidados, de 0 a 256, lo típico para recorrerlo todo. Muchos pensareis, para los índices puede utilizarse un unsigned char ya que sus valores están entre 0 y 255, perfecto, llega justo: ¡pues no! Y lo peor es que lo tenía [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=149&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Necesito iterar sobre una matriz de 256x256x256 elementos, y para ello tengo 3 bucles anidados, de 0 a 256, lo típico para recorrerlo todo. Muchos pensareis, para los índices puede utilizarse un <em>unsigned char</em> ya que sus valores están entre 0 y 255, perfecto, llega justo: ¡pues no!</p>
<p>Y lo peor es que lo tenía en un bucle de un kernel CUDA y lo que hace es petar la gráfica y Windows, obligándote a reiniciar la máquina&#8230;</p>
<p>La explicación es sencilla, el bucle es tal que así:</p>
<pre class="brush: cpp; toolbar: false; wrap-lines: true;">for(unsigned char i=0; i&lt;256; i++)</pre>
<p>Por lo tanto la variable <em>i</em> empieza en 0, 1, 2&#8230; 255. Y ahí debería ser la última iteración, pero, y aquí viene lo interesante, <strong>cuando se haga <em>i++</em></strong><strong> la variable sufre un overflow y vuelve a cero.</strong> Con lo que el bucle vuelve a empezar y nunca termina.</p>
<p>Así pues, niños, los <em>unsigned char</em> sirven únicamente para bucles de hasta 255 iteraciones, para todo lo demás: <em>unsigned short</em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cudagpu.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cudagpu.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cudagpu.wordpress.com/149/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cudagpu.wordpress.com&amp;blog=10434434&amp;post=149&amp;subd=cudagpu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cudagpu.wordpress.com/2010/07/19/por-que-un-unsigned-char-no-sirve-para-un-bucle-de-256-iteraciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c5f940d1a8896e5151dba2e82f09ae52?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cudagpu</media:title>
		</media:content>
	</item>
	</channel>
</rss>
