J'ai un programme qui tourne plus lentement que je le voudrais.Est-ce que cela peut être optimisé?
J'ai fait quelques profilage, et je l'ai trouvé la section qui prend la grande majorité du temps de traitement
DO K = 0, K_MAX
WRITE(EIGENVALUES_IO, *) K * 0.001 * PI, (W_UP(J), J=1, ATOM_COUNT)
DCMPLXW_UP(:) = DCMPLX(W_UP(:))
DO E = 1, ENERGY_STEPS
ENERGY = MIN_ENERGY + ENERGY_STEP * REAL(E, DP)
ZV = DCMPLX(ENERGY, DELTA)
ON_SITE_SINGLE = DCMPLX(0.0_DP)
DO Q = 1, ATOM_COUNT
DO J = 1, ATOM_COUNT
ON_SITE_SINGLE(J) = ON_SITE_SINGLE(J) + (MATRIX_UP(J, Q) * MATRIX_UP_CONJG(J, Q))/(ZV - DCMPLXW_UP(Q))
END DO
END DO
DOS_DOWN(E) = DOS_DOWN(E) - WEIGHTS(K) * SUM(IMAG(ON_SITE_SINGLE))
END DO
END DO
La ligne
ON_SITE_SINGLE(J) = ON_SITE_SINGLE(J) + (MATRIX_UP(J, Q) * MATRIX_UP_CONJG(J, Q))/(ZV - DCMPLXW_UP(Q))
est celui qui fait les dégâts. Je suis assez novice en la matière, y a-t-il un moyen d'accélérer ce processus? AFAIK, les mêmes principes s'appliquent avec C, donc toute aide de votre part serait bien.
Les tableaux sont tous COMPLEXE
K_MAX est 1000
ENERGY_STEPS est 1000
ATOM_COUNT est faible (< 50)
Vous vous attendez à ce que cette ligne prenne le plus de temps, car elle est exécutée jusqu'à 2500 fois toutes les 1 fois que les instructions qui l'entourent sont exécutées. Le diviseur peut être calculé en dehors de la boucle interne. Cette ligne prendra toujours tout le temps, mais le total sera réduit. –