قرار است برنامه ای که با زبان C++ نوشته شده را کامپایل و اجرا کنیم این برنامه از MPI استفاده می کند و عملیات ضرب 2 ماتریس را انجام می دهد که برای راحتی و اطمینان از نتیجه ماتریس های تولید شده درایه هایی با مقدار 1 دارند.
این برنامه را می توانید بر روی یک سیستم و یا بصورت توزیع شده روی چند سیستم اجرا کنید که چگونگی این کار در ادامه توضیح داده خواهد شد.
*این آموزش برای سیستم عامل لینوکس و توزیع دبیان (Linux Debian) آماده شده است!
دانشگاه فردوسی ، دانشگاه امام رضا ، دکتر سوادی ، MPI ، توزیع شده ، موازی ، تمرین ، ضرب ماتریس ، Matrix Multiplication with MPI
1.پیش نیاز ها
sudo apt-get install openssh-server sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install mpi-default-dev
3-باید یک یوزر (mpiuser) برای راحت تر کار کردن با mpi بسازیم، برای این کار دستور زیر را اجرا کنید و پسوردی برای آن قرار دهید که فراموش نکنید! (مابقی مقادیر خواسته شده مهم نیست).
sudo adduser mpiuser
وقتی یوزر را ساختید با دستور زیر یوزر فعال خود در ترمینال را به mpiuser تغییر دهید.
su mpiuser
خب وقتی پسورد را زدید و یوزر شما تغییر کرد دستور زیر را بزنید و به آدرس اصلی این یوزر بروید.
cd /home/mpiuser/
4-فایل های مربوط به ضرب ماتریس ها را دریافت کنید: دریافت MPI-Matrix.zip : حجم: 42.7 کیلوبایت
از حالت فشرده خارج کنید و فایل Matrix را به آدرس زیر منتقل کنید (توجه کنید که باید با دسترسی root یا یوزر mpiuser این کار را انجام یدهید!)/home/mpiuser/
cd /home/mpiuser/Matrix/
2.کد و کامپایل
حالا باید بریم سراغ کامپایل برنامه، برنامه MPI هم نحوه کامپایل متفاوتی دارد و هم نحوه اجرای آن فرق دارد.
فایل هایی که در شاخه Matrix قرار دادید شامل فایل های کامپایل شده نیز هستند ولی اگر می خواهید خودتان مجدد کامپایل بگیرید و یا تغییراتی در کد بدهید و کامپایل بگیرید می توانید از دستورات زیر استفاده کنید:
*دقت کنید که مسیر ترمینال شما باید در شاخه Matrix باشد و بهتر است یا یوزر mpiuser باشد.
mpic++ mpi.cpp -o mpi
mpic++ generate.cpp -o generate
خب برای استفاده باید با فایل generate ماتریس ایجاد کنیم، برای این کار دستور زیر را در ترمینال بزنید تا ماتریس های مربعی a و b را با ابعاد وارد شده (500) ایجاد کند.
./generate 500
3.اجرا تک سیستمی
mpirun -n 4 ./mpi
خروجی این دستور به صورت زیر خواهد بود
Reading a.dat containing 500 * 500 items... Reading b.dat containing 500 * 500 items... Sending data to 4 clients 0: Calculating a * b (size=125)... 3: Calculating a * b (size=125)... 1: Calculating a * b (size=125)... 2: Calculating a * b (size=125)...
4.اجرای توزیع شده
nano hostfile
127.0.0.1 192.168.1.5 192.168.1.8:2
برای اجرا توزیع شده همان دو خط اول کافیست و بقیه برای استفاده وسیع تر است.
mpirun --hostfile hostfile ./mpi
خروجی این دستور به صورت زیر خواهد بود
Reading a.dat containing 500 * 500 items... Reading b.dat containing 500 * 500 items... Sending data to 8 clients 1: Calculating a * b (size=62)... 2: Calculating a * b (size=62)... 6: Calculating a * b (size=62)... 5: Calculating a * b (size=62)... 0: Calculating a * b (size=62)... 7: Calculating a * b (size=62)... 4: Calculating a * b (size=62)... 3: Calculating a * b (size=62)...