2017-03-27 4 views
0

J'utilise Fortran pour faire des calculs scientifiques. J'utilise HPC. Comme nous le savons, lorsque nous soumettons des travaux dans un planificateur de travaux HPC, nous spécifions également la limite de temps de l'horloge murale pour nos travaux. Cependant, lorsque le temps est écoulé, si le travail est en train d'écrire encore des données de sortie, il sera mis fin et il entraînera des valeurs « NUL » dans les données, ce qui provoque des problèmes pour le post-traitement:Comment régler l'horloge interne dans un programme Fortran?

enter image description here

Alors, pourrions-nous mettre en place un mécanisme interne permettant à notre travail de s'arrêter pacifiquement quelque temps avant la fin du délai de prescription du CHP?

Question connexe: How to skip reading "NUL" value in MATLAB's textscan function?

+1

http://gcc.gnu.org/onlinedocs/gcc-4.5.2/gfortran/DATE_005fAND_005fTIME.html – agentp

+0

Vous pouvez system_clock() mais je ne comprends pas vraiment ce qui se passe, pourquoi il y a NULL et ce que vous voulez faire. –

+2

Un commentaire car je devine ce que tu veux dire. Si vous voulez détecter automatiquement votre limite de temps dans un travail par lots et fermer automatiquement une fois que vous approchez cela, eh bien, il n'y a pas de façon standard. Vous devrez d'abord lire la documentation de votre système de traitement par lots pour déterminer comment vous pouvez trouver la limite ou votre travail, puis trouver un moyen approprié de transmettre cette information à votre Fortran (notez l'orthographe, il s'agit de minuscules depuis plus de 25 ans), puis comment vous détecter sont proches de cette limite et comment fermer "proprement". –

Répondre

2

Après avoir réalisé ce que vous demandez que j'ai découvert que je mis en œuvre des fonctionnalités similaires dans mon programme très récemment (commit https://bitbucket.org/LadaF/elmm/commits/f10a1b3421a3dd14fdcbe165aa70bf5c5001413f). Mais je dois encore définir la limite de temps manuellement.

La partie la plus importante:

time_stepping%clock_time_limit est la limite de temps en secondes. Comptez le nombre d'horloge système tiques correspondant à celui:

call system_clock(count_rate = timer_rate) 
    call system_clock(count_max = timer_max_count) 

    timer_count_time_limit = int(min(time_stepping%clock_time_limit & 
             * real(timer_rate, knd), & 
             real(timer_max_count, knd) * 0.999_dbl) & 
           , dbl) 

Démarrer la minuterie

call system_clock(count = time_steps_timer_count_start) 

Vérifiez la minuterie et sortir de la boucle principale avec error_exit ensemble à .true. si le temps est écoulé

if (mod(time_step,time_stepping%check_period)==0) then 
    if (master) then 
     error_exit = time_steps_timer_count_2 - time_steps_timer_count_start > timer_count_time_limit 
     if (error_exit) write(*,*) "Maximum clock time exceeded." 
    end if 

    MPI_Bcast the error exit to other processes 

    if (error_exit) exit 
    end if 

Maintenant, vous pouvez vouloir obtenir la limite de temps de votre planificateur automatiquement. Cela variera entre les différents logiciels de planification des tâches. Il y aura une variable d'environnement comme $PBS_WALLTIME. Voir Get walltime in a PBS job script mais vérifiez le manuel de votre planificateur.

Vous pouvez lire cette variable en utilisant GET_ENVIRONMENT_VARIABLE()