Почему Фортран медленнее, чем Октава? - PullRequest
0 голосов
/ 28 сентября 2019

Обычно, Фортран скачет быстрее Октавы.Тем не менее, я заметил, что при выполнении аналогичных манипуляций с матрицей с помощью функции «распространения» Фортрана, по сравнению с функцией «repmat» Октава, Octave работает примерно в два раза быстрее, чем моя скомпилированная версия программы на Фортране.Может ли кто-нибудь объяснить, почему это так?Есть ли что-то, что мне нужно сделать, чтобы повысить производительность Фортрана?

Во-первых, вот моя простая программа на Фортране:

program test_program
    double precision, parameter, dimension(1000,500) :: A = reshape([ ... ],[1000,500])
    logical, dimension(:,:,:), allocatable :: blockL
    integer, dimension(2) :: Adim

    Adim = shape(A)
    blockL = spread(A,3,Adim(1))==spread(transpose(A),1,Adim(1))
end program test_program

Теперь вот моя соответствующая программа, написанная на Octave:

A = [ ... ];  % This is the same "A" that was used in Fortran
Adim1 = size(A,1);
blockL = repmat(A,[1 1 Adim1])==repmat(permute(A,[3 2 1]),[Adim1 1 1]);

После компиляции программе на Фортране требуется около пятнадцати секунд.Программа Octave занимает около восьми.Разве скомпилированная программа не должна всегда быть быстрее интерпретируемой?Любые идеи о том, что я могу делать не так, или как я мог ускорить свою программу на Фортране?

Я использую компилятор gfortran на машине, на которой работает Lubuntu 14.04.Ниже показано, как именно я его компилирую, когда я набираю свою команду на консоли Linux:

gfortran test_program.f08 -o test_program

У меня установлена ​​Octave на одном компьютере, поэтому обе программы используютте же ресурсы и оборудование при сравнении.

Большое спасибо за ваше время и внимание.Я ценю любые рекомендации, которые кто-либо может или хочет дать.

...