نحوه نوشتن حلقه های تودرتو به صورت صحیح در زبان فرترن

نحوه نوشتن حلقه های تودرتو به صورت صحیح در زبان فرترن
در ادامه پست های مربوط به زبان برنامه نویسی فرترن، قصد داریم نحوه نوشتن حلقه های تودرتو به صورت صحیح در زبان برنامه نویسی فرترن را به صورت متنی و ویدیویی به شما آموزش دهیم. در ابتدای پست لازم به ذکر است که شما میتوانید برای ران کردن کد های خود از نرم افزارهای microsoft visual studio 2012 و 2015-Parallel-intel-studio استفاده کنید که فایل نصب و راهنمای نصب آن در این فایل آورده شده است.
توضیح در مورد کد:
نوشتن درست حلقه های تودرتو باعث کاهش چشم گیر زمان ران برنامه میشود. در این برنامه ساده یک آرایه با نام F نوشتیم و با استفاده از دستور های Allocatable و Allocate بُعد آن را مشخص کردیم و تابع F را به صورت F(i,j,k)=i*j*k نوشتیم که فقط قرار است به هم ضرب شوند.
روش اول نوشتن کد:
در قسمت اول یا روش اول طبق عکس زیر می بینیم که ما با نوشتن کد توضیح داده شده در بالا و کد ارائه شده می بینیم که مدت زمان ران یا اجرا شدن برنامه 10.2 ثانیه می شود.
کد فرترن:
program test implicit none ! variables integer::i,j,k Integer,parameter::size=700 real(8)::t1,t2 integer,dimension(:,:,:),allocatable::F allocate(F(size,size,size)) call CPU_TIME(t1) do i=1,size do j=1,size do k=1,size F(i,j,k)=i*j*k end do end do end do call CPU_TIME(t2) print*,t2-t1 pause deallocate(f) end program test
نمونه کد + پیشنمایش نتیجه کد:


روش دوم(صحیح) نوشتن کد:
حال ما سبک نوشتن کد را عوض میکنیم، یعنی F را بصورت F(k,j,i)=i*j*k می نویسیم. دوباره برنامه را ران میکنیم و حالا طبق عکس زیر می بینیم که زمان ران یا اجرا ما 4.35 ثانیه میشود که یعنی زمان ما بیشتر از نصف کاهش داشته است.
کد فرترن:
program test implicit none ! variables integer::i,j,k Integer,parameter::size=700 real(8)::t1,t2 integer,dimension(:,:,:),allocatable::F allocate(F(size,size,size)) call CPU_TIME(t1) do i=1,size do j=1,size do k=1,size F(k,j,i)=i*j*k end do end do end do call CPU_TIME(t2) print*,t2-t1 pause deallocate(f) end program test
نمونه کد + پیشنمایش نتیجه کد:


و حالا نکته چیه؟
نکته ای که بهتر است در زمان نوشتن کد و ذخیره سازی رعایت شود این است که المان اول ما درونی ترین و المان دوم ما بعد از آن قرار گیرد و به همین ترتیب اولویت بندی ما انجام شود.
یعنی المان اول درونی ترین حلقه ما و بیرونی ترین المان ما آخرین حلقه ما باشد و المان های بین ما به این ترتیب نوشته شوند.
این روش باعث کاهش قابل توجه زمان ران میشود و کاهش زمان ران و زمان cpu در پروژه های ما تاثیر بسیار زیادی دارد.
لینک ویدیو در آپارات
یک نکته جالب تر:
تگ cpu_time ،مقدار REAL که زمان پردازنده گذشته را در چند ثانیه نشان می دهد. این برای آزمایش بخش های کد برای تعیین زمان اجرا مفید است. اگر منبع زمانی در دسترس باشد، زمان با وضوح میکرو ثانیه گزارش می شود. اگر منبع زمانی در دسترس نباشد، TIME روی 1.0- تنظیم شده است. توجه داشته باشید که TIME ممکن است حاوی یک جبران خودسرانه وابسته به سیستم باشد و ممکن است با 0.0 شروع نشود. برای CPU_TIME، مقدار مطلق بی معنی است، فقط تفاوت بین تماس های بعدی به این زیرروال، همانطور که در مثال زیر نشان داده شده است، باید استفاده شود.
مثال:
program test_cpu_time real :: start, finish call cpu_time(start) put code to test here! call cpu_time(finish) print '("Time = ",f6.3," seconds.")',finish-start end program test_cpu_time
امیدواریم آموزش نحوه نوشتن حلقه های تودرتو در زبان فرترن برای دوستان مفید باشد. با تشکر از مهندس عدنان محمدی عزیز که این آموزش را برای تیم علمی و آموزشی دایا آماده کردند.
دیدگاهتان را بنویسید