Одним из моих первых заданий по программированию вне колледжа было исправление долго работающего приложения на C, которое было перенесено с FORTRAN. Массивы были намного больше, чем у вас, и это заняло около 27 часов за цикл. После исправления они побежали примерно через 2,5 часа ... довольно мило!
(ОК, на самом деле это не было назначено, но мне было любопытно, и я обнаружил большую проблему с их кодом. Некоторым из старых таймеров я не очень понравился, несмотря на это исправление.)
Казалось бы, такая же проблема найдена здесь.
real B(100, 200)
real A(100,200)
... initialize B array code.
do I = 1, 100
do J = 1, 200
A(I,J) = B(I,J)
end do
end do
Ваш цикл (чтобы быть хорошим Фортраном) будет:
real B(100, 200)
real A(100,200)
... initialize B array code.
do J = 1, 200
do I = 1, 100
A(I,J) = B(I,J)
end do
end do
В противном случае вы проходите через массивы в мажорной строке, что может быть крайне неэффективным.
По крайней мере, я верю, что так будет на Фортране - это было давно.
увидел, что вы обновили код ...
Теперь вам нужно поменять местами переменные управления циклами, чтобы итерировать по строкам, а затем внутри этой итерации по столбцам, если вы конвертируете в C.