Fortran 77 не поддерживает рекурсию, и, следовательно, компилятор, соответствующий стандарту, может размещать все переменные в разделе данных программы; в принципе ни стек, ни куча не нужны [1].
Возможно, это то, что делает f2c, и если это так, то может быть, что шаг f2c делает программу не ориентированной на многопотоковое исполнение, а не сама программа. Конечно, как уже упоминалось, проверьте и блоки COMMON. EDIT: также проверьте наличие явных директив SAVE. SAVE означает, что значение переменной должно сохраняться между последующими вызовами процедуры, аналогично static в C. Теперь размещение всех локальных данных процедуры в разделе данных делает все переменные неявно СОХРАНЕННЫМИ, и, к сожалению, есть много старых код, который предполагает это, даже если это не гарантируется стандартом Fortran. Такой код, очевидно, не является потокобезопасным. Запись В частности, ARPACK, я не могу ничего обещать, но ARPACK, как правило, хорошо известен и широко используется, поэтому я был бы удивлен, если бы он страдал от таких проблем с пыльной палубой.
Большинство современных компиляторов Фортрана используют выделение стека. Возможно, вам повезет больше, если вы скомпилируете ARPACK, скажем, с помощью gfortran и опции -frecursive.
ИЗМЕНИТЬ:
[1] Не потому, что он более эффективен, а потому, что Фортран изначально был разработан до того, как были изобретены стеки и кучи, и по какой-то причине комитет по стандартам хотел сохранить возможность реализации Фортрана на оборудовании без поддержки ни стека, ни кучи вплоть до Fortran 90. На самом деле, я предполагаю, что стеки более эффективны на сегодняшнем оборудовании, сильно зависящем от кэша, чем доступ к локальным данным процедуры, которые разбросаны по всему разделу данных.
person
janneb
schedule
10.10.2010