เนื่องจากสุดสัปดาห์ที่ผ่านมามีวันหยุดติดกันถึงสามวัน เลยมีเวลามาแก้ไข/เพิ่มเติมส่วนต่าง ๆ ให้กับไทยธอน
โดยฟีเจอร์เ่ด่นในเวอร์ชั่นนี้ ได้แก่ 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;
}

"""


# เตรียมการเพื่อส่งค่าเข้าจีพียู
แสดงผล("กำลังคอมไพล์โปรแกรม")
หน่วยประมวลผล.อ่านโค้ด(โปรแกรมบนจีพียู)
หน่วยประมวลผล.สร้างเคอร์เนล("montePI",0) #ซื่อเคอร์เนล,ลำดับตำแหน่งเคอร์เนล
หน่วยประมวลผล.ตั้งค่าอาร์กิวเมนต์หน่วยความจำเพื่อป้อนข้อมูล(0,0,0)#ลำดับตำแหน่งเคอร์เนล , ลำดับตำแหน่งอาร์กิวเมนต์,ลำดับตำแหน่งบัฟเฟอร์
หน่วยประมวลผล.ตั้งค่าอาร์กิวเมนต์หน่วยความจำเพื่อป้อนข้อมูล(0,1,1)
หน่วยประมวลผล.ตั้งค่าอาร์กิวเมนต์หน่วยความจำเพื่อรับข้อมูล(0,2,0)
หน่วยประมวลผล.ตั้งค่าอาร์กิวเมนต์ของเคอร์เนล(0,3)#ลำดับตำแหน่งเคอร์เนล ,จำนวนอาร์กิวเมนต์ที่ต้องการรับ-ส่งข้อมูล

# ส่งค่าเข้าจีพียูและประมวลผลจากนั้นอ่านค่าจากจีพียู
แสดงผล("กำลังเขียนบัฟเฟอร์")
หน่วยประมวลผล.เขียนบัฟเฟอร์(0)#ค่าลำดับตำแหน่งบัฟเฟอร์
หน่วยประมวลผล.เขียนบัฟเฟอร์(1)
แสดงผล("กำลังประมวลคำสั่ง")
หน่วยประมวลผล.ประมวลคำสั่งเคอร์เนล(0)#ค่าลำดับตำแหน่งเคอร์เนล
แสดงผล("กำลังอ่านบัฟเฟอร์")
หน่วยประมวลผล.อ่านบัฟเฟอร์(0)#ค่าลำดับตำแหน่งบัฟเฟอร์

ผลการคำนวน = หน่วยประมวลผล.รับบัฟเฟอร์(0)#ค่าลำดับตำแหน่งบัฟเฟอร์
ผลรวมทั้งหมด =  หน่วยประมวลผล.รับผลรวมของอาเรย์(ผลการคำนวน)
ไพ = 4 * (ผลรวมทั้งหมด / ทศนิยม(หน่วยประมวลผล.การย้ำ))
แสดงผล( "ได้ค่าไพประมาณ: %f"%ไพ)

ดาวโหลดไทยธอนเวอร์ชั่น 1.10 ได้ที่นี่

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s