ফোরট্রানে DO লুপ Parallelization
ফোরট্রানে DO লুপ Parallelization হল একটি গুরুত্বপূর্ণ কৌশল যা বড় ডেটাসেট বা গণনামূলক অপারেশনে parallel processing করতে সাহায্য করে। এটি একটি লুপের মধ্যে একই ধরনের কাজগুলিকে একাধিক প্রসেসরে বা কোরে সমান্তরালভাবে চালানোর মাধ্যমে প্রোগ্রামের কার্যকারিতা উন্নত করে।
ফোরট্রানে DO লুপ পারালালাইজেশনের জন্য সাধারণত OpenMP (Open Multi-Processing) ব্যবহৃত হয়। OpenMP একটি API যা একাধিক থ্রেডের মাধ্যমে প্রোগ্রাম চালানোর সুবিধা প্রদান করে, যার মাধ্যমে CPU কোরগুলোর সম্পূর্ণ ব্যবহার করা যায় এবং প্রোগ্রামের পারফরম্যান্স বৃদ্ধি পায়।
১. DO লুপ Parallelization এর জন্য OpenMP ব্যবহার
OpenMP ফোরট্রানে একটি প্রোগ্রামিং মডেল হিসেবে ব্যবহৃত হয়, যা সহজেই পারালাল কম্পিউটিং সুবিধা প্রদান করে। আপনি !$OMP PARALLEL DO ডিরেকটিভ ব্যবহার করে DO লুপের মধ্যে কাজগুলো সমান্তরালভাবে চালাতে পারেন।
উদাহরণ: DO লুপ Parallelization with OpenMP
program parallel_example
integer :: i
real :: arr(1000), result
! ডেটা ইনিশিয়ালাইজ করা
arr = 1.0
! OpenMP ডিরেকটিভ ব্যবহার করে DO লুপকে পারালালাইজ করা
result = 0.0
!$omp parallel do reduction(+:result)
do i = 1, 1000
result = result + arr(i)
end do
!$omp end parallel do
print *, 'Result: ', result
end program parallel_exampleব্যাখ্যা:
- !$omp parallel do: এই ডিরেকটিভটি DO লুপটিকে পারালাল করে এবং কোডের ভিতরে থাকা কাজগুলো একাধিক থ্রেডে ভাগ করে। এটি নিশ্চিত করে যে লুপের প্রতিটি iteration স্বতন্ত্রভাবে চালানো হবে।
- reduction(+:result): এটি একটি OpenMP reduction অপারেশন, যা পারালাল লুপের মধ্যে ফলাফলগুলো সঠিকভাবে একত্রিত করতে ব্যবহৃত হয়। এখানে
resultভেরিয়েবলটি সব থ্রেডে ব্যবহৃত হবে এবং শেষে তাদের যোগফল নেওয়া হবে। - arr(i): অ্যারের উপাদানগুলির জন্য গণনা করা হচ্ছে এবং এটি সমান্তরালভাবে করা হচ্ছে।
Note: ফোরট্রানে OpenMP ব্যবহার করার জন্য আপনার কম্পাইলারে OpenMP সমর্থন থাকতে হবে এবং সঠিক ফ্ল্যাগ (যেমন -fopenmp gfortran এর জন্য) ব্যবহার করতে হবে।
কম্পাইল এবং রান:
gfortran -fopenmp parallel_example.f90 -o parallel_example
./parallel_example২. OpenMP ডিরেকটিভ এবং ক্লজিং অপশনস
OpenMP বিভিন্ন ধরনের ডিরেকটিভ এবং ক্লজিং অপশনস প্রদান করে যা লুপ পারালালাইজেশনকে আরও কাস্টমাইজ করতে সহায়ক। এর মধ্যে কিছু গুরুত্বপূর্ণ ডিরেকটিভ ও অপশনস:
- !$OMP PARALLEL: এটি কোডের যে অংশটি পারালালভাবে চলবে তা নির্দেশ করে।
- !$OMP DO: এটি DO লুপ কে পারালাল হিসেবে নির্দেশ করে।
- !$OMP END DO: পারালাল DO লুপের শেষ নির্দেশ করে।
- !$OMP END PARALLEL: পারালাল ব্লকের শেষ নির্দেশ করে।
উদাহরণ: OpenMP সেকশনিং
program parallel_sections
integer :: i, result1, result2
result1 = 0
result2 = 0
!$omp parallel sections
!$omp section
do i = 1, 500
result1 = result1 + i
end do
!$omp section
do i = 501, 1000
result2 = result2 + i
end do
!$omp end parallel sections
print *, 'Sum of first 500 numbers: ', result1
print *, 'Sum of next 500 numbers: ', result2
end program parallel_sectionsব্যাখ্যা:
- এখানে, parallel sections ব্যবহার করা হয়েছে। এটি কোডের দুটি আলাদা অংশকে পারালালভাবে চালানোর জন্য ব্যবহৃত হয়।
- প্রথম section প্রথম 500 সংখ্যার যোগফল করে এবং দ্বিতীয় section পরবর্তী 500 সংখ্যার যোগফল করে।
৩. DO লুপ Parallelization এর সুবিধা
- পারফরম্যান্স বৃদ্ধি: ফোরট্রান কোডের পারফরম্যান্স অনেক বেড়ে যায় যখন DO লুপ এর প্রতিটি পুনরাবৃত্তি একাধিক CPU কোরে সমান্তরালভাবে রান করা হয়। এটি সিস্টেমের শক্তি সম্পূর্ণ ব্যবহার করতে সাহায্য করে।
- বড় ডেটাসেটের জন্য উপযোগী: যখন ডেটাসেট বড় হয় এবং একাধিক গণনা করতে হয়, তখন DO লুপ পারালালাইজেশন দ্রুত গণনা করার সুযোগ দেয়।
- সহজ ব্যবহার: OpenMP ডিরেকটিভ ব্যবহার করে সহজে পারালাল কম্পিউটিং করা যায়, যা কোডের পরিবর্তন এবং রক্ষণাবেক্ষণকে সহজ করে তোলে।
উপসংহার
ফোরট্রানে DO লুপ Parallelization OpenMP এর মাধ্যমে খুবই সহজ এবং কার্যকরীভাবে করা যায়। এটি প্রোগ্রামটির কার্যকারিতা অনেক উন্নত করে এবং বড় ডেটাসেটের প্রক্রিয়াকরণ দ্রুত করতে সহায়ক। আপনি OpenMP ডিরেকটিভগুলির মাধ্যমে কোডের পারফরম্যান্স বৃদ্ধি করতে পারেন এবং এটি মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
Read more