Fortran I / O: указание больших размеров записи - PullRequest
9 голосов
/ 26 января 2012

Я пытаюсь записать массив в файл, где я открыл файл следующим образом:

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

Здесь u - массив, а sizeof(u) - 2730025920, что составляет ~ 2,5 ГБ. Когда я запускаю программу, я получаю сообщение об ошибке Fortran runtime error: RECL parameter is non-positive in OPEN statement, которое, по моему мнению, означает, что размер записи слишком велик.

Есть ли способ справиться с этим? Один из вариантов - записать массив более чем в один вызов записи, чтобы размер записи при каждой записи был меньше 2,5 ГБ. Но мне интересно, могу ли я написать весь массив за один вызов.

Edit: u был объявлен как double precision u(5,0:408,0:408,0:407) Программа была скомпилирована как gfortran -O3 -fopenmp -mcmodel=medium test.f В этой программе есть некоторый код OpenMP, но файловый ввод-вывод последовательный.

gfortran v 4.5.0, ОС: Opensuse 11.3 на 64-битной платформе AMD Opteron

Спасибо за вашу помощь.

1 Ответ

17 голосов
/ 26 января 2012

Вы должны иметь возможность писать большие массивы, если позволяет память. Похоже, вы получаете целочисленное переполнение с помощью функции sizeof. sizeof не является стандартом Fortran, и я бы не рекомендовал его использовать (реализация может отличаться в зависимости от компилятора). Вместо этого лучше использовать оператор inquire для получения длины записи. Я смог воспроизвести вашу проблему с помощью ifort, и это решение работает для меня. Вы можете избежать целочисленного переполнения, объявив переменную более высокого вида:

integer(kind=8) :: reclen

inquire(iolength=reclen)u 

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

РЕДАКТИРОВАТЬ: После некоторого расследования, это, кажется, проблема gfortran. Установка более высокого значения для целого числа reclen решает проблему для ifort и pgf90, но не для gfortran - я только что попробовал это с версией 4.6.2. Даже если reclen имеет правильное положительное значение, кажется, что recl является внутренним 32-разрядным целым числом со знаком gfortran (спасибо @ M.S.B. за то, что указал на это). Это говорит об ошибке времени выполнения Fortran, а не о том, что значение больше максимального. Я сомневаюсь, что это проблема ОС. Если возможно, попробуйте использовать ifort (бесплатно для некоммерческого использования): Загрузка некоммерческого программного обеспечения Intel .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...