Mi primer programa

Esoty jugando un poco con ensamblador (assembler) de Itanium, gracias a unos manuales que amablemente Intel me mando a mi casa. Este es mi primer programa:
        .text
.align 16
.global dot#
.proc dot#
dot:
.prologue
.body
{
.mfi
nop.m 0
nop.f 0
adds r3 = -1, r32
;;
}
{
.mfi
nop.m 0
mov f8 = f0
mov ar.lc = r3
}
.L1:
{
.mmf
ldfd f11 = [r33],8
ldfd f12 = [r34],8
nop.f 0
;;
}
{
.mfb
nop.m 0
fma.d f8=f11, f12, f8
br.cloop.sptk.few .L1
}
{
.mib
nop.m 0
nop.i 0
br.ret.sptk.many b0
}
.endp dot#
Es una función que calcula el producto punto entre dos vectores, el prototipo es:
double dot(const int, const double *, const double *)
Aún hay algunas cosas que no entiendo bien y probablemente tiene fallos (por ejemplo en el caso que n==0), pero la verdad es más fácil de lo que esperaba.

Open64, el otro compilador libre

Hoy descubrí que existe otro compilador libre, se llama Open64 y está basado en el compilador MIPSpro de SGI. Tiene interfaces para C, C++ y Fortran, y soporta Itanium, x86 y x86_64.

Se puede bajar desde acá: http://www.open64.net.

Probé este compilador en Itanium, y si bien no es muy rápido, compiló Octopus sin problemas a la primera. Cosa que el compilador Intel no hace.

Blas benchmark: ddot

Hoy estaba haciendo unas pruebas con Octopus y me pareció que la biblioteca matématica de Sun era más lenta que la de Intel. Así que decidí hacer un pequeño programita para comparar el rendimiento de las distintas implementaciones de Blas, en particular de ddot, quizás después haga pruebas con otras funciones. El sistema de prueba es:

  • Core 2 Duo 3.2 GHz 4 Mb L2

  • 2 Gb DDR2 900 MHz

Las bibliotecas comparadas son: Reference Blas (versión de Debian 32 bits), libgoto, Intel MKL, Sun Sunperf, ATLAS (versión de 32 bits de Debian) y AMD ACML.

En el gráfico cada escalón corresponde a un nivel de caché (los tamaños de cada nivel están marcados con una línea punteada). Esto implica que el rendimiento está limitado por la capacidad de transferir datos hacia el procesador.

Se puede ver que el rendimiento de las bibliotecas cambia bastante cuando los vectores caben en caché, en particular unas pocas bibliotecas son capaces de aprovechar el caché L1. La clara ganadora es Goto que obtiene el mayor rendimiento tanto en 32 como 64 bits, además de ser una biblioteca gratis y tener soporte para varias plataformas. Es sorprendente el caso de Sunperf de 32 bits, que tiene un rendimiento uniformemente patético para cualquier tamaño del arreglo, quizas está compilada para i386 o algo así.

Update: Descubrí que hay una versión optimizada para SSE2 de Sunperf que tiene un rendimiento, que si bien no es deslumbrante, es aceptable.

Devolver un cambio en svn

Hoy descubrí como deshacer un cambio en svn, gracias a este blog.

Para hacerlo hay que usar la función merge (no es muy intuitivo eso), por ejemplo, para devolver el cambio 3160 basta un:
svn merge -c -3160 .
Después de eso, basta hacer un commit.

Wikipedia

Carolina descubrió la Wikipedia cuando recién estaba empezando, por allá por abril del 2003, y por lo tanto mi cuenta de usuario en la versión en español es Xavier. Esto significa que recibo alrededor de un mail por semana de un tocayo despistado que cree que su cuenta es Xavier, por suerte la Wikipedia aunque genera una nueva clave, no sobreescribe la actual, así que basta con ignorar los correos.