วันพุธที่ 16 กันยายน พ.ศ. 2552

การเขียนโปรแรมภาษาซี ในการประมวลผลแบบเวกเตอร์ ตอนจบ

ขอขอบคุณ คุณ วัฒนา นัทธี
นอกจากจะสามารถใช้ตัวดำเนินการต่าง ๆ เช่น บวก ลบ คูณ หารกับข้อมูลแบบเวกเตอร์แล้ว จีซีซียังได้กำหนดฟังก์ชันพิเศษสำหรับจัดการข้อมูลแบบเวกเตอร์โดยเฉพาะ การใช้ฟังก์ชันพิเศษซึ่งจีซีซี เรียกว่า ฟังก์ชัน ในตัว (built-in function) นี้ อาจจะช่วยให้สามารถเขียนโปรแกรมที่ใช้งานส่วนต่าง ๆ ในโปรเซสเซอร์ได้เต็มประสิทธิภาพ หรือทำงานได้เร็วขึ้นกว่าเดิม เช่น ฟังก์ชัน __builtin_ia32_maxps(v4sf, v4sf) สำหรับหาค่ามากที่สุดระหว่างข้อมูลแต่ละตัวในเวกเตอร์ 2 ชุด กล่าวคือ เมื่อกำหนดเวกเตอร์ให้ 2 ชุด หน่วยประมวลผลจะเปรียบเทียบข้อมูลที่ตำแหน่งเดียวกัน ระหว่างเวกเตอร์สองชุด แล้วเลือกข้อมูลตัวที่มากที่สุด เพื่อสร้างเป็นเวกเตอร์ผลลัพธ์ การใช้ฟังก์ชันนี้ทำให้สามารถหาค่ามากที่สุดระหว่าง เวกเตอร์สองตัวได้ โดยไม่จำเป็นต้องเปรียบเทียบหลายครั้ง หรือฟังก์ชัน __builtin_ia32_pavgw(v4hi, v4hi) ใช้หาค่าเฉลี่ยระหว่างข้อมูลแต่ละตัวของเวกเตอร์ที่เก็บเลข จำนวนเต็ม 4 ตัว ฟังก์ชันพิเศษเหล่านี้กำหนดขึ้นตาม คำสั่งของหน่วยประมวลผล เช่น ฟังก์ชัน __buitin_ia32_maxps จะตรงกับคำสั่ง maxps ใน ภาษาแอสเซมบลี ดังนั้นการใช้การฟังก์ชันเหล่านี้จึงขึ้นกับสถาปัตยกรรม และคุณสมบัติของโพรเซสเซอร์เป็นหลัก คำสั่ง maxps นั้นจะใช้ได้เฉพาะโพรเซสเซอร์ที่สนับสนุน เอสเอสอีเท่านั้น ส่วนคำสั่ง pavgw จะใช้ได้ในหน่วยประมวลผลที่สนับสนุนเอ็มเอ็มเอกซ์

ข้อจำกัด
แม้ว่าการประมวลผลแบบเวกเตอร์จะช่วยเพิ่มความเร็วในการทำงาน ทำให้ใช้งานโพรเซสเซอร์ได้เต็มประสิทธิภาพก็ตาม แต่ก็ยังมีจุดอ่อน หรือข้อจำกัดหลายด้าน ซึ่งมีข้อจำกัดหลักอยู่ที่การนำไปใช้งานในระบบอื่นเนื่องจากวิธีการเขียนโปรแกรมแบบเวกเตอร์ค่อนข้างยึดติดกับสถาปัตยกรรม และคำสั่งของโพรเซสเซอร์ ทำให้ไม่สามารถนำโปรแกรมที่เขียนขึ้นไปใช้ในระบบอื่นได้ทันที เช่น โปรแกรมคำนวณหาระยะทางแบบยูคลิดที่นำมาเป็นตัวอย่างข้างต้น จะนำไปใช้ได้เฉพาะโพรเซสเซอร์ เพนเทียมของบริษัทอินเทล หรือโพรเซสเซอร์ของบริษัท เอเอ็มดีเท่านั้น ไม่สามารถนำไปใช้กับโพรเซสเซอร์แบบพาวเวอร์พีซีที่ใช้ในระบบแมคอินทอชซึ่งใช้คำสั่งแบบ แอลทิเวกได้ เนื่องจากมีวิธีการเขียนโปรแกรม และฟังก์ชันที่ใช้ก็ต่างกัน เช่น ถ้าจะเขียนโปรแกรมคำนวณระยะทาง
แบบยูคลิดสำหรับระบบแอลทิเวก จะได้ดังโปรแกรม โปรแกรมที่ 9 ต่อไปนี้

1 float eucidean_altivec(
2 int len, float *a,
3 float *b) {
4 int i=0,l;
5 vector float vx,vy,vz;
6 vector vsum=
7 (vector float)vec_splat_s8(0);
8 float sum=0.0;
9 while(len>0) {
10 vx = (vector float)
11 vec_ld(0, x+i);
12 vy = (vector float)
13 vec_ld(0, y+i);
14 vz = vec_sub(vx, vy);
15 vsum = vec_madd(vz, vz,
16 vsum);
17 len -= 4;
18 i += 4;
19 }
20 vsum = vec_add(vsum,
21 vec_sld(vsum,vsum,4));
22 vsum = vec_add(vsum,
23 vec_sld(vsum,vsum,8));
24 vec_ste(vsum, 0, &sum);
25 return sqrt(sum);
26 }
โปรแกรมที่ 9

โปรแกรมนี้ทำงานเช่นเดียวกันกับโปรแกรมที่ แสดงในตัวอย่างโปรแกมที่ 8 แต่จะเห็นว่าวิธีการเขียนโปรแกรมตลอดจนฟังก์ชันต่าง ๆ ที่ใช้จะแตกต่างกันโดยสิ้นเชิง ดังนั้นจึงไม่สามารถนำรหัสต้นฉบับ (source code) มาใช้งานได้ทันที จะต้องมีการปรับแก้ขนานใหญ่ และ แม้ว่าจะสามารถเขียนโปรแกรมเพื่อคำนวณแบบเวกเตอร์ บนโปรเซสเซอร์เพนเทียมได้แล้ว ก็จะต้องศึกษาลักษณะสถาปัตยกรรมของโพรเซสเซอร์พาวเวอร์พีซีเสียก่อน จึงจะสามารถเขียนโปรแกรมได้ แต่การศึกษานี้คงจะใช้เวลาไม่มากนัก สำหรับผู้ที่มีความชำนาญเรื่องสถาปัตยกรรมคอมพิวเตอร์อยู่แล้ว

นอกจากข้อจำกัดที่เกี่ยวข้องกับโพรเซสเซอร์แล้ว คอมไพเลอร์ก็จัดเป็นข้อจำกัดหรือจุดอ่อนอีกข้อ หนึ่งของการเขียนโปรแกรมแบบนี้ เนื่องจากปัจจุบันยังไม่มีมาตรฐานสำหรับการเขียนโปรแกรมแบบเวกเตอร์ ทำให้คอมไพเลอร์แต่ละแบบใช้วิธีการเขียนโปรแกรมแตกต่างกัน อย่างเช่น ตัวอย่างโปรแกรมทั้งหมดในบทความนี้จะใช้วิธีการเขียนของจีซีซีเป็นหลัก ดังนั้นหากเปลี่ยนไปใช้คอมไพเลอร์แบบอื่น ก็จะต้องเปลี่ยนวิธีการเขียนโปรแกรมใหม่ ตามระบบคอมไพเลอร์ที่ใช้

ข้อจำกัดทั้งหลายเหล่านี้ ซึ่งอาจจะทำให้ บางคนเริ่มไม่อยากเขียนโปรแกรมแบบเวกเตอร์แล้ว แต่ยังพอจะมีข่าวดีบ้าง เพราะในปัจจุบันโครงการจีซีซีได้ออกคอมไพเลอร์รุ่น 4.0 ซึ่งเป็นรุ่นล่าสุด โดยใช้เทคโนโลยี ที่เรียกว่า การทำเวกเตอร์อัตโนมัติ (autovectorization) ทำให้คอมไพเลอร์สามารถวิเคราะห์โครงสร้างของโปรแกรม และเมื่อพบว่าโปรแกรมนั้นมีการทำงานแบบ วนรอบ คอมไพเลอร์ก็จะพยายามเลือกแปลโปรแกรมให้ใช้คำสั่งแบบเวกเตอร์ได้โดยอัตโนมัติ โดยไม่จำเป็นต้องระบุ หรือเขียนโปรแกรมโดยเฉพาะ ทำให้สามารถใช้งานระบบประมวลผลแบบเวกเตอร์ได้ง่ายขึ้น นักพัฒนาระบบไม่จำเป็นจะต้องรู้จักวิธีเขียนโปรแกรมหลาย ๆ แบบ ตามลักษณะของโพรเซสเซอร์ แต่ระบบการทำเวกเตอร์อัตโนมัติ ก็ยังคงมีข้อจำกัดอยู่ ในกรณีที่โปรแกรมมีความซับซ้อน มาก ๆ ก็ยังไม่สามารถเลือกใช้คำสั่งแบบเวกเตอร์ได้อย่างเต็มที่ แต่ในอนาคตอันใกล้นี้ เราก็คงจะมีเทคโนโลยี การแปลภาษาคอมพิวเตอร์ที่ดีขึ้น และอาจจะทำ ให้เราไม่จำเป็นต้องศึกษาวิธีการเขียนโปรแกรมแบบ เวกเตอร์ เพราะคอมไพเลอร์จะเลือกคำสั่งที่เหมาะสมที่สุดได้โดยอัตโนมัติ

เว็บแนะนำ
Hayes Technology, (2001). Software Speed Optimization,
http://www.hayestechnologies.com/en/softwareopt.htm
Free Software Foundation, (2004). Using the GNU Compiler Collection,
http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/index.html
Patel, Sanjay. (2004). AltiVec Programming: A Hands-on Tutorial,
http://www.simdtech.org/altivec/doc-uments/

Hubert, Bert. (2004). SIMD and Other Techniques for Fast Numerical Programming with GCC, http://ds9a.nl/gcc-simd/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

DEVELOPER ZOne

รายการบล็อกของฉัน