MPICH2 บน Core 2 Duo
Written by Waipot on July 12, 2008 – 2:14 amMPICH2 ได้มีการพัฒนาบางอย่างที่ดีกว่า MPICH(1) พูดง่ายๆ คือ เวอร์ชันใหม่ย่อมดีกว่าเวอร์ชันเก่า วันนี้ผมลองทดสอบ MPICH2 โดยเราจะปรับแต่งให้ใช้งานบนเครื่องประเภท Symmetric Multiprocessors (SMPs) อย่างเช่น Core 2 Duo ของเครื่องโน๊ตบุคของผมนั่นเอง โดยทั่วไปเครื่องแบบนี้จะเป็นเครื่องคอมพิวเตอร์เดี่ยว แต่มีหลาย cpu และแชร์หน่วยความจำร่วมกัน (Shared-memory systems)
การติดตั้ง
ผมมี Ubuntu 64-bit version บน Intel Core 2 Duo T7300 (2.0 GB) สำหรับโน๊ตบุค การติดตั้ง MPICH2 ก็ปกติเหมือนกับ MPICH ซึ่งผมเคยเขียนไว้แล้ว (ติดตามอ่านที่นี่) แต่มีตัวเลือกที่แตกต่างกันหลักๆ คือ การเลือก Communication Device ด้วย –with-divice=DEVICE ซึ่งผมเลือก ch3:shm ที่สนับสนุน shared-memory เพราะน่าจะเข้ากับเครื่องของผมได้ดีที่สุด มีอีกหนึ่งตัวเลือก คือ ch3:nemesis ซึ่งก็น่าจะใช้ได้ แต่ดูเหมือนมันจะยังไม่สมบูรณ์ดี ผมได้เลือก ch3:nemesis เนื่องจากพบว่าให้ประสิทธิภาพที่ดีที่สุด และสนับสนุน shared-memory ด้วย นอกจากนี้ MPICH2 ยังให้เราสามารถเลือก Process Manager ด้วย –with-pm=PMGs โดยปริยายแล้วจะเป็น mpd เรายังสามารถเลือกได้ระหว่าง smpd และ gforker ผมก็ไม่รู้ว่าอันไหนดีบ้าง แต่ผมเลือก gforker เพราะ มันบอกว่า “This is a simple process manager that creates all processes on a single machine. It is useful for both debugging and on shared memory multiprocessors.” ดังนั้นมันน่าจะเข้ากับเครื่องแบบ SMPs ของผมดีที่สุด (อ่านคู่มือแบบละเอียดได้ที่นี่) ก่อนลงมือทำการติดตั้งจาก ให้ดาวน์โหลด mpich2 source เสียก่อน ซึ่งคือ เวอร์ชัน 1.0.7 ในที่นี้
$tar xzf mpich2-1.0.7.tar.gz $cd mpich2-1.0.7 $./configure --prefix=/usr/local --with-device=ch3:shm --with-pm=gforker $make $sudo make install
การใช้งาน
ผมจะทดสอบการใช้งาน mpich2 (ch3:shm) โดยการรันโปรแกรมง่ายๆ คือ hello-mpi2.c ซึ่งได้มีการปรับปรุงจากคราวก่อนเล็กน้อย โดยมีโค๊ดดังนี้
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int main(int argc, char *argv[]) { int rank, nproc; char *cpu_name; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); cpu_name = (char *)calloc(80,sizeof(char)); gethostname(cpu_name,80); printf("Hello! from process %d on machine=%s, of %d CPUs\n", rank, cpu_name, nproc); MPI_Finalize(); return(0); }
จากนั้นคอมไพล์ด้วยคำสั่ง
mpicc -o hello-mpi2 hello-mpi2.c
ที่นี้ลองมารันกันดู เริ่มจาก
$mpiexec -np 2 ./hello-mpi2 Hello! from process 0 on machine=computin-laptop, of 2 CPUs Hello! from process 1 on machine=computin-laptop, of 2 CPUs
จะเห็นว่าเราจะใช้ mpiexec แทน mpirun ใน MPICH2 นี้ ซึ่งได้ผลตามคาดหมายเพราะ Core 2 Duo นั้นมี 2 cpu ในตัวเดียว จากนั้นเพิ่มลองเพิ่มจำนวนโปรเซสในคำสั่งนี้ดู
$mpiexec -np 4 ./hello-mpi2 Hello! from process 0 on machine=computin-laptop, of 4 CPUs Hello! from process 1 on machine=computin-laptop, of 4 CPUs Hello! from process 2 on machine=computin-laptop, of 4 CPUs Hello! from process 3 on machine=computin-laptop, of 4 CPUs
จะเห็นว่ามันสามารถกระจายทั้งสี่โปรเซสไปบน cpu ทั้งสองได้ เปรียบสเมือนมีหลายๆ cpu ในเครื่องเดียว แต่ mpich2 ปกติได้กำหนดจำนวน cpu สูงสุดไว้ที่ 32 ซึ่งเราอาจจะสามารถเพิ่มได้
จะเห็นว่า MPICH2 นั้นสามารถทำงานได้บนเครื่อง PC แบบ SMPs อย่างเช่น Intel Core 2 Duo ซึ่งมันแปลงเครื่องธรรมดาให้สามารถโปรแกรมแบบขนานด้วย MPI ได้ ซึ่งเหมาะที่ใช้งานในการเรียนรู้ และพัฒนาโปรแกรมแบบขนานในส่วนตัวได้
Posted under Computers and Software | 3 Comments »

Subscribe to my blog using RSS