чудес не бывает... попробуйте включить функции emms (модуль mmx и опции {$mmx+} и {$FPUTYPE SSE2})
так же есть вроде модуль matrix, где помойму заложены операции умножения матриц... но насчёт последнего ничего сказать не могу )
кроме того - действительно существуют нормальные алгоритмы умножения матриц, а не такие решения влоб
я делал нелинейную оптимизацию и там это умножение матриц 5000*5000 занимало ну не более 10 секунд, прадва задача была в целых числах и естестна не влоб решалось, но не настолько же всё плохо в вашем случае)
и поясните чего конкретно делает опция, которая в 5 раз ускоряет? я чего то не понимаю что там такое может быть...
Паскаль у меня выдает 63 секунды (с sse2) на ноуте CeleronM 1.5Ghz,
без sse2 - 98 сек... что вполне нормально для 1.5Ghz... обясняю почему... вы там про 20 сек кажется утверждали?
ок...
если буквально посчитать все операции - получится весёлая статистика:
2000*2000*2000 = 8 000 000 000... назовём это числом X
2000*2000 = 4 000 000 = Y
2000 = Z
глядим тупо на цикл:
- Код: Выделить всё
for j:= 1 to n do begin // Z раз (инкремирвание)
for i := 1 to n do begin // Y раз (инкремирование)
s := 0.0; // Y раз (Помещение mov [mem64(!!!)],reg )
for k := 1 to n do // X раз (инкремирование)
s := s + a[i,k]*b[j, k]; // 5X раз (1 сложение 64битного регистра, 2 взятие 64-переменной из памяти, 1 умножение (всё конечно с плавающей запятой !!!), 1 помещение в память)
// X раз jmp назад в цикл
c[i,j] := s; // Y раз (перемещение в память)
end; // Y раз jmp назад в цикл
end; // Z раз jmp назад в цикл
посчитанны ТОЛЬКО элементарные операции, которые надо выполнять процессору в ЛЮБОМ СЛУЧАЕ, к ним ещё по хорошему много чего довесить нада... но не будем, ради частоты эксперемента )
получаем чесных
(7X+4Y+2Z)/20=2 801 600 200 операций/секунду
причём некоторые с плавающей точкой... забавно...
только если учесть что у вас все операции по 1 тику, может действительно за 20 секунд это и возможно... однако то же
умножение: ~10 на P6 и ~50 на P5... а + ещё то что многозадачность ОС - другие потоки/прерывания/исключения ресурсы кушают...
итого нам минимум либо 6ГГц надо, либо паралельное исполнение 4-мя ядрами/процессорами, либо фортран где-то всё таки халтурит... поэтому мне кажется сначало надо разобрать чего там за опция такая... а то сложно понять почему такая разница в скорости... и каким образом выполняется столько операций в секунду...
я склонаяюсь к халтуре фортрана... наверное он понимает, что в конце мы далеко не всю расчитанную информацию выводим - и потому многое может опускать - попробуйте кинуть в файл с фортрана и с FPC свою матрицу
C 
потому как ИМХО выполнить этот цикл за 20 секунд полностью на современных персоналках невозможно никак... без ухищрений
хотя конечно вероятнее всего дело в другом... насколько я помню этот g77 вроде как разбирает фортран до каких-то опкодов и предаёт компиляцию gcc... могу и заблуждаться - но очевидно надо там рыться в причинах такого безобразия...
что это значит - я пока не понимаю в полной мере) так как лень ставить GNU-семейство по идейным соображениям... но думаю мейби в этом дело... хотя там и других туманных для меня фраз полно ) в любом случае ведущих к халтуре )
если всё таки фотран не халтурит - я могу попробывать написать оптимальный код на асме с использованием sse2, явно выполнив, все описанные инструкции - думаю выигрыш будет максимум в 1/5-2/5 части... а чего там такого придумать, чтобы не исполнять эти инструкции, и при этом они были выполнены, как требует программа я вообще не представляю... буду надеятся что кто-то выдернит мне код, который выдает этот g77, чтобы я внимательно порассуждал над ним
p.s. чудес то не бывает )))