วันศุกร์ที่ 19 กุมภาพันธ์ พ.ศ. 2553

Game of Life #2 Parallel Program

ขั้นตอนการออกแบบโปรแกรม
หลักการทำงานของโปรแกรมแบบ Parallel (Shared Memory)

ในตัวโปรแกรม main() จะทำการวิ่ง loop เพื่อเรียกฟังก์ชั่น process<<<>>>(d_board,maxx,maxy)ซึ่งเป็นฟังก์ชั่นที่ทำงานใน GPU (Kernel Function) โดยใช้หลายๆ thread ทำการเซตค่าตาราง d_board (ตัวแปรใน GPU) ให้เป็น 0 ทุกค่าก่อน แล้วทำการหาผลรวมของจำนวนสมาชิกรอบตัว 8 ทิศทาง จากนั้นทำการเช็คว่าเข้าเงื่อนใขการมีชีวิตอยู่หรือไม่แล้วทำการเซตค่าคืนว่า cell นั้นจะมีชีวิตหรือไม่ ทำการคืนค่ากลับสู่ board (ตัวแปร CPU) โดยการใช้คำสั่ง cudaMemcpy(board,d_board,size,cudaMemcpyDeviceToHost) วน loop จนครบ แล้วจึงแสดงผลด้วยการบันทึกลงสู่ไฟล์ Board_parallel.output มีการใช้ shared memory โดยการมีตัวแปร sboard (ตัวแปรใน GPU) __shared__ int sboard [][] เพื่อทำการเก็บค่าตำแหน่งปัจจุบันในตาราง เมื่อทำการเปรียบเทียบเงื่อนไขการมีชีวิต แล้วจึงทำการสลับค่ากับตาราง board

Source Code


การคอมไพล์โปรแกรม:
พิมพ์คำสั่ง nvcc inputfile.cu –o outputfile
nvcc gol_par.cu -o gol_par


การเรียกใช้งานโปรแกรม:
พิมพ์คำสั่ง ./outputfile





ป้อนค่าเริ่มต้นโปรแกรมดังนี้
• ขนาดของตาราง Board สี่เหลี่ยมจัตุรัส [n]
• ค่า Ramdom Number [n]
• จำลองเวลาในการมีชีวิต Life Time [n]
• เลือกรูปแบบการจัดเก็บไฟล์ [1/2]
1. เก็บทุก Time Step อยู่ที่ไฟล์ RandomBoard_parallel.input
2. เก็บเฉพาะ Final Time Step อยู่ที่ไฟล์ Board_parallel.output



พิมพ์คำสั่งเพื่อเรียกดู file
more RamdomBoard_parallel.input

แสดงข้อมูลที่บันทึกใน file ดังรูป



แหล่งที่เก็บ source code

Server 61.95.208.65 under path file //cs72102/gol_par.cu





Game of Life #1 Sequential Program

หลักการทำงานของโปรแกรมแบบ Sequential
1. ณ จุดที่ cell หนึ่งๆ อยู่ ให้ทำการนับ cell ที่อยู่รอบตัว นั่นคือ 8 ทิศทาง
โดยใช้ฟังก์ชั่น check_arounj(i,j) แล้วเก็บค่าไว้ในตัวแปร num


2. นำค่าที่นับได้ มาเช็คเงื่อนไขในการชีวิตอยู่

- สำหรับเซลที่มีชีวิตอยู่แล้ว มีกฏการเปลี่ยนแปลงดังนี้
1. ถ้าเซลนั้นมีเซลที่มีชีวิตอยู่รอบข้างเพียงหนึ่งเซลหรือไม่มีเลย เซลนั้นจะตาย เพราะความเหงา
2. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอยู่รอบข้างตั้งแต่ 4 เซลขึ้นไป เซลนั้นจะตายเพราะประชากรมากเกินไป
3. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอยู่รอบข้าง 2 ถึง 3 เซล เซลนั้นจะมีชีวิตต่อไป
- สำหรับเซลที่ว่างอยู่ มีกฏการเปลี่ยนแปลงคือ
1. ถ้ามีเซลที่มีชีวิตอยู่รอบๆมัน 3 เซล เซลที่ว่างนั้นจะกลายเป็นมีชีวิต

แสดงค่าความเป็นไปได้ดังตาราง


3. ทำการบันทึกค่าลงตารางที่1(board1) แล้วจำลองการทำงานใน time step ต่อไปแล้วบันทึกลงตารางที่ 2(board2) ดังนั้นเวลาจะเปลี่ยนการแสดงผลก็ทำการสลับตารางกันโดยที่มีการตัวแปร temp มาช่วยสลับค่า

source code



compile program
พิมพ์คำสั่ง nvcc inputfile.cu –o outputfile



run program
พิมพ์คำสั่ง ./outputfile

ป้อนค่าเริ่มต้นโปรแกรมดังนี้
• ขนาดของตาราง Board สี่เหลี่ยมจัตุรัส [n]
• ค่า Ramdom Number [n]
• จำลองเวลาในการมีชีวิต Life Time [n]
• เลือกรูปแบบการจัดเก็บไฟล์ [1/2]
1. เก็บทุก Time Step อยู่ที่ไฟล์ RandomBoard.input
2. เก็บเฉพาะ Final Time Step อยู่ที่ไฟล์ Board.output



พิมพ์คำสั่งเพื่อดูข้อมูลในไฟล์
more RamdomBoard.input



แสดงผลลัพธ์เก็บในไฟล์




แหล่งที่เก็บ source code
server 61.91.208.65 under path //cs72102/par_seq.cu






Project Games of Life

ในการจำลองที่มีชื่อว่า Games of Life ซึ่งได้รับการคิดค้นขึ้นโดยนัก
คณิตศาสตร์ John Conway และตีพิมพ์ใน Scientific American ในปี 1970
เกมส์นี้แสดงการเปลี่ยนแปลงของ cell บนตาราง 2 มิติ ตามจังหวะ
การเดินของเวลาที่เปลี่ยนไปทีละขั้น โดยมีกฏเกณท์ดังนี้คือ
========= R U L E S =======================
- สำหรับเซลที่มีชีวิตอย่่แล้ว มีกฏการเปลี่ยนแปลงดังนี้
1. ถ้าเซลนั้นมีเซลที่มีชีวิตอย่่รอบข้างเพียงหนึ่งเซลหรือไม่มีเลย เซล
นั้นจะตาย เพราะความเหงา
2. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอย่่รอบข้างตั้งแต่ 4 เซลขึ้นไป เซลนั้นจะ
ตายเพราะประชากรมากเกินไป
3. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอย่่รอบข้าง 2 ถึง 3 เซล เซลนั้นจะมีชีวิต
ต่อไป
- สำหรับเซลที่ว่างอยู่ มีกฏการเปลี่ยนแปลงคือ
1. ถ้ามีเซลที่มีชีวิตอยู่รอบๆมัน 3 เซล เซลที่ว่างนั้นจะกลายเป็นมีชีวิต

=========== P R O J E C T =====================
ให้สร้างโปรแกรมโดยมีข้อกำหนดดังนี้
• กำหนดให้เซลอยู่ในตารางสองมิติที่เป็นสี่เหลี่มจตุรัส โดยให้ผู้ใช้เป็นผู้
กำหนดขนาดความยาวของด้านกว้าง(หรือยาว)เป็นเท่าใดก็ได้
• ผู้ใช้ต้องสามารถกำหนดให้โปรแกรมกำหนดค่าเริ่มต้นของตารางโดยใช้
วิธีการ Randomโดยกำหนดให้ความน่าจะเป็นที่จะมีเซลที่มีชีวิตและ
เซลที่ว่างอย่่ในตารางนั้นมีค่าเท่ากัน และผู้ใช้ต้องพิมพ์ค่าของตาราง
ตามรูปแบบดังในภาพที่ 1 (ซึ่งเราจะอธิบายในข้อถัดไป) ลงสู่ไฟล์ชื่อ
RandomBoard.input
• ผู้ใช้ต้องสามารถกำหนดให้มีการอ่านค่าเริ่มต้นจากไฟล์ได้ โดยที่ไฟล์
อินพุทจะต้องมีรูปแบบดังในภาพที่ 1 ซึ่งเป็นภาพแสดงค่าของเซลต่างๆ
ในตารางขนาด 4 x 4 โดยที่ X หมายถึงเซลที่มีชีวิตและ – หมาย
ถึงเซลที่ว่าง


ภาพที่ 1
• ผู้ใช้ต้องสามารถกำาหนดจำนวนขั้นของการเปลี่ยนแปลง(เป็นการจำลอง
เวลา)ได้ตามต้องการ
• ผู้ใช้ต้องสามารถเลือกได้ว่าจะให้โปรแกรมพิมพ์ค่าของเซลในตารางลงสู่
ไฟล์(ตามรูปแบบในภาพที่ 1)ในทุกๆขั้นของการเปลี่ยนแปลงหรือในขั้น
สุดท้ายเท่านั้น ในกรณีเขียนข้อมูลทุกขั้น ให้เขียนข้อมูลลงสู่ไฟล์
BoardImmediate.x โดยที่ x หมายถึงค่าขั้นเวลาของตารางนั้น แต่
ถ้าเขียนข้อมูลเฉพาะรอบสุดท้ายก็ให้เขียนสู่ไฟล์ Board.output

=========== E N D P R O J E C T =================