ফরট্রান: আপনার কোডের বিভাগ বিভাগগুলির সেরা উপায়?


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

এটি করার আরও কয়েকটি উপায় রয়েছে যার মধ্যে সুবিধাগুলি এবং ঘাটতি রয়েছে:

  • এমপিআই_ডব্লিউটাইম : এটি একটি উচ্চ রেজোলিউশন ওয়াল-ক্লক। এটি সম্ভবত সবচেয়ে 'বিশ্বাসযোগ্য' বিকল্প; এটা ঠিক কাজ করে। খারাপ দিকটি হ'ল যদি আপনার প্রোগ্রামটি ইতিমধ্যে এমপিআই ব্যবহার না করে তবে আপনার চারপাশে এমপিআই গুটিয়ে রাখতে হবে (যা কঠিন নয়)।
  • একটি কেল্লান অভ্যন্তরীণ অভ্যন্তরীণ ব্যবহার করুন (যেমন আপনার আছে): এটি সম্ভবত সবচেয়ে সহজ এবং সাধারণভাবে যথেষ্ট তবে কোনও অদ্ভুত স্থাপত্যে বা সমান্তরাল কাজের জন্য এটি এত ভাল কাজ করতে পারে না। এই স্ট্যাক ওভারফ্লো নিয়ে কিছুটা আলোচনা চলছে
  • একটি সি কল মোড়ক করুন: ফোর্টরান এবং সি বস্তুর সাথে সামঞ্জস্যপূর্ণ, তাই সি কলগুলির চারপাশে একটি মোড়ক লেখার পক্ষে এটি যথেষ্ট সহজ। আমি যে কোডটি নিয়ে কাজ করি সেগুলি গুত্রুজ ব্যবহার করে, যা একটি বিজোড় পছন্দ হতে পারে। আছে অনেক আলোচনা স্ট্যাক ওভারফ্লো এই করুন।

আমার ব্যক্তিগত সুপারিশটি এমপিআই_ডব্লিউটিটাইম হবে, আপনি জানেন যে এমপিআই যেখানে আছে সেখানে এটি ভালভাবে কাজ করবে। এখানে দ্রুত অনুসন্ধানের একটি উদাহরণ :

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

  ! code to be timed

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

4

আপনি যদি জিএনইউ সংকলক ব্যবহার করেন তবে জিআরফুফটি দেখুন

সংক্ষেপে, আপনি আপনার সংকলকটিতে -g পতাকা যুক্ত করবেন, এরকম:

g77 -g -pg -0 myprogram myprogram.F

তারপরে, আউটপুটটি চালান, এবং gmon.out নামে একটি ফাইল আপনার ডিরেক্টরিতে প্রদর্শিত হবে। তারপরে, কল করুন

gprof --line myprogram gmon.out

এটি একটি লাইন বাই লাইন সিপিইউ সময় প্রোফাইল দেবে।


উত্তরের জন্য ধন্যবাদ আমাকে কেবল পরিষ্কার করতে হবে যে আমি একটি প্রোগ্রামেটিক সমাধান চাইছিলাম। একজন প্রোফাইলার দুর্দান্ত তবে এটি যা চেয়েছিলাম তার চেয়ে বেশি।
ইসোপাইকনাল অসিলেশন

3
পতাকা -pg, -g(এছাড়াও আকর্ষণীয়, কিন্তু প্রয়োজন হয় না) ডিবাগ চিহ্ন জন্য
RSFalcon7

আমি একাধিক স্থানে শুনেছি gprof কর্তৃক প্রদত্ত সময় যেমন, অগত্যা সঠিক নয় yosefk.com/blog/... , stackoverflow.com/questions/1777556/alternatives-to-gprof/... (এবং অন্যান্য বিভিন্ন মাইক Dunlavey উত্তর স্ট্যাক ওভারফ্লোতে)। জিআরফোফ এবং কেচেগ্রাইন্ডের মতো সরঞ্জামগুলি এখনও কার্যকর, এতে ফাংশন কলের সংখ্যা এখনও সঠিক এবং তারা আপনাকে কিছু সময়সীমার তথ্য দেয় তবে আমি এটিকে সুসমাচার হিসাবে বিবেচনা করব না। ডিওইর কাছে এর জন্য কিছু সরঞ্জাম রয়েছে তবে আমি জানি না যে তারা টাইমার সন্নিবেশ করার চেয়ে আরও ভাল কিনা।
জেফ অক্সবেরি

1
সিরিয়াসলি, @ ইস্পাইকনালঅ্যাসিলেশন প্রোফাইলারটি ব্যবহার করার চেষ্টা করুন। এটি শেখার জন্য নতুন কিছু, তবে এটি আপনাকে দীর্ঘমেয়াদে প্রচুর পরিমাণে (এবং আপনার কোড সাফ করার জন্য) সহায়তা করবে।
টিমার্থাল

ধন্যবাদ @ স্মার্টাল আমি এর আগেও প্রোফাইলার ব্যবহার করেছি এবং আমি অবশ্যই আমার পরবর্তী প্রকল্পের জন্য একটি ব্যবহার করব - আপনি যা বলেছেন তার সাথে আমি সম্পূর্ণ একমত।
ইসোপাইকনাল অসিলেশন

2

আইসিউরেস 1 দ্বারা উল্লিখিত প্রোফাইলিং সেরা is আপনি উপরের কিছুটা সরলও করতে পারেন ...

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

আপনার যদি এ জাতীয় অনেকগুলি বিভাগ থাকে তবে একটি স্ট্রিং পাস করুন, উদাহরণস্বরূপ, "সেকশন_আইডি" টোকটিতে যাতে এটি সময়ের সাথে আইডি / নামটি প্রিন্ট করে।


আমি উপার্জন না সুপারিশ করবে t1এবং t2বিশ্বব্যাপী, বরং ক্ষণস্থায়ী t1উভয় কর্ম করার জন্য একটি প্যারামিটার হিসাবে, একাধিক টাইমার জন্য অনুমতি দেয়। আপনি কিছু সময় মুদ্রণ না করে কেবল সময়টি ফিরিয়ে দিতে পারেন।
পেড্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.