Обычно, Фортран скачет быстрее Октавы.Тем не менее, я заметил, что при выполнении аналогичных манипуляций с матрицей с помощью функции «распространения» Фортрана, по сравнению с функцией «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 на одном компьютере, поэтому обе программы используютте же ресурсы и оборудование при сравнении.
Большое спасибо за ваше время и внимание.Я ценю любые рекомендации, которые кто-либо может или хочет дать.