Фортран:переносимость 32-разрядной / 64-разрядной производительности

StackOverflow https://stackoverflow.com/questions/1668899

Вопрос

Я начал использовать Fortran (95) для некоторого числового кода (генерация модулей python).Вот простой пример:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

Я обнаружил, что это работает очень хорошо в 32-разрядной версии, но при компиляции как x86_64 это примерно в 5 раз медленнее (macbook pro core2duo, snow leopard, gfortran 4.2.3 от r.research.att.com).Я, наконец, понял, что это может быть связано с использованием 32-битного целочисленного типа вместо собственного типа, и действительно, когда я заменяю на integer * 8, 64-битная производительность всего на 25% хуже, чем 32-битная.

Почему использование 32-битного целого числа намного медленнее на 64-битной машине?Существуют ли какие-либо неявные приведения, происходящие при индексации, о которых я, возможно, не знаю?

Всегда ли 64-разрядная версия будет медленнее 32-разрядной для этого типа кода (я был удивлен этим) - или есть шанс, что я смогу получить 64-разрядную скомпилированную версию, работающую с той же скоростью или быстрее?

(главный вопрос) Есть ли какой-либо способ объявить переменную (integer) "собственным" типом...ie 32-разрядный при 32-разрядной компиляции, 64-разрядный при 64-разрядной компиляции в современном fortran.Без этого кажется невозможным написать переносимый код на fortran, который не будет намного медленнее в зависимости от того, как он скомпилирован - и я думаю, это означает, что мне придется прекратить использовать fortran для моего проекта.Я просмотрел kind и selected_kind, но не смог найти ничего, что делает это.

[Править:большое снижение производительности произошло из-за того, что оболочка f2py скопировала массив, чтобы преобразовать его из 64-битного int в 32-битный int, так что ничего присущего fortran нет.]

Это было полезно?

Решение

Ответ на ваш "главный вопрос" заключается в выборе правильного параметра компилятора, чтобы целое число по умолчанию было объявлено с 32 или 64 битами.Я никогда не использую gfortran (я предпочитаю g95, еще лучше платный компилятор), поэтому я погуглил, и кажется, что -fdefault-integer-8 - это тот вариант, который вам нужен.

Как и вы, я удивлен, что 64-разрядная версия работает медленнее, чем 32-разрядная версия.У меня нет ничего проясняющего на этот счет.

Другие советы

На самом деле я также пытался использовать 64-разрядную версию для запуска watfor 77, но моя была совершенно невозможна.Я получил gf-FOR-compiler для своей 64-разрядной версии и попробовал некоторые опции в Google, а позже получил возможность использовать gcc-mp 4.3 и gfortran 4.3.Версия, которая все еще была медленной.Я посоветую вам использовать 32-разрядную машину, которая является компактной на языке fortran, для запуска ваших программ или понизить класс вашей 64-разрядной версии до 32-разрядной, чтобы запускать ваши программы быстрее и точнее.Давайте продолжим исследования, чтобы получить 64-разрядную машину, работающую эффективно с WATFOR77 и прогами подпрограмм.

Хотя я не проводил тщательных исследований, я не видел таких больших различий в скорости.

Я предлагаю попробовать более новую версию gfortran.Версия 4.2 является более ранней (gfortran запускался с версии 4.0) и считается устаревшей.4.3 и 4.4 значительно улучшены и обладают большим количеством функций.4.4 - это текущая версия, не являющаяся бета-версией.Самый простой способ получить их на компьютере Mac - через MacPorts:пакеты gcc43 и gcc44 включают gfortran.Компиляторы установлены как gcc-mp-4.3, gfortran-mp-4.3 и т.д., чтобы не конфликтовать с другими версиями.Или вы можете попробовать последнюю версию 4.5 со страницы gfortran wiki.

Intel fortran иногда значительно быстрее, чем gfortran.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top