फोरट्रान: अपने कोड के समय के सर्वोत्तम तरीके?


15

कभी-कभी कोड का अनुकूलन करते समय, कोड के कुछ हिस्सों के लिए समय की आवश्यकता होती है, मैं वर्षों से निम्नलिखित का उपयोग कर रहा हूं, लेकिन सोच रहा था कि क्या यह करने के लिए एक सरल / बेहतर तरीका है?

call system_clock(count_rate=clock_rate) !Find the time rate
call system_clock(count=clock_start)     !Start Timer

call do_something_subroutine             !This is what gets timed

call system_clock(count=clock_stop)      ! Stop Timer

e_time = real(clock_stop-clock_start)/real(clock_rate)

जवाबों:


11

ऐसा करने के कुछ और तरीके हैं, फायदे और कमियां:

  • MPI_WTIME : यह एक उच्च रिज़ॉल्यूशन वाली दीवार-घड़ी है। यह शायद सबसे `विश्वसनीय’ विकल्प है; यह सिर्फ काम करता है। नकारात्मक पक्ष यह है कि यदि आपका प्रोग्राम पहले से ही MPI का उपयोग नहीं करता है, तो आपको MPI को इसके चारों ओर लपेटना होगा (जो कठिन नहीं है)।
  • एक फोरट्रान आंतरिक (जैसा आपके पास है) का उपयोग करें: यह संभवतः सबसे आसान है, और आमतौर पर पर्याप्त है, लेकिन एक अजीब वास्तुकला पर या समानांतर नौकरियों के लिए इतनी अच्छी तरह से काम नहीं कर सकता है। इस स्टैक ओवरफ्लो पर थोड़ी चर्चा हुई है
  • लपेटें एक सी कॉल: फोरट्रान और सी वस्तु-संगत हैं, इसलिए इसका आसान सी कॉल के आसपास एक आवरण लिखने के लिए पर्याप्त है। एक कोड जिसे मैं गेट्रेज के साथ काम करता हूं, जो एक विषम विकल्प हो सकता है। स्टैक ओवरफ्लो पर इसकी कई चर्चाएं हैं ।

मेरी व्यक्तिगत अनुशंसा MPI_WTIME होगी, जैसा कि आप जानते हैं कि MPI जहां भी होगा, यह अच्छी तरह से काम करेगा। यहाँ एक त्वरित खोज से एक उदाहरण है:

  include 'mpif.h'
  DOUBLE PRECISION :: start, end
  start = MPI_Wtime()

  ! code to be timed

  end   = MPI_Wtime()
  write(*,*) 'That took ',end-start,' seconds'

4

यदि आप GNU कंपाइलर का उपयोग करते हैं, तो gprof को देखें

संक्षेप में, आप अपने संकलक के लिए -g ध्वज जोड़ेंगे, जैसे:

g77 -g -pg -0 myprogram myprogram.F

फिर, आउटपुट चलाएँ, और gmon.out नामक एक फ़ाइल आपकी निर्देशिका में दिखाई देगी। फिर कॉल करो

gprof --line myprogram gmon.out

यह एक लाइन-बाय-लाइन CPU टाइम प्रोफाइल देगा।


जवाब के लिए धन्यवाद मुझे बस स्पष्ट करना है कि मैं एक प्रोग्रामेटिक समाधान के लिए पूछ रहा था। एक प्रोफाइलर महान है लेकिन यह उससे ज्यादा है जो मैं पूछ रहा था।
इसोस्पाइनल ऑसिलेशन

3
ध्वज है -pg, -gडिबग प्रतीकों के लिए है (दिलचस्प भी, लेकिन आवश्यक नहीं)
RSFalcon7

मैंने कई स्थानों पर सुना है कि gprof द्वारा दी गई समयावधि आवश्यक रूप से सटीक नहीं है, जैसे कि yosefk.com/blog/… , stackoverflow.com/questions/1777556/alternatives-to-gprof/… (और विभिन्न माइक डनलेवी उत्तर स्टैक ओवरफ्लो पर)। Gprof और kcachegrind जैसे उपकरण अभी भी उपयोगी हैं, जिसमें फ़ंक्शन कॉल की संख्या अभी भी सही है, और वे आपको कुछ समय डेटा देते हैं, लेकिन मैं इसे सुसमाचार के रूप में नहीं मानूंगा। डीओई के पास इसके लिए कुछ उपकरण हैं, लेकिन मुझे नहीं पता कि वे टाइमर डालने से बेहतर हैं या नहीं।
ज्योफ ऑक्सीबेरी

1
गंभीरता से, @IsopycnalOscillation प्रोफाइलर का उपयोग करने का प्रयास करें। यह सीखने के लिए कुछ नया है, लेकिन यह आपको लंबे समय में जबरदस्त तरीके से (और आपके कोड को साफ करने में मदद करेगा)।
tmarthal

धन्यवाद @tmarthal मैंने पहले भी प्रोफाइलरों का उपयोग किया है और मैं निश्चित रूप से अपनी अगली परियोजना के लिए एक का उपयोग करूंगा - आपने जो कहा, उससे मैं पूरी तरह सहमत हूं।
इसोस्पाइनल ऑसिलेशन

2

जैसा कि icurays1 प्रोफाइलिंग द्वारा बताया गया है, सबसे अच्छा है। तुम भी ऊपर थोड़ा सरल कर सकते हैं ...

use utils
...
call tic()
   ! Section to be timed
call toc()
...
call tic()
   ! Section to be timed
call toc()
...

जहां बर्तन मॉड्यूल शामिल हैं ...

real(8) :: t1,t2
...
subroutine tic()
  implicit none
  call cpu_time(t1)
end subroutine tic

subroutine toc()
  implicit none
  call cpu_time(t2)
  ! if (rank==0) print*,"Time Taken -->", real(t2-t1)
  print*,"Time Taken -->", real(t2-t1)
end subroutine toc

यदि आपके पास कई ऐसे खंड हैं तो एक स्ट्रिंग पास करें, जैसे, "section_id" toc ताकि यह id / name को समय के साथ प्रिंट करता है।


मैं सुझाव देना चाहूंगा कि वैश्विक t1और t2वैश्विक नहीं, बल्कि t1कई कार्यों के लिए दोनों कार्यों के लिए एक पैरामीटर के रूप में पारित किया जाए। तुम भी बस समय वापस कर सकते हैं, कुछ भी नहीं मुद्रित करें।
पेड्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.