ফোরট্রান-এ প্যারালাল প্রোগ্রামিং (Parallel Programming in Fortran)
প্যারালাল প্রোগ্রামিং ফোরট্রানে অত্যন্ত গুরুত্বপূর্ণ, বিশেষত উচ্চক্ষমতাসম্পন্ন কম্পিউটেশনাল কাজ এবং বড় ডেটাসেট বিশ্লেষণে। প্যারালাল প্রোগ্রামিংয়ের মাধ্যমে ফোরট্রান প্রোগ্রামগুলোকে মাল্টিপ্রসেসর বা মাল্টি-কোর সিস্টেমে দ্রুত কার্যকর করা যায়। ফোরট্রান-এ প্যারালাল প্রোগ্রামিংয়ের জন্য বেশ কিছু পদ্ধতি রয়েছে, যেমন OpenMP এবং MPI (Message Passing Interface)।
১. OpenMP ব্যবহার করে প্যারালাল প্রোগ্রামিং
OpenMP (Open Multi-Processing) ফোরট্রানে একটি জনপ্রিয় প্যারালাল প্রোগ্রামিং লাইব্রেরি যা কোডকে থ্রেড-লেভেলে প্যারালালাইজ করতে ব্যবহৃত হয়। এটি প্রোগ্রামিংয়ের মাধ্যমে একাধিক থ্রেড তৈরি করে বিভিন্ন কাজ একই সাথে সম্পাদন করে।
OpenMP ব্যবহার শুরু করা
OpenMP ব্যবহার শুরু করার জন্য !$omp ডিরেক্টিভ ব্যবহার করা হয়। OpenMP ব্লকটি শুরু এবং শেষ করার জন্য !$omp parallel এবং !$omp end parallel ব্যবহার করা হয়।
উদাহরণ: সরল প্যারালাল লুপ
program parallel_example
use omp_lib
integer :: i, n
parameter (n=10)
integer, dimension(n) :: arr
!$omp parallel do
do i = 1, n
arr(i) = i * i
print *, "Thread", omp_get_thread_num(), ": arr(", i, ") =", arr(i)
end do
!$omp end parallel do
end program parallel_exampleএই উদাহরণে:
!$omp parallel doডিরেক্টিভ ব্যবহার করে লুপটিকে প্যারালালাইজ করা হয়েছে।- প্রতিটি থ্রেড
arr(i)এর মান কম্পিউট করছে এবং সংশ্লিষ্ট থ্রেড নম্বর প্রদর্শন করছে।
থ্রেড সংখ্যা নির্ধারণ করা
OpenMP-তে থ্রেড সংখ্যা নির্ধারণ করা যায় omp_set_num_threads ফাংশন ব্যবহার করে।
call omp_set_num_threads(4) ! ৪টি থ্রেড ব্যবহার করে কাজ সম্পন্ন করবে২. ডেটা শেয়ারিং এবং স্কোপ (Data Sharing and Scope)
OpenMP-তে ভেরিয়েবলগুলির ডেটা স্কোপ (সাধারণ বা ব্যক্তিগত) নির্ধারণ করা হয়। shared ভেরিয়েবলগুলি সব থ্রেড দ্বারা ব্যবহৃত হয় এবং private ভেরিয়েবলগুলি প্রতিটি থ্রেডের জন্য আলাদা থাকে।
উদাহরণ:
!$omp parallel private(i) shared(arr)
do i = 1, n
arr(i) = i * 2
end do
!$omp end parallelএখানে i ভেরিয়েবলটি প্রতিটি থ্রেডের জন্য আলাদা (private), আর arr ভেরিয়েবলটি সকল থ্রেডের জন্য শেয়ার করা।
৩. সিঙ্ক্রোনাইজেশন (Synchronization)
OpenMP-তে সিঙ্ক্রোনাইজেশন বা থ্রেড সমন্বয় করার জন্য কিছু ডিরেক্টিভ রয়েছে।
Barrier: সকল থ্রেড একত্রিত হওয়া পর্যন্ত অপেক্ষা করে।
!$omp barrierCritical: একাধিক থ্রেড একই সময়ে একটি ক্রিটিক্যাল সেকশনে প্রবেশ করতে পারে না।
!$omp critical sum = sum + arr(i) !$omp end critical
৪. Message Passing Interface (MPI)
MPI হলো আরেকটি জনপ্রিয় প্যারালাল প্রোগ্রামিং পদ্ধতি যা মূলত ডিস্ট্রিবিউটেড মেমোরি সিস্টেমে ব্যবহৃত হয়। MPI এর মাধ্যমে ডেটা বিভিন্ন প্রসেসরের মধ্যে স্থানান্তর করা যায়।
MPI ব্যবহার শুরু করা
MPI প্রোগ্রামের জন্য mpif.h হেডার ফাইল ব্যবহার করা হয় এবং প্রোগ্রামটি সাধারণত mpirun কমান্ডের মাধ্যমে চালানো হয়।
উদাহরণ: MPI ব্যবহার করে সরল প্রোগ্রাম
program mpi_example
include 'mpif.h'
integer :: rank, size, ierr
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
print *, "Hello from processor", rank, "of", size
call MPI_FINALIZE(ierr)
end program mpi_exampleএখানে:
MPI_COMM_RANKব্যবহার করে প্রতিটি প্রসেসরের একটি ইউনিক আইডি (rank) নির্ধারণ করা হয়েছে।MPI_COMM_SIZEব্যবহার করে মোট প্রসেসরের সংখ্যা নির্ধারণ করা হয়েছে।
৫. রিডাকশন (Reduction)
OpenMP-তে reduction অপারেটর ব্যবহার করে থ্রেডগুলো নির্দিষ্ট অপারেশন সম্পন্ন করার পরে ফলাফল একত্রিত করতে পারে।
integer :: sum, i
sum = 0
!$omp parallel do reduction(+:sum)
do i = 1, n
sum = sum + i
end do
!$omp end parallel doএখানে reduction(+:sum) নির্দেশ করছে যে প্রতিটি থ্রেডে sum এর অংশ যোগফল শেষে একত্রিত হবে।
উপসংহার
ফোরট্রানে প্যারালাল প্রোগ্রামিংয়ের জন্য OpenMP এবং MPI-এর মতো শক্তিশালী টুলস এবং লাইব্রেরি রয়েছে। OpenMP সাধারণত মাল্টি-কোর প্রসেসর এবং শেয়ারড মেমোরি সিস্টেমের জন্য কার্যকর, যেখানে MPI ডিস্ট্রিবিউটেড মেমোরি সিস্টেমে ব্যবহৃত হয়। প্যারালাল প্রোগ্রামিং ব্যবহার করে ফোরট্রান প্রোগ্রামগুলো দ্রুত এবং কার্যকরভাবে কাজ করতে পারে, যা বৈজ্ঞানিক গবেষণা এবং উচ্চক্ষমতাসম্পন্ন কম্পিউটেশনের জন্য উপযোগী।
ফোরট্রানে OpenMP ব্যবহার করে Parallel Programming
OpenMP (Open Multi-Processing) একটি API (Application Programming Interface) যা মাল্টি-কোর প্রসেসরের ব্যবহার করে প্রোগ্রামিং কোডকে প্যারালাল (Parallel) কার্যকর করার জন্য ব্যবহৃত হয়। এটি বিশেষভাবে C, C++, এবং Fortran প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। OpenMP ব্যবহার করে সহজেই মাল্টি-থ্রেডিং সমর্থিত প্রোগ্রাম তৈরি করা যায় এবং এটি অনেক ক্ষেত্রেই কোডের কার্যকারিতা উন্নত করতে সাহায্য করে, বিশেষ করে যখন গণনা-ভিত্তিক কাজ করা হয়।
OpenMP এর মূল কনসেপ্ট:
- Directives (ডিরেকটিভস): OpenMP প্যারালাল প্রোগ্রামিং করার জন্য ডিরেকটিভস ব্যবহার করা হয়, যা কম্পাইলারকে নির্দেশ দেয় কোন অংশে প্যারালাল কার্যক্রম করতে হবে।
- Threading: OpenMP সিপিইউ এর একাধিক থ্রেড ব্যবহার করে কাজ সম্পন্ন করতে পারে।
- Data Sharing: OpenMP ডেটা শেয়ারিং পদ্ধতি যেমন
private,sharedইত্যাদি ব্যবহারের মাধ্যমে থ্রেডগুলির মধ্যে ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়তা করে।
১. OpenMP ডিরেকটিভস
OpenMP তে প্রধানত তিনটি ধরনের ডিরেকটিভ ব্যবহৃত হয়:
!$OMP PARALLEL: প্যারালাল থ্রেড শুরু করতে ব্যবহৃত হয়।!$OMP DO: একটি লুপকে প্যারালাল করা।!$OMP END PARALLEL: প্যারালাল থ্রেডের শেষে নির্দেশ দেওয়া হয়।
২. একটি সাধারণ OpenMP প্রোগ্রাম উদাহরণ
ফোরট্রানে OpenMP ব্যবহার করে একটি প্যারালাল প্রোগ্রাম তৈরি করতে, প্রথমে আপনার কোডের মধ্যে !$OMP ডিরেকটিভস ব্যবহার করতে হবে। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে একটি সিম্পল লুপকে প্যারালাল করা হয়েছে।
উদাহরণ: প্যারালাল লুপ
PROGRAM openmp_example
INTEGER :: i, n
REAL :: sum, arr(1000)
! OpenMP ব্যবহারের জন্য
!$OMP PARALLEL DO REDUCTION(+:sum)
sum = 0.0
n = 1000
! অ্যারে ইনিশিয়ালাইজেশন
DO i = 1, n
arr(i) = i * 1.0
END DO
! প্যারালাল লুপ - অ্যারের উপাদান যোগফল বের করা
!$OMP DO
DO i = 1, n
sum = sum + arr(i)
END DO
!$OMP END DO
!$OMP END PARALLEL
PRINT *, 'Sum of array elements: ', sum
END PROGRAM openmp_exampleএখানে:
!$OMP PARALLEL DO REDUCTION(+:sum)ডিরেকটিভ দিয়ে লুপের প্রতিটি থ্রেডsumভেরিয়েবলটি বাড়াবে এবং পরে ফলাফল একত্রিত হবে।REDUCTIONঅপারেটরটি ব্যবহৃত হয়েছে যাতে প্রতিটি থ্রেডের জন্যsumভেরিয়েবল আলাদা থাকে এবং শেষে একটি একক মানে যোগফল জমা হয়।
৩. OpenMP ব্যবহার করে প্যারালাল ফাংশন
এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি ফাংশনকে প্যারালাল করা হচ্ছে:
PROGRAM openmp_parallel_function
INTEGER :: i, n
REAL :: result
n = 1000
! OpenMP প্যারালাল ফাংশন কল
!$OMP PARALLEL DO REDUCTION(+:result)
result = 0.0
DO i = 1, n
result = result + sqrt(i)
END DO
!$OMP END PARALLEL
PRINT *, 'Parallel result: ', result
END PROGRAM openmp_parallel_functionএখানে:
!$OMP PARALLEL DOডিরেকটিভ দিয়ে প্যারালাল লুপ শুরু করা হয়েছে।REDUCTION(+:result)ব্যবহার করা হয়েছে যাতে প্রতিটি থ্রেডের জন্যresultভেরিয়েবল আলাদা থাকে এবং শেষে ফলাফল একত্রিত হয়।
৪. OpenMP এর সুবিধা
- সহজ এবং দ্রুত প্যারালালাইজেশন: OpenMP আপনাকে সহজেই প্যারালাল প্রোগ্রাম লেখার সুবিধা প্রদান করে, কারণ এটি কম্পাইলার দ্বারা পরিচালিত হয় এবং খুব কম কোডের মাধ্যমে প্যারালাল প্রোগ্রামিং করা যায়।
- এফিশিয়েন্ট লুপ প্যারালালাইজেশন: OpenMP সাধারণত লুপ প্যারালালাইজেশনের জন্য ব্যবহৃত হয়। এটি বড় ডেটাসেটগুলির জন্য উপকারী, যেখানে সিম্পল লুপগুলিকে মাল্টি-কোর প্রসেসরের মাধ্যমে দ্রুত এক্সিকিউট করা যায়।
- বেশি কর্মক্ষমতা: যখন কম্পিউটার একাধিক কোর বা প্রসেসর সমর্থন করে, তখন OpenMP কোডের কার্যক্ষমতা অনেক বাড়িয়ে দিতে পারে।
৫. OpenMP কম্পাইল এবং রান করা
OpenMP কোড কম্পাইল করতে ফোরট্রান কম্পাইলার ব্যবহার করতে হয় যা OpenMP সমর্থন করে। যেমন:
- GFortran: ফোরট্রানে OpenMP কোড কম্পাইল করার জন্য
-fopenmpফ্ল্যাগ ব্যবহার করা হয়।
কম্পাইল:
gfortran -fopenmp openmp_example.f90 -o openmp_exampleRun:
./openmp_example
উপসংহার
OpenMP ফোরট্রানে মাল্টি-কোর বা মাল্টি-থ্রেডিং ব্যবহার করে প্যারালাল প্রোগ্রাম তৈরি করতে একটি শক্তিশালী টুল। এটি কোডের কার্যকারিতা বাড়াতে সাহায্য করে, বিশেষ করে গণনা-ভিত্তিক কাজের জন্য। আপনি যখন বড় ডেটাসেট নিয়ে কাজ করছেন বা বড় সংখ্যক গণনা করতে চান, তখন OpenMP এর মাধ্যমে সহজে আপনার কোডকে প্যারালাল করা সম্ভব।
Shared Memory এবং Multithreading এর ধারণা
Shared Memory এবং Multithreading দুটি গুরুত্বপূর্ণ ধারণা যা উচ্চক্ষমতাসম্পন্ন এবং প্যারালাল কম্পিউটিং সিস্টেমে ব্যবহৃত হয়। এগুলোর মাধ্যমে একই সময়ে একাধিক কাজ সম্পাদন করা সম্ভব হয়, যা প্রোগ্রামের কার্যকারিতা এবং পারফরম্যান্সকে উন্নত করে।
১. Shared Memory (শেয়ার্ড মেমরি)
Shared Memory একটি পদ্ধতি যেখানে একাধিক প্রসেস (process) একই মেমরি স্থান ব্যবহার করতে পারে। এটি সাধারণত Multiprocessing সিস্টেমে ব্যবহৃত হয়, যেখানে একাধিক প্রসেস একে অপরের সাথে তথ্য ভাগ করে নিতে পারে এবং তাদের কাজগুলি একত্রিত করতে পারে।
Shared Memory এর বৈশিষ্ট্য:
- একাধিক প্রসেসের জন্য এক্সেস: একাধিক প্রসেস একই মেমরি স্পেসে ডেটা অ্যাক্সেস করতে পারে, যা তাদের মধ্যে দ্রুত তথ্য আদান-প্রদান করতে সহায়ক হয়।
- পারফরম্যান্স উন্নতি: এটি মেমরি অ্যাক্সেসের গতিকে উন্নত করে, কারণ একাধিক প্রসেসের জন্য পৃথক মেমরি বরাদ্দের প্রয়োজন হয় না।
- ডেটা শেয়ারিং: একটি প্রসেস যখন তথ্য আপডেট করে, অন্য প্রসেসগুলি সহজেই সেই পরিবর্তিত ডেটা অ্যাক্সেস করতে পারে।
Shared Memory এর ব্যবহার:
- মাল্টিপ্রসেসিং (Multiprocessing): একাধিক প্রসেস একই শেয়ার্ড মেমরি স্পেসের মধ্যে কাজ করতে পারে।
- প্যারালাল কম্পিউটিং: একাধিক থ্রেড বা প্রসেসের মধ্যে দ্রুত তথ্য শেয়ার করা।
- ডেটা শেয়ারিং: যখন একাধিক টাস্ক একে অপরের সাথে কাজ করতে হয় এবং দ্রুত ফলাফল চাইতে হয়।
উদাহরণ:
ধরা যাক, দুটি প্রসেসের মধ্যে একটি Shared Memory এলাকা রয়েছে, যা একটি নির্দিষ্ট ডেটাকে শেয়ার করতে সক্ষম:
- একটি প্রসেস আপডেট করতে পারে একটি মান এবং অন্য প্রসেসটি একই শেয়ার্ড মেমরি স্পেসে সেই মানটি অ্যাক্সেস করে ফলাফল প্রদান করবে।
২. Multithreading (মাল্টিথ্রেডিং)
Multithreading হল একটি প্রোগ্রামিং পদ্ধতি যেখানে একাধিক থ্রেড একই প্রোগ্রামের মধ্যে সমান্তরালভাবে চলতে থাকে। এখানে একাধিক থ্রেড একই প্রোগ্রামের অংশ হিসেবে কাজ করতে পারে, কিন্তু প্রতিটি থ্রেড একটি আলাদা কাজ সম্পাদন করে। এটি একটি Single Process এ একাধিক কার্যক্রম সম্পাদন করার ক্ষমতা প্রদান করে।
Multithreading এর বৈশিষ্ট্য:
- একাধিক থ্রেড: একটি প্রোগ্রামে একাধিক থ্রেড থাকলে, প্রতিটি থ্রেড আলাদাভাবে একটি নির্দিষ্ট কাজ সম্পাদন করতে পারে।
- কম সময় ও কম রিসোর্স ব্যবহার: একাধিক থ্রেড একটি একক প্রসেসের মধ্যে চলতে পারে, তাই এটি কম রিসোর্স ব্যবহার করে এবং একাধিক কাজ একসাথে করতে সক্ষম হয়।
- শেয়ার্ড রিসোর্স: সমস্ত থ্রেড একই রিসোর্স (যেমন মেমরি স্পেস) ব্যবহার করতে পারে, তবে সঠিক সমন্বয়ের মাধ্যমে (যেমন লকিং) তাদের মধ্যে ডেটার ক্ষতি বা দ্বন্দ্ব এড়ানো যায়।
Multithreading এর ব্যবহার:
- পারফরম্যান্স উন্নতি: CPU-তে একাধিক থ্রেডের মাধ্যমে সমান্তরাল কাজ করা সম্ভব, যা প্রোগ্রামের এক্সিকিউশন স্পিড বাড়াতে সাহায্য করে।
- UI Responsiveness: ব্যবহারকারী ইন্টারফেসের জন্য মাল্টিথ্রেডিং প্রোগ্রামগুলি আরও প্রতিক্রিয়া দক্ষ, কারণ UI থ্রেড একটি থ্রেডে চলে, যখন অন্য থ্রেডগুলি ব্যাকগ্রাউন্ড কাজ করতে পারে।
- সার্ভার সিস্টেম: মাল্টিথ্রেডিং ওয়েব সার্ভার বা ডেটাবেস সার্ভার সিস্টেমে ব্যবহৃত হয় যাতে একাধিক ক্লায়েন্ট একসাথে সেবা পেতে পারে।
উদাহরণ:
ধরা যাক একটি ওয়েব সার্ভার মাল্টিথ্রেডিং ব্যবহার করে, যেখানে প্রতিটি ক্লায়েন্টের জন্য একটি পৃথক থ্রেড তৈরি হয়:
- সার্ভারটি একাধিক ক্লায়েন্টের জন্য একযোগে কাজ করতে সক্ষম, কারণ এটি একাধিক থ্রেডে একসাথে রিকোয়েস্ট হ্যান্ডল করতে পারে।
৩. Shared Memory এবং Multithreading এর মধ্যে সম্পর্ক
- Shared Memory এবং Multithreading সাধারণত একে অপরের সাথে সম্পর্কিত। যখন একাধিক থ্রেড একই প্রোগ্রামে কাজ করে, তারা সাধারণত একটি Shared Memory স্পেস ব্যবহার করে ডেটা শেয়ার করে।
- মাল্টিথ্রেডিংয়ে, প্রতিটি থ্রেড একই মেমরি অ্যাক্সেস করতে পারে, তাই এই থ্রেডগুলির মধ্যে Shared Memory ব্যবহৃত হয় যাতে তারা একে অপরের সাথে তথ্য শেয়ার করতে পারে এবং সমন্বিত কাজ সম্পাদন করতে পারে।
- Shared Memory ব্যবহারের মাধ্যমে মাল্টিথ্রেডিংয়ের কাজ আরও দ্রুত এবং দক্ষভাবে সম্পন্ন করা যায়, কারণ তথ্য থ্রেডগুলির মধ্যে দ্রুত প্রবাহিত হয় এবং একে অপরের কাছে দ্রুত পৌঁছায়।
৪. Multithreading এবং Shared Memory ব্যবহারের সুবিধা
- পারফরম্যান্স উন্নতি: মাল্টিথ্রেডিংয়ের মাধ্যমে একই প্রোগ্রাম একাধিক কাজ একযোগে করতে সক্ষম হয়, যা কার্যকারিতা বৃদ্ধি করে। শেয়ার্ড মেমরি আরও দ্রুত ডেটা এক্সচেঞ্জে সহায়ক হয়।
- কম রিসোর্স ব্যবহার: মাল্টিথ্রেডিংয়ের মাধ্যমে কম রিসোর্সের মধ্যে একাধিক কাজ সম্পাদন করা যায় এবং শেয়ার্ড মেমরি ব্যবহার করে একই মেমরি স্পেসে একাধিক থ্রেডের কাজ করা যায়।
- ব্যবহারকারী ইন্টারফেসের দক্ষতা: মাল্টিথ্রেডিং UI ডেভেলপমেন্টে ব্যবহৃত হয়, যেখানে একাধিক থ্রেড ব্যবহারকারী ইন্টারফেসের প্রতিক্রিয়া এবং ব্যাকগ্রাউন্ড কার্যক্রম সঠিকভাবে পরিচালনা করতে পারে।
উপসংহার
Shared Memory এবং Multithreading উভয়ই উচ্চ ক্ষমতাসম্পন্ন কম্পিউটিং এবং সমান্তরাল প্রক্রিয়া পরিচালনা করতে ব্যবহৃত হয়। Shared Memory একাধিক প্রসেসের মধ্যে দ্রুত ডেটা শেয়ার করার সুযোগ দেয়, যখন Multithreading একক প্রসেসের মধ্যে একাধিক কাজ সমান্তরালে চালাতে সক্ষম করে। এই দুটি পদ্ধতি কম্পিউটার সিস্টেমের পারফরম্যান্স বৃদ্ধি করতে সহায়ক, বিশেষ করে বড় ডেটাসেট এবং বাস্তব সময়ের অ্যাপ্লিকেশনগুলিতে।
ফোরট্রানে 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 ডিরেকটিভগুলির মাধ্যমে কোডের পারফরম্যান্স বৃদ্ধি করতে পারেন এবং এটি মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
MPI (Message Passing Interface) এর মাধ্যমে Distributed Computing
MPI (Message Passing Interface) একটি স্ট্যান্ডার্ড প্রোটোকল যা প্রোগ্রামগুলোকে বিভিন্ন প্রসেসরের মধ্যে ডেটা এবং বার্তা পাঠানোর মাধ্যমে যোগাযোগ করতে সক্ষম করে। এটি ডিস্ট্রিবিউটেড কম্পিউটিং বা পারালাল কম্পিউটিং এর ক্ষেত্রে অত্যন্ত গুরুত্বপূর্ণ, যেখানে একটি বৃহৎ সমস্যা একাধিক নোড বা প্রসেসরের মধ্যে ভাগ করা হয় এবং সমাধান করা হয়।
ফোরট্রানসহ বিভিন্ন প্রোগ্রামিং ভাষায় MPI ব্যবহৃত হয় ডিস্ট্রিবিউটেড কম্পিউটিং সিস্টেম তৈরি করতে, যেখানে একাধিক প্রসেস একে অপরের সঙ্গে বার্তা বা ডেটা আদান-প্রদান করে।
১. MPI কী এবং কেন ব্যবহৃত হয়?
MPI একটি প্ল্যাটফর্ম-স্বাধীন প্রোটোকল যা বিভিন্ন প্রসেসে রান করা প্রোগ্রামগুলির মধ্যে বার্তা পাঠানোর জন্য ব্যবহৃত হয়। এটি ডিস্ট্রিবিউটেড সিস্টেমে একাধিক প্রসেসরের মধ্যে সমন্বয় সাধন করতে সাহায্য করে এবং সেগুলির মধ্যে দ্রুত ও দক্ষভাবে যোগাযোগ সম্ভব করে।
- ডিস্ট্রিবিউটেড কম্পিউটিং: যেখানে একাধিক কম্পিউটার বা প্রসেস একত্রে কাজ করে, সমস্যার বিভিন্ন অংশ সমাধান করে।
- পারালাল কম্পিউটিং: একাধিক প্রসেস একযোগে সমাধান করতে সক্ষম হওয়ায় দ্রুত কাজ সম্পন্ন হয়।
MPI বার্তা আদান-প্রদান প্রক্রিয়াকে সহজ করে এবং প্রসেসিং পুওল তৈরির মাধ্যমে সমন্বিতভাবে ডেটা প্রক্রিয়া করতে সাহায্য করে।
২. MPI এর মূল বৈশিষ্ট্য
- মেসেজ পাসিং (Message Passing):
- MPI বার্তা আদান-প্রদান পদ্ধতি ব্যবহার করে একাধিক প্রসেসের মধ্যে তথ্য বা ডেটা পাঠাতে বা গ্রহণ করতে পারে। এটি প্যারালাল কম্পিউটিং এবং ডিস্ট্রিবিউটেড সিস্টেম এ খুবই কার্যকরী।
- স্কেলেবিলিটি (Scalability):
- MPI প্রোগ্রামগুলি ছোট এবং বড় স্কেল (যত বেশি প্রসেস বা নোডে রান করানো যায়) ব্যবহারের জন্য উপযুক্ত। এটি সিস্টেমের আকারের ভিত্তিতে সম্পূর্ণরূপে স্কেল করতে সক্ষম।
- বহু প্রসেসর সমর্থন (Multi-Processor Support):
- MPI একটি বা একাধিক প্রসেসর ব্যবহার করে কম্পিউটেশন সমাধান করতে সাহায্য করে, যেখানে প্রতিটি প্রসেস একটি নির্দিষ্ট কাজ সম্পাদন করে এবং পরে সেই কাজের ফলাফল একত্রিত হয়।
- বহু প্ল্যাটফর্ম সমর্থন (Cross-Platform Support):
- এটি একাধিক প্ল্যাটফর্মে কাজ করতে সক্ষম এবং একাধিক হার্ডওয়্যার এবং অপারেটিং সিস্টেমের সাথে সামঞ্জস্যপূর্ণ।
- ভার্চুয়াল শেয়ার্ড মেমরি (Virtual Shared Memory):
- MPI প্রোগ্রামগুলি সাধারণত ডিস্ক, মেমরি এবং প্রসেসরগুলি ব্যবহৃত ডিস্ট্রিবিউটেড সিস্টেমে একে অপরের মধ্যে ডেটা পাঠাতে সক্ষম হয়।
৩. MPI এর প্রধান ফাংশনসমূহ
MPI এর অনেক ফাংশন রয়েছে, যার মাধ্যমে প্রসেসগুলো একে অপরের সঙ্গে যোগাযোগ করতে পারে এবং সমন্বিতভাবে কাজ করতে পারে। কিছু গুরুত্বপূর্ণ ফাংশন হলো:
- MPI_Init: MPI লাইব্রেরি ইনিশিয়ালাইজ করে।
- MPI_Comm_size: কম্পিউটেশনাল ক্লাস্টারে প্রসেসের সংখ্যা খুঁজে বের করে।
- MPI_Comm_rank: একটি প্রসেসের র্যাঙ্ক বা আইডি খুঁজে বের করে।
- MPI_Send: একটি প্রসেস থেকে অন্য প্রসেসে ডেটা পাঠায়।
- MPI_Recv: একটি প্রসেস থেকে অন্য প্রসেসে ডেটা গ্রহণ করে।
- MPI_Finalize: MPI লাইব্রেরি শেষ করে।
৪. ফোরট্রানে MPI ব্যবহার
ফোরট্রান প্রোগ্রামিং ভাষায় MPI ব্যবহার করার জন্য, আপনাকে প্রথমে MPI লাইব্রেরি ইনস্টল করতে হবে এবং প্রোগ্রামে এর ফাংশন ব্যবহার করতে হবে। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো, যেখানে দুটি প্রসেসের মধ্যে বার্তা পাঠানো এবং গ্রহণ করা হচ্ছে।
উদাহরণ (ফোরট্রানে MPI):
program mpi_example
use mpi
integer :: rank, size, ierr
integer :: msg_send, msg_recv
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, size, ierr)
if (rank == 0) then
msg_send = 100
call MPI_Send(msg_send, 1, MPI_INTEGER, 1, 0, MPI_COMM_WORLD, ierr)
print *, "Process 0 sent message: ", msg_send
elseif (rank == 1) then
call MPI_Recv(msg_recv, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierr)
print *, "Process 1 received message: ", msg_recv
end if
call MPI_Finalize(ierr)
end program mpi_exampleএখানে:
MPI_Init: MPI লাইব্রেরি ইনিশিয়ালাইজ করে।MPI_Comm_rank: প্রতিটি প্রসেসের র্যাঙ্ক (আইডি) নির্ধারণ করে।MPI_Comm_size: প্রসেসের মোট সংখ্যা নির্ধারণ করে।MPI_Send: প্রোগ্রামের প্রসেস 0 থেকে প্রসেস 1-এ ডেটা পাঠায়।MPI_Recv: প্রসেস 1 ডেটা গ্রহণ করে।MPI_Finalize: MPI সেশনটি শেষ করে।
আউটপুট:
Process 0 sent message: 100
Process 1 received message: 100৫. MPI এর সুবিধা
- প্যারালাল প্রোগ্রামিং: একাধিক প্রসেসকে একযোগে কাজ করতে সক্ষম করে, যা বৃহৎ পরিমাণের ডেটা বা জটিল সমস্যা দ্রুত সমাধান করতে সহায়ক।
- স্কেলেবিলিটি: ছোট থেকে বড় কম্পিউটিং সিস্টেমে সহজে স্কেল করা যায়।
- বহু প্রসেসরের মধ্যে যোগাযোগ: ডিস্ট্রিবিউটেড সিস্টেমে ডেটার দ্রুত আদান-প্রদান সম্ভব হয়।
- সম্পূর্ণ নিয়ন্ত্রণ: ডিস্ট্রিবিউটেড সিস্টেমের প্রতিটি প্রসেসকে সম্পূর্ণ নিয়ন্ত্রণ করা যায়।
৬. MPI এর সীমাবদ্ধতা
- কঠিন ডিবাগিং: একাধিক প্রসেস একে অপরের সঙ্গে যোগাযোগ করতে থাকে, যার ফলে ডিবাগিং চ্যালেঞ্জিং হতে পারে।
- কম্পিউটেশনাল লোড: মাঝে মাঝে ডেটার সঠিকভাবে আদান-প্রদান না হওয়া বা ডেটা প্যাকেটের দেরি হওয়া, কম্পিউটেশনাল লোড বাড়াতে পারে।
উপসংহার
MPI একটি শক্তিশালী টুল যা ডিস্ট্রিবিউটেড এবং প্যারালাল কম্পিউটিংয়ে ব্যবহৃত হয়। এটি একাধিক প্রসেসের মধ্যে যোগাযোগ এবং সমন্বয়ের জন্য কার্যকরী এবং এটি ব্যাপকভাবে সাইন্স এবং ইঞ্জিনিয়ারিং সমস্যাগুলির সমাধানে ব্যবহৃত হয়। ফোরট্রানে MPI ব্যবহার করে বড় সমস্যা ভাগ করা এবং সমাধান করা সহজ, যা দ্রুত এবং দক্ষ কম্পিউটেশন নিশ্চিত করে।
Read more