2017-09-02 2 views
1

J'ai le code type de ce genre dans F90:Comment faire une boucle sur un tableau avec un seul index?

real(8), dimension(10,10,10) :: A 

do i = 1, 1000 

print*,A(i,1,1) 

enddo 

Je suis très surpris et cela a fonctionné, il est plus rapide que tout simplement en boucle sur 3 dimensions par i,j,k.

Quelqu'un peut-il expliquer pourquoi cela fonctionne?

+0

Plus rapide que quoi exactement? Qu'est-ce que vous ne comprenez pas exactement dans le code? –

+0

le tableau A a la dimension de 10X10X10, alors pourquoi le code I fourni ci-dessus fonctionne-t-il lorsque l'indice i a dépassé 10? Et il est plus rapide que ci-dessous, i = do faire j 1,10 = 1,10 faire k = 1,10 print *, A (i, j, k) enddo enddo enddo – user8553012

Répondre

5

Votre code est illicite. Mais sous le capot la disposition de la mémoire de la matrice se trouve être dans l'ordre majeur de la colonne comme dans la boucle triple k, j, i, de sorte que le code semble fonctionner. Mais c'est illégal.

Si vous activez les vérifications d'erreurs d'exécution dans votre compilateur (voir le manuel), il trouvera l'erreur et la signalera.

Cela peut être légèrement plus rapide, si vous n'activez pas les optimisations du compilateur, car il y a un peu de surcharge dans les boucles imbriquées, mais un compilateur d'optimisation optimisera le code à une boucle.

Si vous avez fait (vous devriez toujours montrer votre code !!!)

do i=1,10 
    do j=1,10 
    do k=1,10 
     something with A(i,j,k) 

alors s'il vous plaît noter que c'est le mauvais ordre et vous devez boucle dans le k, j, je commande.

Veuillez également noter que la mesure de la vitesse d'impression sur l'écran n'est pas utile et peut être très délicate. Certaines opérations mathématiques sont plus utiles.

+0

Merci pour vous répondre! Bien que je me suis conformé à l'indicateur mpif90 -O3 -heaparrays -cpp et la situation avec A (i, 1,1) est presque 10 fois plus rapide que A (i, j, k). Et ce que j'ai fait avec A est un peu de calcul mais imprime. Le code ci-dessus est ce que j'ai appris d'un code open source. Très confus par cela – user8553012

+0

Impression de 1000 lignes n'est pas un très bon exemple d'un véritable goulot d'étranglement. Essayer d'exécuter des timings sur quelque chose de si petit et compliqué peut être trompeur. – Ross

+0

Dans le cas 3D dans quel ordre avez-vous effectué les boucles? Comme Vladimir dit que c'est très important et peut dans de nombreux cas conduire à une différence d'ordre de grandeur dans la performance –