Simulaciones largas largas… para nada

No hay nada mejor que dejar todo un día corriendo una simulación para que al llegar a ver los resultados, haya habido un desbordamiento de las variables y aparezcan números negativos en los contadores de paquetes recibidos y en la probabilidad de bloqueo… Eso me pasa por usar «sólo» enteros largos. Es que claro, como sólo llega hasta 2147483647 (2^31 – 1).

Cambiamos las variables a enteros largos largos sin signo (máximo de 2^64 – 1 = 18446744073709551615) y a ver qué pasa.

Se supone que acabará antes de desbordarse, porque estaba bastante cerca de estabilizarse.

Share

Operaciones en punto flotante con Tcl

Una de las cosas no tan buenas de ns2 es que la interfaz usa el lenguaje Tcl (Toolkit command language) para definir las simulaciones y algunas cosas internas como los enlaces. Este lenguaje es interpretado, lo cual es bueno, pero su sintaxis es un poco engorrosa. Por si fuera poco, las operaciones en punto flotante son un poco delicadas, y he experimentado el hacer una división de dos enteros positivos y obtener un número negativo. Por ejemplo, el siguiente código:

set n_nodos 15
set burst_length 40000
set channels 8
set carga 1
set bandwidth 10000
set bw [expr $bandwidth * 1000000]

set mean_time [expr double(($n_nodos - 1) * $burst_length * 8) / double($channels * $carga * $bw)]

Da como resultado: -0.0027923583205257166

Esto lo descubrí al intentar simular una red con enlaces a 10 Gbps (de ahí el bandwidth=10000) con una carga normalizada a 1. De nada sirve colocarle la conversión explícita a double al hacer la división. La opción por la que opté en su momento fue hacer la operación en dos pasos:

set mean_time [expr double(($n_nodos - 1) * $burst_length * 8) / double($channels * $carga * $bandwidth)]
set mean_time [expr double($mean_time) / 1000000]

También es posible convertir a double el factor que multiplica los Mbps en la variable bw y conservar el resto del código anterior:

set bw [expr $bandwidth * double(1000000)]

Share

Más problemas de ns con Debian Etch

Una vez solucionados los problemas de configuración de ns con bash 3.1.x, al compilar me da un error también interesante:

queue/cbq.cc:1002: error: 'cbq_' was not declared in this scope
make: *** [queue/cbq.o] Error 1
Ns make failed!

Al parecer, no se lleva bien tampoco con GCC 4, por lo que he tenido que hacer un downgrade de gcc y g++ a la versión 3.4 para que compile.

Veremos qué nuevas sorpresas me depara el final de la compilación (o el próximo error de compilación).

Share

Errores en la instalación de ns con bash 3.1.x

El simulador tiene un fallo en las librerías que distribuye con el paquete all-in-one (versiones 2.28 y 2.29), que hace que no se pueda compilar. Me he enfrentado a este problema al intentar instalar el simulador en dos ordenadores con una recién instalada.

Se produce con el intérprete bash en su versión 3.1.x o superior, que yo haya visto. Con las versiones 3.0.x va bien.

El error que da en primer lugar es:

checking system version (for dynamic loading)... ./configure: line 7624: syntax error near unexpected token `)'
./configure: line 7624: ` OSF*)'

(El número de línea puede variar de una distribución a otra)

Este error no se produce por esa salida, «OSF*)», que es una simple comprobación y está correcta, sino por un error de sintaxis que hay en otra parte. Está en 3 paquetes de los que se distribuyen en el ns-allinone: tcl, tk y otcl. Tendremos que buscar los siguientes archivos:

  • tcl: archivo tcl8.x.x/unix/tcl.m4.
  • tk: archivo tk8.x.x/unix/tcl.m4. Igual que para tcl.
  • otcl: archivo otcl-1.x/configure.in. Igual que para tcl y tk.

Dentro de esos archivos buscamos las líneas que contengan:
system=MP-RAS-`awk '{print $3}' /etc/.relid'`
y se sustituyen por:
system=MP-RAS-`awk '{print $3}' /etc/.relid`
Es decir, hay que quitar el apóstrofe del final.

Después de editar los archivos hay que ejecutar «autoconf» en cada directorio que se modifique, para volver a generar el script configure. A continuación, el script de instalación debería funcionar sin ningún problema.

Actualización: he enviado un informe de este problema al sistema de seguimiento de bugs en SourceForge: Configuration error in tcl, tk and otcl.

Share