Posts Tagged ‘มอนติคาร์โล’

เนื่องจากสุดสัปดาห์ที่ผ่านมามีวันหยุดติดกันถึงสามวัน เลยมีเวลามาแก้ไข/เพิ่มเติมส่วนต่าง ๆ ให้กับไทยธอน
โดยฟีเจอร์เ่ด่นในเวอร์ชั่นนี้ ได้แก่ GPU Computing หรือการใช้ การ์ดจอของเรามาประมวลผลแทน CPU ซึ่งการประมวลผลแบบพร้อม ๆ กับหลาย ๆ Thread นั้น จะให้ผลเร็วกว่า CPU อย่างมหาศาล

การคำนวนด้วย GPU นี้เป็นเทคโนโลยีในยุคใหม่ที่เหมาะสำหรับการคำนวนข้อมูลจำนวนมาก ๆ ที่ต้องการความเร็วสูงในการประมวลผล
โดยระบบจะรองรับการ์ดจอที่ผลิตออกมาตั้งแต่ปี 2008 เป็นต้นไป (ซึ่งผมได้พัฒนาและทดสอบกับ nvidia ยังไม่แน่ใจว่าจะรองรับการ์ดของ ATI ได้หรือไม่)

ในบทความนี้ผมขอยกเอา การคำนวนค่าไพแบบมอลติคาร์โลที่เคยได้เสนอไปแล้วในบทความก่อน ๆ
มาคำนวนใหม่บน GPU เพื่อเปรียบเทียบให้เห็นความแตกต่าง

#โค้ดคำสั่งโปรแกรมภาษาไทยธอน
แสดงผล("เริ่มโปรแกรม")
หน่วยประมวลผล = จีพียู(2000000) #จำนวนรอบ(การย้ำ)คำนวน 2000000 รอบ

แหล่งข้อมูล1 = หน่วยประมวลผล.สร้างอาเรย์แบบสุ่มค่า() # สำหรับค่า x ในพิกัด(x,y)
หน่วยประมวลผล.ตั้งค่าบัฟเฟอร์(0,แหล่งข้อมูล1)#บันทึกบัฟเฟอร์ไว้ในตัวเอนจิ้น
แหล่งข้อมูล2 = หน่วยประมวลผล.สร้างอาเรย์แบบสุ่มค่า() # สำหรับค่า y ในพิกัด(x,y)
หน่วยประมวลผล.ตั้งค่าบัฟเฟอร์(1,แหล่งข้อมูล2)

โปรแกรมบนจีพียู = """
//#//pragma OPENCL EXTENSION cl_khr_fp64 : enable
 __kernel void montePI (__global float* a, __global float* b, __global float* c, int iNumElements)
{
    // find position in global arrays
    int iGID = get_global_id(0);
    if (iGID >= iNumElements)
    {
        return;
    }
	float dist;
	dist = sqrt(pow(a[iGID], 2.0f) + pow(b[iGID], 2.0f));
	if (dist <= 1.0)
		c[iGID] = 1.0;
	else
		c[iGID] = 0.0;
}

"""

 อ่านต่อ...
Advertisements

จากตัวอย่างในการทำ Graphic Simulation คราวที่แล้ว เราพบว่าการที่ต้องมาไล่คำนวนและวาดเม็ดกระสุนใหม่หมดตั้งแต่แรก ในทุก ๆ เฟรมที่แสดงผล(Render)ออกมาจะเกิดปัญหาคอขวดขึ้น โดยภาระส่วนใหญ่จะไปตกอยู่ที่การคำนวนอย่างหนักของ CPU ทำให้โปรแกรมของเราทำงานช้าลงเรื่อย ๆ
มาคราวนี้เราจะแก้ป้ญหานี้โดยเรียกใช้การแคช ซึ่งจะเก็บรายละเอียดที่วาดเสร็จแล้วไว้ใน บ่อพักข้อมูล(Buffer) เพื่อเรียกใช้งานได้อย่างรวดเร็วทันทีทันใด โดยในตัวอย่างนี้เราจะทำการแคชทุก ๆ 350 เฟรม
ทำได้โดยการดัดแปลงโค้ดดังนี้

#คำสั่งโปรแกรมภาษาไทยธอน
กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
ระยะแคช = 350

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(ตน.x,ตน.y)
		glEnd()


 อ่านต่อ...

ตามที่สัญญาเอาไว้่ ลองมาดู Simulation ของการหาค่า PI ด้วย วิธีการแบบ Monte Carlo โดยเป็น Visual Simulation กันครับ
(โปรแกรมที่ใช้ในการทำ Simulation นี้ ต้องเป็น Thaithon version 1.09 ขึ้นไป ดาวน์โหลดได้ ที่นี่ https://peacedev.wordpress.com/download/ เลยครับ)

#คำสั่งโปรแกรมภาษาไทยธอน

กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
รายการกระสุน = []

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(self.x,self.y)
		glEnd()

 อ่านต่อ...

ปกติโดยส่วนตัวแล้วผมเป็นคนชอบใช้งานอะไรที่ง่าย ๆ ไม่ต้องพิธีรีตรองมาก ถึงแม้ว่าจริง ๆ แล้วจะชอบศึกษาเรื่องที่ดูซับซ้อนมาก ๆ ก็ตาม
แต่การอธิบายให้อยู่ในรูปที่เข้าใจได้ง่าย ๆ นั้นน่าจะดีกว่า
ดังนั้นเมื่อต้องการแก้ไขปัญหาบางอย่างที่มีความซับซ้อนขึ้นมา ผมจะชอบเลือกวิธี Brute force มาเป็นอันดับต้น ๆ แม้ว่าไม่ได้ตั้งความหวัง ไว้ว่า 100% ต้องเจอผลลัพธ์อย่างถูกต้องแม่นยำ แต่อย่างน้อยวิธีการนี้อาจทำให้เราเห็นถึงธรรมชาติของปัญหานั้น ๆ ได้เร็วขึ้น
แน่นอน ในการทำงานบางครั้งที่ต้องเจอกับ Tools หรือ Frame work ที่ยุ่งยากซับซ้อน ผมจะทำการ Hack มัน :)

วิธีแบบ Monte Carlo เป็นหนึ่งในวิธีที่ใช้แก้ปัญหาที่เข้ากันกับธรรมชาติของผมมาก
วิธีนี้มี Concept คร่าว ๆ ดังนี้ครับ

1. นิยามค่าที่เป็นไปได้ทั้งหมดของข้อมูล input
2. สุ่มยิงค่า input เข้าไปแบบกระจัดกระจาย
3. ทำการคำนวนหา ความสัมพันธ์ของค่า input เพิ่อหา output ที่ต้องการ
4. รวบรวมผลลัพธ์มาสรุปเป็น คำตอบสุดท้าย

ตัวอย่างสุด Hot ของ Monte Carlo method ก็คงไม่พ้น การหาค่า pi ในแบบ Monte Carlo
จาก step ข้างบน เรามาสรุปเป็นวิธีหาค่า pi ได้ดังนี้

อ่านต่อ…