2017-03-27 29 views
0

我使用Fortran來做一些科學計算。我使用HPC。正如我們所知,當我們在HPC作業調度程序中提交作業時,我們還指定了我們作業的掛鐘時間限制。然而,當時間到了,如果作業仍在寫入輸出數據的,將被終止,這將導致一些「NUL」值數據,造成麻煩的後處理:如何在Fortran程序中設置內部掛鐘?

enter image description here

那麼,我們能否設置一個內部機制,讓我們的工作在HPC補貼時間結束之前的一段時間平靜下來?

相關問題: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

可以SYSTEM_CLOCK(),但我真的不明白會發生什麼,爲什麼有NULL和你想要做什麼。 –

+2

評論,因爲我猜你的意思。如果你想自動檢測你在批處理作業中的時間限制,並在你接近時自動關閉,那麼沒有沒有標準的方法。首先你要讀你的批處理系統的文檔工作如何才能找出限制或你的工作,然後制定出一個合適的方式來傳遞你的Fortran(注意拼寫,它已經較低的情況下超過25年),然後如何檢測您是否接近該限制以及如何「乾淨地」關閉。 –

回答

2

實現你問我發現我在程序中實現類似的功能,最近(提交https://bitbucket.org/LadaF/elmm/commits/f10a1b3421a3dd14fdcbe165aa70bf5c5001413f)之後。但我仍然需要手動設置時間限制。

最重要的部分:

time_stepping%clock_time_limit是以秒爲單位的時間限制。計算系統時鐘週期數對應於:

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) 

啓動定時器

call system_clock(count = time_steps_timer_count_start) 

檢查計時器,如果時間到了

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 
退出與 error_exit集的主循環 .true.

現在,您可能想要自動從您的調度程序中獲取時間限制。這在不同的作業調度軟件之間會有所不同。將會有一個像$PBS_WALLTIME這樣的環境變量。請參閱Get walltime in a PBS job script,但請檢查您的日程安排手冊。

您可以閱讀使用這個變量GET_ENVIRONMENT_VARIABLE()

相關問題