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

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

การเขียนโปรแกรมภาษาซี สำหรับ การประมวลผลแบบเวกเตอร์เตอร์

ขอขอบคุณ คุณ วัฒนา นัทธี
ในปัจจุบัน ถือว่าไมโครโพรเซสเซอร์ (microprocessor) ซึ่งเป็นหัวใจสำคัญที่ใช้ในการประมวลผลข้อมูลต่าง ๆ ของคอมพิวเตอร์ ได้รับการพัฒนาให้มี ประสิทธิภาพมากขึ้นทุกวัน โดยอาจจะสังเกตได้ง่าย ๆ จากความถี่ของสัญญาณนาฬิกาที่ใช้ในไมโครโพรเซสเซอร์มีความเร็วมากขึ้นเรื่อย ๆ โดยไมโครโพรเซสเซอร์ในปัจจุบันทำงานที่สัญญาณนาฬิกาสูงกว่า 3 กิกะเฮิรตซ์ ในขณะที่เมื่อสิบกว่าปีที่แล้ว ไมโครโพรเซสเซอร์ 8086 ของบริษัท อินเทล ทำงานที่สัญญาณนาฬิกาเพียง 4.77 เมกะเฮิรตซ์ ถ้าเทียบ ในแง่ความเร็ว ก็อาจจะคิดได้ว่าไมโครโพรเซสเซอร์ ทำงานได้เร็วกว่าเดิมถึงเกือบหนึ่งพันเท่า อย่างไรก็ดีไมโครโพรเซสเซอร์ไม่ได้รับการพัฒนาเฉพาะความเร็วในการประมวลผลเท่านั้น แต่ไมโครโพรเซสเซอร์ในปัจจุบันยังมีสถาปัตยกรรมที่ซับซ้อนขึ้น ซึ่งมีส่วนช่วยเพิ่มความเร็วในการประมวลผลมากยิ่งขึ้น ตัวอย่างเช่น
•แอลทิเวก (AltiVec) สำหรับโพรเซสเซอร์แบบพาวเวอร์พีซี (PowerPC) รุ่นจีโฟร์ (G4) และรุ่นจีไฟว์ (G5) ซึ่งพัฒนาโดยบริษัทแอปเปิลคอมพิวเตอร์ บริษัทไอบีเอ็ม และบริษัทโมโตโรลา (บริษัทแอปเปิลจะเรียกเทคโนโลยีนี้ว่าเครื่องยนต์เร็ว (velocity engine)) โดยเป็นส่วนประมวลผลแบบเวคเตอร์ที่มีประสิทธิภาพใกล้เคียงกับเอสเอสอีทู ของบริษัทอินเทล สามารถจัดการข้อมูลทั้งเลขจำนวนเต็ม และเลขทศนิยมทั้งแบบหยาบและแบบละเอียด รวมทั้งมีแบบชนิดข้อมูลพิเศษสำหรับจัดการข้อมูลจุดสีซึ่งประกอบด้วยสามส่วน คืออาร์จีบี (RGB) หน่วยประมวลผล แอลทิเวกนี้ได้รับการพัฒนาขึ้นมาก่อนเอ็มเอ็มเอกซ์ โดยถือเป็นหน่วยประมวลผลแบบเวกเตอร์ตัวแรกสุดสำหรับเครื่องคอมพิวเตอร์ตั้งโต๊ะ และเป็นส่วนสำคัญที่ทำให้เครื่องแมคอินทอชของบริษัทแอปเปิลมีความสามารถ ในการจัดการระบบกราฟิกต่าง ๆ
แม้ว่าการประมวลผลแบบเวคเตอร์จะมีประโยชน์ช่วยเพิ่มประสิทธิภาพและความเร็วใน การประมวลผลทำให้สามารถประมวลผลข้อมูลหลายชุดได้พร้อมกัน เพิ่มความสามารถในการประมวลผลกราฟิกแบบสามมิติ แต่ก็มีจุดอ่อนตรงที่ขาดการสนับสนุน ที่ดี คอมไพเลอร์ส่วนใหญ่ในปัจจุบันยังไม่ได้ สนับสนุนการใช้งานหน่วยประมวลเวกเตอร์อย่างดีพอ
ทำให้โปรแกรมเมอร์ในปัจจุบันยังไม่ได้นำความสามารถนี้มาใช้อย่างเต็มที่ เนื่องจากยังต้องอาศัยความรู้ทางด้านสถาปัตยกรรมคอมพิวเตอร์มาช่วยด้วย บทความนี้ จะอธิบายวิธีการเขียนโปรแกรมภาษาซีประมวลผล แบบเวกเตอร์ เพื่อให้ผู้สนใจมีวิธีนำความสามารถของโพรเซสเซอร์มาใช้งานอย่างเต็มที่
เริ่มจากตัวอย่างโปรแกรมในโปรแกรมที่ 1 ซึ่งเป็นตัวอย่างโปรแกรมแบบง่ายดังต่อไปนี้

1 typedef int vector __attribute__
2 ((mode(V4SI)));
3 main() {
4 vector a, b, c;
5 c = a + b;
6 }

โปรแกรมที่ 1


จากโปรแกรมอย่างง่ายข้างต้น จะเห็นว่ามีลักษณะเหมือนโปรแกรมภาษาซีทั่ว ๆ ไป คือมีการกำหนดตัวแปรขึ้นมาสามตัว ได้แก่ a b และ c จากนั้นนำ a มาบวกกับ b แล้วเก็บผลลัพธ์ไว้ที่ c แต่สิ่งที่แตกต่างจากโปรแกรมทั่วไปก็คือ แบบชนิดของข้อมูล (data type) ที่ใช้กับ ตัวแปรทั้งสามตัว จะไม่ใช่แบบชนิดข้อมูลมาตรฐาน แต่มีการกำหนดไว้ก่อนเริ่มโปรแกรมด้วยคำสั่ง typedef ในบรรทัดที่ 1 และ 2 โดยกำหนดชื่อข้อมูลชนิดนี้ว่า vector เป็นข้อมูลชนิดตัวเลขจำนวนเต็ม (int) และกำหนด คุณสมบัติพิเศษ __attribute__ ((mode(V4SI))) ซึ่งเป็น การกำหนดให้แบบชนิดข้อมูลเป็นแบบเวกเตอร์ กำหนด แบบวิธี (mode) เป็น V4SI ซึ่งหมายถึง เวกเตอร์ชนิด ตัวเลขจำนวนเต็มขนาด 32 บิตหรือ 4 ไบต์ จำนวน 4 ตัว ดังนั้น ตัวแปร a b และ c ที่ประกาศขึ้นทีหลัง (บรรทัดที่ 4) ก็จะแทนเวกเตอร์ของเลขจำนวนเต็ม 4 ตัว


การนำตัวแปร a มาบวกกับตัวแปร b ก็หมายถึงการบวกเวกเตอร์สองชุด แต่ละชุดมีข้อมูลอยู่ 4 ตัว เช่น ถ้ากำหนดให้ a คือ [1, 2, 1, 2] และ b คือ [2, 1, 2, 1] ก็จะได้ผลลัพธ์ซึ่งจะนำไปเก็บในตัวแปร c เป็น [3, 3, 3, 3] เนื่องจากการบวกนี้จะนำข้อมูลที่อยู่ในตำแหน่งเดียวกัน มาบวกกัน
ส่วนแบบวิธีซึ่งใช้กำหนดแบบชนิดตัวแปร เวกเตอร์นั้น มีการกำหนดไว้ว่า ต้องเขียนอยู่ในรูปแบบ VnB โดย n คือจำนวนข้อมูลในเวกเตอร์ และ B คือ แบบชนิดของข้อมูล โดยมีการกำหนดแบบชนิดข้อมูล ดังนี้
• QI เลขจำนวนเต็มขนาด 8 บิต หรือ 1 ไบต์
• HI เลขจำนวนเต็มขนาด 16 บิต หรือ 2 ไบต์
• SI เลขจำนวนเต็มขนาด 32 บิต หรือ 4 ไบต์
• DI เลขจำนวนเต็มขนาด 64 บิต หรือ 8 ไบต์
• SF เลขทศนิยมแบบหยาบ ขนาด 32 บิต หรือ 4 ไบต์
• DF เลขทศนิยมแบบละเอียด ขนาด 64 บิต หรือ 8 ไบต์
ดังนั้น V4SI ในบรรทัดที่ 2 ของโปรแกรมจึงหมายถึงเลขจำนวนเต็มขนาด 32 บิต จำนวน 4 ตัว แต่อย่างไรก็ดีการกำหนดแบบชนิดตัวแปรนั้น จะต้องคำนึงถึงความสามารถของโพรเซสเซอร์ที่ใช้ด้วย เช่น ถ้าใช้โพสเซสเซอร์เพนเทียม ซึ่งมีหน่วยประมวลผลเป็นแบบเอ็มเอ็มเอกซ์ ก็จะไม่สามารถกำหนดแบบชนิดข้อมูล V4SI ได้ เนื่องจากไม่สนับสนุน แต่อาจจะใช้ V4HI หรือ V8QI ได้ ถ้าเป็นโพรเซสเซอร์ที่สนับสนุนเอสเอสอี ก็จะสามารถกำหนดใช้ V16QI V8HI V4SI V2DI หรือ V4SF ได้

การกำหนดค่าตัวแปร
จากตัวอย่างแรกนั้น ยังไม่มีการกำหนดค่าตัวเลขให้กับตัวแปร แต่จะสามารถกำหนดค่าให้กับตัวแปร a b หรือ c ได้ดังโปรแกรมที่ 2 ต่อไปนี้
1 vector a={1, 2, 3, 4},
2 b={1, 2, 3, 4},
3 c={0, 0, 0, 0};
โปรแกรมที่ 2
โปรแกรมนี้จะสามารถกำหนดค่าเริ่มต้นให้กับ ตัวแปรได้ในลักษณะเดียวกับการกำหนดตัวแปรอะเรย์ หรือตัวแปรโครงสร้าง คือใช้วงเล็บปีกกา และจุลภาคแบ่งข้อมูลแต่ละชุด แต่การกำหนดค่าในลักษณะนี้จะใช้ได้ เฉพาะครั้งแรก หรือในขณะที่กำหนดชนิดของตัวแปร เท่านั้น ไม่สามารถนำไปใช้กำหนดค่าระหว่างทำงานได้ ตามข้อกำหนดของภาษาซี
เพื่อไม่ให้บทความยาวข้าน้อยขอแยกบทความออกเป็นช่วงๆนะขอรับ

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

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

DEVELOPER ZOne