tag:blogger.com,1999:blog-75952011951690956072008-11-06T09:40:53.605-02:00/src(0.1)javhttp://www.blogger.com/profile/14545485664327500786noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-7595201195169095607.post-48237053483521125082008-06-18T05:34:00.003-03:002008-06-18T05:43:53.603-03:002008-06-18T05:43:53.603-03:00AusnahmeLa idea no es postear links pelados, pero este se relaciona directamente con el post anterior. <br />Prueben <a href="http://versionsapp.com/">versions</a>.<br />Es un placer de usar, es rápido, lo que me hace sospechar que encajan abundantes prefetchs de metadata, y tiene muchas features que faltaban en los cilientes que he probado, cosas tan básicas como el "blame".<br />Está en beta 2, y calculo que se volverá pago en breve, pero igual vale la pena.javhttp://www.blogger.com/profile/14545485664327500786noreply@blogger.com1tag:blogger.com,1999:blog-7595201195169095607.post-55404221083821439592008-05-08T05:02:00.001-03:002008-05-08T07:43:11.379-03:002008-05-08T07:43:11.379-03:00tortoiseSVN para macBueno, en realidad no es la tortuga, pero se le parece.<br /><br />En diciembre de 2007 la misma gente de <a href="http://subversion.tigris.org/">subversion</a> y el <a href="http://tortoisesvn.tigris.org/">tortoiseSVN</a> sacó algo que se estaba necesitando hace rato: un <a href="http://scplugin.tigris.org/">plugin del finder</a> de mac os que inspirado la <a href="http://www.tortoisecvs.org/">tortuga</a>.<br /><br />La falta de clientes decentes para subversion fuera de windows me llamó mucho la atención cuando pasé a desarrollar en mac (viniendo de xp), decí que al ser un unixoid, el uso de la terminal es bien cómodo y uno casi se olvida del click derecho.<br /><br />Claro que al ser una version bastante beta, le faltan cosas importantes (como un repository browser) y tiene montones de issues. Un detalle, si ya tienen varias working copies apuntando a servidores que requieren autenticación, es probable que no les anden de entrada las operaciones que van contra el servidor (las importantes, bah). Por lo que vi, el plugin guarda las credenciales en el keychain del mac os, mientras que el cliente svn nativo usa el chache que vive en ~/.subversion/auth.<br /><br />Para "arreglar" ese "problema", simplemente hay que hacer un checkout con las credenciales que faltan y santo remedio.<br /><br /><br /><a href="http://scplugin.tigris.org/">scplugin</a>javhttp://www.blogger.com/profile/14545485664327500786noreply@blogger.com3tag:blogger.com,1999:blog-7595201195169095607.post-80564666140566377652008-04-21T00:33:00.003-03:002008-07-28T16:02:26.366-03:002008-07-28T16:02:26.366-03:00SIMD con gcc para las masas<div style="text-align: justify;"><span style=";font-family:verdana;font-size:85%;" >En estos últimos meses la blogósfera fue testigo de un montón de información respecto a la programación de gpu's con propósitos generales. Estos procesadores basan su alto rendimiento en la ejecución de operaciones sobre varios conjuntos de datos simultáneamente a este modelo de paralelismo se le conoce como (<a href="http://en.wikipedia.org/wiki/SIMD">SIMD</a></span><span style=";font-family:arial;font-size:85%;" ><span style="font-family:verdana;"> Single Instruction Multiple Data).</span><br /><br /><span style="font-family:verdana;">Lo que la gente a veces se olvida es que las instrucciones SIMD están presentes en los procesadores x86 desde 1997, y encima de todo eso no precisás tener una <a href="http://en.wikipedia.org/wiki/CUDA">geforce 8</a> para probar.</span></span><span style=";font-family:arial;font-size:85%;" ><br /><br /><span style="font-family:verdana;">En efecto, desde la serie Pentium de Intel (aunque desde mucho antes en otras arquitecturas). Las extensiones </span><a style="font-family: verdana;" href="http://en.wikipedia.org/wiki/MMX">MMX</a><span style="font-family:verdana;"> ya permitían la ejecución de de adiciones, restas y multiplicaciones sobre registros de 64-bits que se usan en forma de vector representando dos enteros de 32 bits, cuatro enteros de 16 bits o 8 enteros de 8 bits.</span><br /><br />Sucesores de MMX (<a href="http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions">SSE</a>, <a href="http://en.wikipedia.org/wiki/AltiVec">Altivec</a> y <a href="http://en.wikipedia.org/wiki/3DNow%21">3DNow!</a>) permiten también la utilización de valores en punto flotante y vectores de mayor tamaño. La colección de compiladores de gnu (<a href="http://www.gnu.org/software/gcc/">gcc</a></span><span style=";font-family:verdana;font-size:85%;" > para los amigos) ofrece el acceso a las instrucciones SIMD de los procesadores x86 sin tener que escribir una sola línea de código assembler. Para eso se vale de extensiones del compilador que están documentadas en este <a href="http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html">link</a>.<br /><br />A modo de ejemplo de utilización de SSE2:</span><br /></div><pre name="code" class="cpp">#include &lt;iostream&gt;<br />#include &lt;sys/time.h&gt;<br /><br />using namespace std;<br /><br />//con este typedef se declara un vector de 4 shorts y es casi<br />//todo lo automágico que se precisa del compilador<br />typedef unsigned short int v4si __attribute__ ((vector_size (16)));<br /><br />//devuelve el tiempo en milisegundos</span><br />long tick() {<br /><br />struct timeval start;<br /><br />gettimeofday(&amp;start, NULL);<br /><br />return (long)(start.tv_sec * 1000 + (int) start.tv_usec / 1000);<br />}<br /><br />void test() {<br /><br />int size = 100000;<br /><br />v4si ones = {1, 1, 1, 1};<br />v4si result = {0, 0, 0, 0};<br /><br />long before = tick();<br /><br />for (int i = 0; i &lt; size; i++)<br /> result += ones; //esto es una suma vectorial<br /><br />long now = tick();<br /><br />cout &lt;&lt; "\tresult[0] = " &lt;&lt; ((unsigned short int*)&amp;result)[0] &lt;&lt; endl<br /> &lt;&lt; "\tresult[1] = " &lt;&lt; ((unsigned short int*)&amp;result)[1] &lt;&lt; endl<br /> &lt;&lt; "\tresult[2] = " &lt;&lt; ((unsigned short int*)&amp;result)[2] &lt;&lt; endl<br /> &lt;&lt; "\tresult[3] = " &lt;&lt; ((unsigned short int*)&amp;result)[3] &lt;&lt; endl<br /><br /> &lt;&lt; "total time: " &lt;&lt; now - before &lt;&lt; "ms" &lt;&lt; endl;<br />}<br /><br />int main() {<br /> test();<br /> return 0;<br />}<br /></pre><span style="font-size:85%;"><span style="font-family:verdana;">Para poder usar el sse2 con las extensiones hay que poner la flag adecuada al compilar<br /></span></span><pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"><code>$ g++ -o test -Wall <span style="font-weight: bold;">-msse2</span> vector_extensions_test.cc<br /></code></pre><div style="text-align: justify;"><span style="font-size:85%;"><span style="font-family:verdana;">y usando un desensamblador y un poquito de grep podemos apreciar el uso de los registros sse (xmm0 - xmm7)</span></span><br /></div><pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"><code>$ objdump -d test | grep xmm<br />80487d0: 66 0f 6f 05 b0 8a 04 movdqa 0x8048ab0,%xmm0<br />80487d8: 66 0f 7f 45 b8 movdqa %xmm0,-0x48(%ebp)<br />80487dd: 66 0f ef c0 pxor %xmm0,%xmm0<br />80487e1: 66 0f 7f 45 c8 movdqa %xmm0,-0x38(%ebp)<br />80487e6: 66 0f 6f 45 c8 movdqa -0x38(%ebp),%xmm0<br />80487eb: 66 0f 7f 45 a8 movdqa %xmm0,-0x58(%ebp)<br />8048801: 66 0f 6f 45 a8 movdqa -0x58(%ebp),%xmm0<br />8048806: 66 0f fd 45 b8 paddw -0x48(%ebp),%xmm0<br />804880b: 66 0f 7f 45 a8 movdqa %xmm0,-0x58(%ebp)<br /></code></pre><span style="font-size:85%;"><span style="font-family:verdana;">En cuanto a rendimiento la salida del programa es reveladora</span></span><br /><pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"><code>$ ./test<br /> result[0] = 34464<br /> result[1] = 34464<br /> result[2] = 34464<br /> result[3] = 34464<br />total time: 1ms<br /><br /></code></pre><span style="font-size:85%;"><span style="font-family:verdana;">Recompilando sin sse y comprobando </span></span><br /><pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"><code>$ g++ -o test -Wall vector_extensions_test.cc<br />$ obj<br />$ ./test<br /> result[0] = 34464<br /> result[1] = 34464<br /> result[2] = 34464<br /> result[3] = 34464<br />total time: 6ms<br /><br /></code></pre><div style="text-align: justify;"><span style="font-size:85%;"><span style="font-family:verdana;">De 6ms a 1ms usando sse, contundente verdad?. Estas mejoras de rendimiento tienen como contrapartida que los vectores utilizados en los cálculos deben respetar la alineación de memoria, eso puede plantear un contratiempo importante puesto que re-alinear los bytes implica un gran costo en poder de cómputo, sin embargo las mejoras pueden ser de importancia si se usa con sabiduría. </span></span><br /></div><span style="font-size:85%;"><br /></span><div style="text-align: justify;"><span style="font-size:85%;"><span style="font-family:verdana;">Así que bueno si alguien quiere internarse en el lado SIMD de la paralelización estos piques pueden servir de introducción.</span></span><br /></div><span style="color: rgb(136, 136, 136);font-family:verdana;font-size:85%;" > </span>axshttp://www.blogger.com/profile/05861783680225796602noreply@blogger.com5