MPICH บน Core 2 Duo
Written by Waipot on July 11, 2008 – 6:54 amการเขียนโปรแกรมแบบขนาน (parallel programming) ด้วย MPI บนเครื่องคลัสเตอร์ขนาดใหญ่นั้น ดูเหมือนจะเป็นเรื่องลำบาก เนื่องจากบนระบบใหญ่ๆ จำผู้ใช้งานก็มีมาก ซึ่งต้องรอคิวสั่งงานกันนานๆ มันจึงเป็นอุปสรรคต่อการพัฒนาโปรแกรมในระยะเริ่มต้น ซึ่งต้องคอมไพล์รวมทั้งการดีบักโปรแกรมกันบ่อยครั้งด้วย ตอนแรกผมพยายามมองหาวิธีแก้ไขปัญหานี้ โดยคิดว่าจะสร้างเครื่องคลัสเตอร์เล็กๆ ส่วนตัว เพื่อใช้ในการพัฒนาโปรแกรม และ แก้บั๊ก ก่อน จนกว่าโปรแกรมจะเสถียร แล้วจึงค่อยนำไปรันบนเครื่องคลัสเตอร์ใหญ่ๆ แต่การสร้างคลัสเตอร์ต้องมีคอมพิวเตอร์มากกว่าหนึ่งเครื่อง ซึ่งมันใช้ต้นทุนสูงไป ผมค้นหาสักพัก พบว่า mpich มีโมดุลที่เรียกว่า ch_shmem ซึ่งสนับสนุนเครื่องประเภท Symmetric Multiprocessors (SMPs) อย่างเช่น Core 2 Duo ของเครื่องโน๊ตบุคของผมนั่นเอง โดยโครงสร้างของเครื่องแบบนี้คือ มี 2 cpu แต่แชร์หน่วยความจำร่วมกัน
การติดตั้ง
ผมมี Ubuntu 64-bit version บน Intel Core 2 Duo T7300 (2.0 GB) สำหรับโน๊ตบุค โดยใน Ubuntu ได้ทำไบนารีไฟล์ไว้แล้ว คือ libmpich-shmem* libmpich-shmem*-dev libmpich-shmem-bin ซึ่งสามารถติดตั้งด้วยคำสั่ง sudo apt-get install
ซึ่งพร้อมใช้งานได้ทันทีหลังจากติดตั้งเสร็จ แต่ในที่นี้ผมขอเสนอการติดตั้งจาก source เพราะสามารถปรับแต่งได้ ให้เริ่มจากการดาวน์โหลด mpich source ผมต้องการติดตั้ง mpich v1 (1.2.7p1) ในที่นี้
$tar xzf mpich.tar.gz $cd mpich-1.2.7p1 $./configure --prefix=/usr/local --with-arch=LINUX --with-device=ch_shmem \\ --with-usesysv $make $sudo make install #หากต้องการถอนการติดตั้ง $sudo /usr/local/sbin/mpiuninstall
การคอมไพล์ mpich นี้ค่อนข้างมาตรฐาน ยกเว้นตรงตัวเลือกใน ./configure คือ –with-arch=LINUX บอกให้รู้สถาปัตยกรรมของเครื่อง –with-device=ch_shmem เลือก DEVICE เพื่อคอมไพล์ mpich สำหรับ shared memory และ –with-usesysv เพื่อเลือกใช้ System V shared memory และ semaphore routines ซึ่งตัวเลือกเหล่านี้ได้อธิบายไว้ในคู่มือของ mpich หมดแล้ว
การใช้งาน
ผมจะทดสอบการใช้งาน mpich ch_shmem โดยการรันโปรแกรมง่ายๆ คือ hello-mpi.c ซึ่งมีโค๊ดดังนี้
#include <stdio.h> #include <stdlib.h> #include <mpi.h> int main(int argc, char *argv[]) { int rank, nproc; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); printf("Hello! from process %d of %d CPUs\n", rank, nproc); MPI_Finalize(); return(0); }
จากนั้นคอมไพล์ด้วยคำสั่ง
mpicc -o hello-mpi hello-mpi.c
ที่นี้ลองมารันกันดู เริ่มจาก
$mpirun -np 2 ./hello-mpi Hello! from process 1 of 2 CPUs Hello! from process 0 of 2 CPUs
ซึ่งได้ผลตามคาดหมายเพราะ Core 2 Duo นั้นมี 2 cpu ในตัวเดียว จากนั้นเพิ่มลองเพิ่มจำนวนโปรเซสในคำสั่งนี้ดู
$mpirun -np 4 ./hello-mpi Hello! from process 1 of 4 CPUs Hello! from process 2 of 4 CPUs Hello! from process 3 of 4 CPUs Hello! from process 0 of 4 CPUs
จะเห็นว่ามันสามารถกระจายทั้งสี่โปรเซสไปบน cpu ทั้งสองได้ เปรียบสเมือนมีหลายๆ cpu ในเครื่องเดียว แต่ mpich ch_shmem ปกติได้กำหนดจำนวน cpu สูงสุดไว้ที่ 32 ซึ่งเราอาจจะสามารถเพิ่มได้ (สังเกตุว่า process 0 ซึ่งเป็น Master node มักเสร็จสิ้นทีหลัง)
สรุปแล้ว mpich ch_shmem นี้มีประสิทธิภาพพอที่จะทำให้เราเรียนรู้ และ พัฒนาโปรแกรมแบบขนานในสไตล์ของ SPMD (single program multiple data) โดยการติดตั้งบนเครื่อง SMP อย่าง Core 2 Duo ได้ ซึ่งถ้าใครมี Quad core ก็น่าจะสนุกกว่านี้ แต่อย่างไรก็ตามเมื่อพัฒนาโปรแกรมจนเสถียรแล้ว ควรจะนำไปรันบนเครื่องคลัสเตอร์ระดับใหญ่ เพื่อให้ได้ประสิทธิภาพสูงสุด อย่างเช่น เครื่อง Tera cluster ของ โครงการ ThaiGrid หรือ NECTEC HPC ซึ่งเปิดโอกาสให้บุคคลทั่วไปสมัครเป็นสมาชิกได้ ซึ่งผมมีบัญชีผู้ใช้ของเครื่อง Tera แล้ว แต่ของ NECTEC HPC ยังไม่ได้ลองสมัครเลย
Posted under Computers and Software | 2 Comments »

Subscribe to my blog using RSS