Assignment 5 (CS427) – Game of Life

April 6, 2010 Leave a comment

ข้อกำหนดของโปรแกรม

  1. จำนวนโปรเซสทั้งหมดจะต้องมีจำนวนเท่ากับ (N/K)^2 + 1
  2. ค่าของความกว้างของบอร์ด(N) และขนาดของTile(K) จะต้องมีค่าอย่างน้อย 1 และ ค่าของ N จะต้องหารด้วย k ลงตัวเสมอ
  3. ค่าการสุ่มความน่าจะเป็นในการมีชีวิตของแต่ละเซลจะต้องมีค่าอยู่ระหว่าง [0, 100] เท่านั้น

การคอมไพล์โปรแกรมและการใช้งาน

  1. คอมไพล์โปรแกรมด้วยคำสั่ง mpicc -o Game_of_Life Game_of_Life.c จะได้ไฟล์โปรแกรมชื่อ Game_of_Life
  2. รันโปรแกรมด้วยคำสั่ง mpirun –np processnum Game_of_Life โดยจะต้องกำหนดจำนวนโปรเซสให้ถูกต้องตามข้อกำหนด
  3. โปรแกรมจะถามถึงค่าของ ความกว้างของบอร์ด(N) ขนาดของTile(K) จำนวนหน่วยเวลา(t) ต้องการอ่านค่าเริ่มต้นจากไฟล์หรือสุ่มจากโปรแกรม ถ้าเลือกอ่านค่าจากไฟล์จะต้องกำหนดชื่อไฟล์ด้วย หากเลือกสุ่มจากโปรแกรมจะต้องกำหนดค่าความน่าจะเป็นในการที่แต่ละช่องจะมีชีวิตด้วย และ ต้องการเซฟไฟล์ Immediate หรือไม่  ซึ่งจะต้องกรอกให้สอดคล้องกับจำนวนโปรเซสที่กำหนดไว้ หากข้อมูลที่กรอกไม่สอดคล้องหรือไม่ถูกต้องได้แก่
  • ค่า N หรือ k ไม่ใช่เลขจำนวนเต็มบวก
  • N หาร k ได้ไม่ลงตัว
  • จำนวนโปรเซสไม่ถูกต้อง
  • ไม่พบไฟล์ที่ต้องการอ่าน

เมื่อพบเงื่อนไขดังกล่าวโปรแกรมจะจบการทันงานโดนทันที ซึ่งจะต้องเริ่มทำการรันโปรแกรมใหม่

การออกแบบโปรแกรมและขั้นตอนการทำงาน

การทำงานของโปรแกรมจะใช้จำนวนโปรเซสเท่ากับจำนวนของ Tile ทั้งหมดบวกด้วย 1 เนื่องจากจะใช้โปรเซส 0 ในการติดต่อกับผู้ใช้ เขียนข้อมูลลงไฟล์ สุ่มค่าเริ่มต้น และใช้โปรเซสที่เหลือทั้งหมดในการคำนวนค่าของแต่ละ Tile ที่ได้รับมอบหมาย

1. โปรเซส 0 จะจองพื้นที่บอร์ดขนาด N x N เพื่อรับข้อมูลจากไฟล์หรือสุ่มขึ้น ส่วนโปรเซสอื่นทั้งหมดจะทำการจองบอร์ดย่อยขนาด (K + 2) x (K + 2) ซึ่งจะสร้างขอบเพิ่มให้กับแต่ละ Tile ในทุกด้านเพื่อใช้ในการคำนวน โดยบอร์ดย่อยที่สร้างขึ้นจะสร้างขึ้นเป็นจำนวน 2 บอร์ดเพื่อใช้ในการคำนวน จากนั้นส่งค่าของ N, k, t ไปยังทุกโปรเซสด้วยคำสั่ง MPI_Bcast()

2. จากนั้นโปรเซส 0 จะแบ่งบอร์ดเป็น Tile และส่งไปให้แต่ละโปรเซสเรียงตามลำดับจากซ้ายไปทางขวาและขึ้นแถวใหม่จนครบดังภาพที่ 1

ภาพที่ 1

3. โปรเซสอื่นทั้งหมดจะรับมาเก็บไว้ที่ตรงกลางของบอร์ดย่อยที่มีความยาวมากกว่าขนาดของ Tile อยู่ 2 ดังภาพที่ 2

ภาพที่ 2

4. ส่งข้อมูลระหว่างแต่ละโปรเซสเพื่อคำนวนเวลาถัดไปของแต่ละ Tile ด้วยการตรวจสอบว่าแต่ละโปรเซสจะต้องส่งค่าไปยังโปรเซสใดบ้าง และรับค่ามาจากโปรเซสที่ส่งค่าไปหาเสมอ

  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบบนและไม่ได้อยู่ขอบซ้าย ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านซ้ายบน ดังลูกศรสีแดงในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)%c != 0 && (rank-1)/c > 0 โดยจะส่งเฉพาะข้อมูลที่อยู่ในแถวที่สองและหลักที่สองจำนวน 1 ค่าเท่านั้น ดังภาพที่ 4
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบล่างและไม่ได้อยู่ขอบขวา ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านขวาล่าง ดังลูกศรสีเหลืองในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข rank%c != 0 && (rank-1)/c < c-1 โดยจะส่งเฉพาะข้อมูลที่อยู่ในแถวรองสุดท้ายและหลักรองสุดท้ายจำนวน 1 ค่าเท่านั้น ดังภาพที่ 4
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบบน ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านบน ดังลูกศรสีส้มในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)/c > 0 โดยจะส่งเฉพาะข้อมูลในแถวที่สอง ตั้งแต่หลักที่สองจนถึงหลักรองสุดท้ายรวมทั้งสิ้น k ค่า ดังภาพที่ 5
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบล่าง ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านล่าง ดังลูกศรสีม่วงในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)/c < c-1 โดยจะส่งเฉพาะข้อมูลในแถวรองสุดท้าย ตั้งแต่หลักที่สองจนถึงหลักรองสุดท้ายรวมทั้งสิ้น k ค่า ดังภาพที่ 5
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบบนและไม่ได้อยู่ขอบขวา ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านขวาบน ดังลูกศรสีเขียวในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)/c > 0 && rank%c !=0 โดยจะส่งเฉพาะข้อมูลที่อยู่ในแถวที่สองและหลักรองสุดท้ายจำนวน 1 ค่าเท่านั้น ดังภาพที่ 6
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบล่างและไม่ได้อยู่ขอบซ้าย ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านซ้ายล่าง ดังลูกศรสีน้ำเงินในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)/c < c-1 && (rank-1)%c != 0 โดยจะส่งเฉพาะข้อมูลที่อยู่ในแถวรองสุดท้ายและหลักที่สองจำนวน 1 ค่าเท่านั้น ดังภาพที่ 6
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบขวา ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านขวา ดังลูกศรสีฟ้าในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข rank%c !=0 โดยจะส่งเฉพาะข้อมูลในหลักรองสุดท้าย ตั้งแต่แถวที่สองจนถึงแถวรองสุดท้ายรวมทั้งสิ้น k ค่า ดังภาพที่ 7
  • โปรเซสที่มี Tile ที่ไม่ได้อยู่ขอบซ้าย ให้ส่งและรับข้อมูลจากโปรเซสที่มี Tile อยู่ด้านซ้าย ดังลูกศรสีดำในภาพที่ 3 โดยคำนวนจากโปรเซสที่ตรงกับเงื่อนไข (rank-1)%c != 0 โดยจะส่งเฉพาะข้อมูลในหลักที่สอง ตั้งแต่แถวที่สองจนถึงแถวรองสุดท้ายรวมทั้งสิ้น k ค่า ดังภาพที่ 7

หมายเหตุ: rank เป็นหมายเลขของโปรเซส, c เป็นจำนวนเต็มบวกที่ได้มาจาก N/k

ภาพที่ 3

ภาพที่ 4 ภาพที่ 5
ภาพที่ 6 ภาพที่ 7

MPI Defined Type ที่ใช้

MPI_Subboard_type : บอร์ดย่อยที่ได้จากการแบ่งเป็น Tile ของบอร์ดใหญ่เพื่อส่งจากโปรเซส 0 ไปยังโปรเซสอื่น
MPI_Type_vector(K, K, N, MPI_INT, &MPI_Subboard_type);

MPI_Subboard_type2 : บอร์ดย่อยที่ใช้ในการประมวลผลของแต่ละโปรเซส และรับส่งบอร์ดย่อยกับโปรเซส 0
MPI_Type_vector(K, K, K+2, MPI_INT, &MPI_Subboard_type2);

MPI_Boardrow_type : แถวของบอร์ดย่อยที่ใช้ในการส่งระหว่าง Tile ที่อยู่ด้านล่างและบน
MPI_Type_contiguous(K, MPI_INT, &MPI_Boardrow_type);

MPI_Boardcol_type : หลักของบอร์ดย่อยที่ใช้ในการส่งข้อมูลระหว่าง Tile ที่อยู่ด้านซ้ายและขวา
MPI_Type_vector(K, 1, K+2, MPI_INT, &MPI_Boardcol_type);

ตัวอย่างการใช้งานแบบอ่านค่าจากไฟล์

$ mpirun –np 5 Game_of_Life
Enter board size (N): 6
Enter tile size (K): 3
Enter time step (t): 2
Do you want to save immediate file (yes/no): yes
Read board from file (yes/no – if no board is initialize by random): yes
Enter input file name : inputboard2.txt

inputboard2.txt Board.Immediate Board.output
XX-XX-
—XXX
—-XX
X-X-X-
-X-X-X
XXX—
t = 0
XX-XX-
—XXX
—-XX
X-X-X-
-X-X-X
XXX—t = 1
–XX-X
–X—
——
-XX—
—XX-
XXX—t = 2
–XX–
–XX–
-XX—
–XX–
X–X–
-XXX–
–XX–
–XX–
-XX—
–XX–
X–X–
-XXX–

ตัวอย่างการใช้งานแบบสุ่มความน่าจะเป็นของการมีชีวิต

$ mpirun –np 5 Game_of_Life
Enter board size (N): 6
Enter tile size (K): 3
Enter time step (t): 8
Do you want to save immediate file (yes/no): no
Read board from file (yes/no – if no board is initialize by random): no
Random life cell probability (0-100): 60

RandomBoard.input Board.output
X-XX-X
-X–XX
-X—X
XX-XXX
–XXX-
XX-X-X
——
——
——
-XX—
X–X–
-XX—

ดาวน์โหลด : ซอร์สโค้ด, ตัวอย่าง input 1, ตัวอย่าง input 2

การ Live Migration ภายในเครื่อง

March 25, 2010 Leave a comment

การทำการ Live Migration ภายในเครื่องนั้นมีขั้นตอนดังนี้

1. เริ่มต้นด้วยการเปิดเครื่องปลายทางด้วยคำสั่ง kvm -m 512 host.img -incoming tcp:0.0.0.0:8000 โดย

  • -m 512 หมายถึงให้เปิดเครื่องโดยกำหนด memory ไว้ที่ 512 MB (ใส่หรือไม่ใส่ก็ได้)
  • host.img อิมเมจไฟล์ของเครื่องที่จะทำการย้าย
  • -incoming tcp:0.0.0.0:8000 เป็นการบอกว่าจะทำการ migrate ผ่านทาง tcp ที่ ip 0.0.0.0 และ port 8000

เมื่อเปิดเครื่องสำเร็จ ตัวเครื่องจะอยู่ในสถานะ stopped รอการย้ายการทำงานมาที่เครื่อง

2. เปิดเครื่องที่จะทำการ Migrate โดยใช้คำสั่ง kvm -m 512 host.img เหมือนทำการเปิด virtual machine ปรกติ

3. ทดสอบการทำงานของการ Migrate ด้วยการเปิดโปรแกรม Siag บนหน้าจอ Desktop

4. เข้าสู่ command mode ของ kvm ด้วยการกด ctrl+alt+2

5. พิมพ์คำสั่ง migrate -d tcp:0.0.0.0:8000 ลงไปเพื่อเป็นการบอกว่าให้ทำการ migrate ไปที่ ip 0.0.0.0 และ port 8000

6. จากนั้นที่เครื่องปลายทางจะสังเกตุเห็นว่าการทำงานของเครื่องต้นทางถูกย้ายมาทำงานที่เครื่องปลายทาง สังเกตุได้จากโปรแกรม Siag ที่ได้เปิดเอาไว้ก่อนทำการ migrate

Categories: Virtualization Tags: , ,

เว็บไซต์ทุนเรียนต่อ

March 13, 2010 Leave a comment
ช่วงนี้กำลังวางแผนว่าจะเรียนต่อหรือทำงานดี ก็เลยลองๆหาทุนดู
 
กลัวจะลืมเลยเอาเว็บไซต์มาแปะไว้ในนี้แล้วกัน
 
 
Categories: Uncategorized