Cómo elegir la mejor configuración de la matriz 2D A (i, j)

Espero que puedas explicarme esto. Estoy trabajando con Fortran y en realidad escribo mi código sobre el tema de CFD, y a continuación (solo por simplicidad y solo por ejemplo) hay breves explicaciones de mi caso:

Debería usar una matriz 2D A (i, j) y una matriz 1D B (i)Tengo que hacer un bucle 2 veces, que es el primer bucle debe ser 50,000 veces y el segundo es 5 veces (no se puede cambiar).El punto número 2 anterior debe colocarse 10,000 veces.

Escribo los códigos con 2 versiones (los llamé Prog_A y Prog_B).

El primero es el que se muestra a continuación:

PROGRAM PROG_A
 REAL*8, DIMENSION(50000,5):: A
 REAL*8, DIMENSION(50000)::B  
 REAL*8:: TIME1,TIME2
       !Just for initial value
           DO I=1, 50000
              A(I,1)=1.0
              A(I,2)=2.0
              A(I,3)=3.0
              A(I,4)=4.0
              A(I,5)=5.0

              B(I)=I 
           END DO
       !Computing computer's running time (start)
           CALL CPU_TIME(TIME1)
                 DO K=1, 100000
                    DO I=1, 50000             !Array should be computed first for 50,000 elements (can't be changed)
                        DO J=1, 5
                           A(I,J)=A(I,J)+SQRT(B(I))   
                        END DO
                    END DO
                 END DO
       !Computing computer's running time (finish)
           CALL CPU_TIME(TIME2)
             PRINT *, 'Elapsed real time = ', TIME2-TIME1, 'second(s)'
END PROGRAM PROG_A

El segundo es:

PROGRAM PROG_B
 REAL*8, DIMENSION(5,50000):: A
 REAL*8, DIMENSION(50000)::B  
 REAL*8:: TIME1,TIME2
       !Just for initial value
           DO J=1, 50000
              A(1,J)=1.0
              A(2,J)=2.0
              A(3,J)=3.0
              A(4,J)=4.0
              A(5,J)=5.0

              B(J)=J 
           END DO
       !Computing computer's running time (start)
           CALL CPU_TIME(TIME1)
                 DO K=1, 100000
                    DO J=1, 50000             !Array should be computed first for 50,000 elements (can't be changed)
                        DO I=1, 5
                           A(I,J)=A(I,J)+SQRT(B(J))   
                        END DO
                    END DO
                 END DO
       !Computing computer's running time (finish)
           CALL CPU_TIME(TIME2)
             PRINT *, 'Elapsed real time = ', TIME2-TIME1, 'second(s)'
END PROGRAM PROG_B

Como puede ver, la diferencia es para el primero que usé el conjunto 2D A (50000,5) y para el segundo utilicé el conjunto 2D A (5,50000).

Que yo sepa, dado que Fortran se basa en la "columna mayor", el segundo caso sería más rápido que el primero, ya que realicé (en el segundo) el bucle para el lado más interno de la matriz (en este caso, i = 15).

Pero después de compilar en gfortran (con optimización -O3), descubrí que el segundo es incluso mucho más lento que el primero. Aquí está el resultado:

Primer caso: tiempo transcurrido = 29.187 sSegundo caso: tiempo transcurrido = 70.496 s

¿Alguien podría explicarme por qué?

PD: los resultados de ambos casos son los mismos con seguridad.

Respuestas a la pregunta(2)

Su respuesta a la pregunta