Является ли ARPACK потокобезопасным?

Безопасно ли использовать собственный решатель ARPACK из разных потоков одновременно из программы, написанной в С? Или, если ARPACK сам по себе не потокобезопасен, существует ли API-совместимая реализация потокобезопасности? Быстрый поиск в Google не дал ничего полезного, но, учитывая тот факт, что ARPACK активно используется в больших научных вычислениях, я был бы очень удивлен, если бы первым нуждался в потокобезопасном разреженном собственном решателе.

Я не слишком хорошо знаком с Fortran, поэтому я перевел исходный код ARPACK на C, используя f2c, и кажется, что там довольно много статических переменных. По сути, все локальные переменные в переведенных подпрограммах кажутся статическими, что означает, что сама библиотека не является потокобезопасной.


person Tamás    schedule 08.10.2010    source источник
comment
Спасибо, ребята, все вы мне очень помогли, и я бы принял их всех, если бы это было возможно.   -  person Tamás    schedule 14.10.2010


Ответы (4)


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
comment
Спасибо за разъяснения. Итак, теоретически те статические переменные, которые я вижу в переведенном коде C, сделаны статическими только потому, что размещение их в разделе данных более эффективно? Кажется, что в коде ARPACK нет блоков COMMON (по крайней мере, быстрый grep для COMMON в исходном коде ARPACK ничего не выявил), поэтому можно ли тогда с уверенностью сказать, что код ARPACK потокобезопасен? Или в FORTRAN есть другие не потокобезопасные механизмы, на которые мне следует обратить внимание? - person Tamás; 12.10.2010
comment
@Tamas: я обновил свой ответ, надеюсь, ответив на ваши дальнейшие вопросы. - person janneb; 12.10.2010
comment
Спасибо, это очень помогло! Для справки: похоже, что ARPACK зависит от LAPACK, а в LAPACK довольно много директив SAVE. Кажется, они хранят специфичные для машины константы, такие как EPS, которые инициализируются при первом вызове dlamch. Я предполагаю, что избавиться от них не так уж сложно, но похоже, что ARPACK как таковой не является потокобезопасным. - person Tamás; 14.10.2010
comment
Обновление: LAPACK кажется полностью потокобезопасным с версии 3.3. По крайней мере эталонная реализация Netlib. - person Tamás; 21.04.2011

Я преобразовал ARPACK в C, используя f2c. Всякий раз, когда вы используете f2c и заботитесь о безопасности потоков, вы должны использовать переключатель -a. Это приводит к тому, что локальные переменные имеют aавтоматическое хранение, т. е. локальные переменные на основе стека, а не статические значения, которые используются по умолчанию.

Несмотря на это, сам ARPACK определенно не является потокобезопасным. Он использует много общих блоков (т. е. глобальных переменных) для сохранения состояния между различными вызовами его функций. Если мне не изменяет память, он использует интерфейс обратной связи, что приводит разработчиков к использованию глобальных переменных. И, конечно же, ARPACK, вероятно, был написан задолго до того, как многопоточность стала обычным явлением.

В итоге я переработал преобразованный код C, чтобы систематически удалить все глобальные переменные. Я создал несколько структур C и постепенно переместил глобальные переменные в эти структуры. Наконец, я передал указатели на эти структуры каждой функции, которой требовался доступ к этим переменным. Хотя я мог бы просто преобразовать каждую глобальную переменную в параметр там, где это необходимо, гораздо чище было хранить их все вместе, в структурах.

По сути, идея состоит в том, чтобы преобразовать глобальные переменные в локальные переменные.

person David Heffernan    schedule 07.08.2011

ARPACK использует BLAC, верно? Тогда эти библиотеки также должны быть потокобезопасными. Я считаю, что ваша идея проверить с помощью f2c может не быть пуленепробиваемым способом определить, является ли код Fortran потокобезопасным, я предполагаю, что это также зависит от компилятора Fortran и библиотек.

person Prof. Falken    schedule 08.10.2010
comment
Да, ARPACK зависит от BLAS и LAPACK, поэтому следующим шагом будет их проверка. Я не имел в виду, что отсутствие static в переведенном исходном коде C означает, что код сам по себе является потокобезопасным, но его наличие является признаком того, что библиотека, вероятно, не является потокобезопасной. Однако, просматривая исходный код, я почувствовал, что было бы несложно переписать его потокобезопасным образом, и я был бы удивлен, узнав, что никто не сделал этого до меня. - person Tamás; 08.10.2010
comment
Я также подумал, что, возможно, f2c использует определенную стратегию компиляции, генерируя статику, где другой компилятор выделил бы память в куче. Я не знаком с Фортраном, но кажется, что от компилятора зависит гораздо больше, чем от C. Фортран не предоставляет указатели (правильно?), а компилятор Фортрана имеет немного больше свободы, чем компилятор Си. - person Prof. Falken; 08.10.2010

Я не знаю, какую стратегию f2c использует при переводе Fortran. Поскольку ARPACK написан на FORTRAN 77, первое, что нужно сделать, это проверить наличие блоков COMMON. Это глобальные переменные, и если они используются, код, скорее всего, не является потокобезопасным. Веб-страница ARPACK, http://www.caam.rice.edu/software/ARPACK/, говорит, что существует параллельная версия -- вполне вероятно, что эта версия потокобезопасна.

person M. S. B.    schedule 08.10.2010
comment
Параллельный ARPACK распараллелен с MPI; он может быть, а может и не быть потокобезопасным. - person janneb; 10.10.2010