2012-01-26 11 views
9

Estoy intentando escribir una matriz para presentar, en donde he abierto el archivo de esta manera:Fortran I/O: Especificación de gran récord tamaños

open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u)) 

Aquí, u es una matriz y sizeof(u) es 2730025920, el cual es ~ 2.5GB. Cuando ejecuto el programa, recibo un error Fortran runtime error: RECL parameter is non-positive in OPEN statement, lo que creo que significa que el tamaño del registro es demasiado grande.

¿Hay alguna manera de manejar esto? Una opción sería escribir la matriz en más de una llamada de escritura de manera que el tamaño de registro en cada escritura sea inferior a 2,5 GB. Pero me pregunto si puedo escribir toda la matriz en una sola llamada.

Editar: u ha sido declarado como double precision u(5,0:408,0:408,0:407) El programa fue compilado como gfortran -O3 -fopenmp -mcmodel=medium test.f Hay algún código OpenMP en este programa, pero el archivo de E/S es secuencial.

gfortran v 4.5.0, SO: openSUSE 11.3 en 64 bits AMD Opteron

Gracias por su ayuda.

Respuesta

16

Debería poder escribir en matrices grandes, siempre que la memoria lo permita. Parece que está recibiendo un desbordamiento de entero con la función sizeof. sizeof no es un estándar Fortran y no recomendaría su uso (las implementaciones pueden variar entre compiladores). En cambio, es una mejor práctica usar la declaración inquire para obtener la longitud de registro. Pude reproducir tu problema con ifort y esta solución funciona para mí. Puede evitar desbordamiento de entero declarando una variable de tipo superior:

integer(kind=8) :: reclen 

inquire(iolength=reclen)u 

open(unit=20,file='output.txt',form='unformatted',& 
    access='direct',recl=reclen) 

EDIT: Después de algunas investigaciones, esto parece ser un problema gfortran. Establecer un tipo superior para el entero reclen resuelve el problema para ifort y pgf90, pero no para gfortran - Acabo de probar esto con la versión 4.6.2. Aunque reclen tiene el valor positivo correcto, parece que recl es un entero de 32 bits con signo interno con gfortran (Thanks @ M.S.B. Para señalar esto). El error de tiempo de ejecución de Fortran sugiere esto, y no que el valor sea mayor que el máximo. Dudo que sea un problema de sistema operativo. Si es posible, intente usar ifort (gratis para uso no comercial): Intel Non-Commercial Software Download.

+5

simplemente para agregar esto: 'sizeof' devuelve el número de bytes y' recl' no es necesariamente en bytes, por lo que 'preguntar' es la forma correcta de hacerlo. – steabert

+0

@steabert Gracias por la adición, esto es correcto. Un ejemplo para esto es el código de OP, que se rompería con ifort por ejemplo - ifort supone que recl es la longitud de la matriz como en cantidad de elementos, y no el número de bytes. – milancurcic

+0

Todavía recibo el mismo error. Parece que es porque el valor máximo que 'recl' toma es 2147483648 (2GB). – jitihsk