2009-08-11 14 views
5

¿Hay alguna forma de llenar la RAM libre en una máquina Linux con datos aleatorios?memoria de relleno con datos aleatorios

La razón por la que estoy preguntando esto: estoy trabajando en un grupo donde hacemos programación numérica en Fortran. A veces, las personas se equivocan al trabajar con reales de doble precisión, por lo que los programas que deberían dar resultados de doble precisión solo brindan una precisión única.

Si mi comprensión es correcta, se verían fluctuaciones aleatorias del resultado después del límite de precisión simple en dicho programa. Es decir, si ejecuta el mismo programa con la misma entrada varias veces, obtiene resultados aleatorios diferentes cada vez. Lo que ve (la parte aleatoria) depende de los valores aleatorios en la memoria RAM libre de la máquina. Pero en la práctica, si ejecuta el programa repetidamente en la misma máquina, las mismas partes de la memoria tienden a ser utilizadas repetidamente, que tienen los mismos datos aleatorios en ellas, llevando la misma salida cada vez.

Mi idea es que si pudiera sobreescribir la memoria con datos aleatorios, realmente vería las fluctuaciones aleatorias en la salida de su programa. Eso haría mucho más fácil encontrar estos errores.

¿Es esta idea golpe, o si no, cómo llené la memoria? ¿Puedo canalizar/dev/random en la RAM, o algo así?

+0

La memoria dada a un proceso se inicializa (con datos del disco) o se pone a cero antes de ser utilizada. Sin excepciones. Entonces, todo lo que puedes hacer aquí es aleatorizar la memoria desde dentro del programa en cuestión. – bdonlan

+0

Estoy algo seguro de que no es ... Especialmente en cadenas que no se inicializaron, veo esa 'basura binaria' todo el tiempo ... puede ser que la memoria se inicialice al principio, y que la basura sea de memoria reutilizar dentro del programa, pero en cualquier caso, puede haber datos aleatorios. –

+0

Después de revisar las preguntas, veo que estás tratando con una aplicación heredada y necesitas depurarla, e idealmente quieres depurarla "en su lugar", y una forma simple e ingeniosa sería aleatorizar la datos. Sin embargo, no sé si esto es posible. Probablemente te beneficie romper el código que hace retornos dobles/únicos numéricos a su propio tipo de módulo, interconectarlo con un marco de prueba unitario y ejecutarlo de esa manera. Puede tomar mucho trabajo, pero podría probar que los números se devuelven con precisión de esa manera. Simplemente no veo esto como algo fácil. –

Respuesta

2

Linux le proporciona /proc/pid/maps y /proc/pid/mem, para su propio placer. Por supuesto, debe tener mucho cuidado cuando escriba allí. Además, tenga en cuenta que el único segmento de memoria disponible para cada proceso es el suyo, por lo que es probable que tenga que realizar algunos parches de codificación y anexos para llegar a donde desee. Buena suerte, de todos modos. :)

editar: Todavía es bastante más complicado que una auditoría de código, que también tiene mayores posibilidades de revelar el origen real del problema.

1

Creo que los datos aleatorios harían mucho más difícil la depuración. ¿La aleatoriedad en las respuestas está causada por valores aleatorios en la memoria o un error de cálculo? Me gustaría fijo y conocidos valores sería mejor.

En el lado de FORTRAN, ¿está diciendo que los números de 'precisión mixta' se usan de forma intercambiable? No tengo claro el problema real.

Pero no tengo idea de cómo llenar la memoria libre en Linux con nada.

+0

El problema puede ocurrir, por ejemplo, si realiza una conversión y olvida hacer explícita la precisión.Por ejemplo (con idp = 8 para doble precisión): real (idp) :: a; complex (idp) :: b; a = 1.0_idp; b = cmplx (a, idp); Si olvida el 'idp' en la llamada a cmplx (que sucede fácilmente), el valor resultante de b solo será una copia de un límite de precisión único. Los dígitos restantes pueden tener fluctuaciones aleatorias, que dependen de cómo se usó previamente la memoria. Hay otros ejemplos para problemas como ese, también. Si realmente puede forzar las fluctuaciones, es más fácil depurar. –

3

Si tiene un glibc reciente (> = 2.4 parece) puede usar establecer la variable de entorno MALLOC_PERTURB_ para hacer que la memoria de retorno malloc() esté establecida en algún valor. Ver http://udrepper.livejournal.com/11429.html y dentro de http://people.redhat.com/drepper/defprogramming.pdf

Entonces la pregunta es si su programa Fortran usa el glibc malloc(), supongo que depende del compilador Fortran.

+1

También tenga en cuenta que, al contrario de lo que mucha gente parece creer, la memoria que obtiene de malloc() (o asignar() en Fortran) no se garantiza que se ponga a cero, aunque muchos sistemas operativos ofrecen esto como una opción. – uekstrom

2

Intentaré escribir pruebas unitarias usando algo como fUnit para asegurar que los valores de doble precisión siempre funcionen como se espera al escribir algunas pruebas que requieren un doble resultado de precisión en casos donde se almacena un resultado de precisión simple.

Por ejemplo: escriba una prueba que invoca una función con varias entradas que deberían generar salidas de doble precisión, y pruebe que esto funciona con un assert().

5

Su comprensión es incorrecta. No puede llenar la memoria de un programa con datos aleatorios antes de que comience a ejecutarse, e incluso si pudiera, no resolvería su problema.

Si su programa Fortran declara una sola variable de punto flotante de precisión, el compilador asignará una celda de 32 bits en la memoria para mantener el valor. Cada vez que su programa lea de la variable, el procesador obtendrá un valor de 32 bits de la celda. Cada vez que asigne a la variable, el procesador escribirá un valor de 32 bits en la celda. Bajo ninguna circunstancia, los bits aleatorios "sangran" en el valor de las celdas antes o después de la celda.

Si bien la aritmética de punto flotante no es precisa, tampoco es aleatoria.Si calcula 1.0/3.0 + 1.0/3.0 + 1.0/3.0) mil veces, obtendrá 0.99999... todas y cada una de las veces.

El segundo punto es que cuando un programa se ejecuta en Linux, el sistema operativo preinicializa cuidadosamente toda la memoria de datos a cero. Esto se hace para evitar que su programa se comporte de manera diferente cada vez que lo ejecute: eso sería MALO. EDITAR: otra razón por la que esto se hace es evitar la fuga de información privada de un proceso a otro.

(comentaristas: Tenga en cuenta que he patinado deliberadamente sobre una serie de cuestiones para hacer la explicación simple.)

+0

Soy consciente de las imprecisiones de la aritmética de punto flotante, como lo ilustra. Ese es exactamente el punto. Si el programa tiene este tipo de errores, los resultados son imprecisos pero no aleatorios. Sin embargo, si hay problemas de conversión de precisión simple/doble, los resultados son aleatorios. Estoy bastante seguro de que en memoria fortran no se inicializa a menos que lo solicite manualmente. Eso significa que el uso previo de esa ubicación de memoria puede tener un impacto en forma de fluctuaciones aleatorias. Estas cosas también pueden ser dependientes del compilador. –

+0

"Estoy bastante seguro de que en memoria fortran no se inicializa a menos que lo solicite manualmente". Si ejecuta un sistema operativo moderno multiusuario, puedo garantizar que la memoria en la que se iniciará cualquier programa se inicialice. De lo contrario, un programa puede recoger información privada que queda en la memoria cuando otra sale o muere. –

1

Usted ha pedido ayuda ito implementar su solución a un problema, siendo el aleatorio de la memoria. Sin embargo, creo que es una solución extraña y posiblemente difícil de depurar.

Me parece que se beneficiarían más de - herramientas de análisis de código estático - prueba de la unidad específica - listas de comprobación para revisión de código, dirigidos específicamente a este problema

A veces, uno puede pensar en soluciones aún más simple ; si puede prescindir de una matemática de precisión única, puede evitar la vinculación de dichas bibliotecas, por lo que el error mostraría un error de enlace; al principio de su proceso de desarrollo. Buena suerte.

2

Lo que quiere lograr, aunque noble en su intención, y concebido de manera interesante, me recuerda al Wile E. Coyote planea atrapar al correcaminos, mientras que un rifle y una acción de francotiradores hubieran sido la mejor opción.

Si tiene el problema que presenta, significa que hay un problema estructural en el código y está perdiendo el control de su programa. Aunque sé perfectamente cómo se desarrolla el software en la academia, y en fortran, tirarse al precipicio solo porque el resto del mundo lo hace es problemático.

Lo que debe hacer es una auditoría de su código. y luego vencer a un estudiante de posgrado si vuelve a meter la pata.

+0

No es mi programa en realidad, es solo otro miembro de mi grupo que me pidió ayuda. Él tiene un viejo desastre complicado de un programa, y ​​descubrió que sus resultados fluctúan si cambia algo no relacionado. Estoy bastante seguro de que es un problema de precisión doble/simple. Además ... soy el estudiante de posgrado (pero no fui yo el que cometió el error;)) En cualquier caso, hacer una auditoría completa de su programa está fuera de discusión, es demasiado complicado para eso y tomaría demasiado tiempo. –

+0

depende de qué cambia, cómo cambia. Quién sabe ? podría ser como dices, pero ¿quién puede decir esto con seguridad? Veo su punto al intentar depurar esto, pero aun así, suponiendo que descubra que es un problema de precisión, aún no sabe dónde ocurre, por lo que necesitará una auditoría de todos modos. –

Cuestiones relacionadas