Music Hit In your life

วันอังคารที่ 26 มกราคม พ.ศ. 2553

สถาปัตยกรรมคอมพิวเตอร์แบบ SIMD

สถาปัตยกรรมคอมพิวเตอร์แบบ SIMD

งานๆหนึ่ง ถ้าใช้คนงานช่วยกันทำ 1 คน ทำงาน ใช้เวลา 100 หน่วยเวลา แต่หากว่า ให้มีผู้ช่วย มาช่วยทำงานก็จะลดเวลาเหลือเพียง 50 หน่วยเวลา แล้วถ้ามีคนมาช่วยกันทำถึง 100 คน เวลาที่จะทำงานให้สำเร็จนั้น ก็เหลือเพียงแค่ 1 หน่วยเวลา ... ทฤษฎีนี้ เป็นไปได้ไหม?
จะว่าเป็นไปได้ ก็ใช่ เพราะหลายๆคนช่วยกันทำงานงานก็จะสำเร็จเร็วขึ้น แต่ จะว่าเป็นไปไม่ได้ ก็ใช่เช่นกัน เพราะว่า การทำงานนั้น บางที ก็ต้องรอผลของอีกขั้นตอนหนึ่งก่อน เพื่อจะมาใช้ในขั้นตอนที่จะทำงานต่อไป เพราะฉะนั้น ให้ 100 คนทำ ก็อาจทำไม่สำเร็จได้ในเวลาเพียง 1 หน่วยเวลา
แนวความคิดนี้ ก็ถูกนำมาพัฒนาใช้กับการทำงานของการประมวลผลของคอมพิวเตอร์เช่นกัน ... กล่าวคือ ถ้าหากว่า ถ้าให้ CPU ทำการประมวลผล แบบตามลำดับ คือ ทีละ 1 คำสั่ง เพราะฉะนั้น ถ้ามีข้อมูลมา 100 ชุด ก็จะใช้เวลา 100 หน่วยเวลา แต่ถ้าหากว่า มีหลายๆ CPU มาช่วยกันทำงานล่ะ ก็น่าจะลดเวลาการทำงานให้เสร็จลงใช่ไหม?

คำตอบก็เหมือนกับการทำงานของคนข้างต้น ... ตัวอย่างเหล่านี้ คือ concept หรือ แนวคิด ของการทำงาน หรือ การประมวลผลแบบขนาน ซึ่งในคราวนี้ เราจะมาพูดถึงกันในเรื่องของสถาปัตยกรรมแบบ SIMD ซึ่ง ก็จัดเป็นประเภทการประมวลผลแบบขนานแบบหนึ่ง


• SIMD คืออะไร?
SIMD หรือ Single Instruction Multiple Data stream หรือ กล่าวคือ เป็นการประมวลผลแบบที่มีข้อมูลเข้ามาหลายๆ ชุด โดยใช้คำสั่งในการประมวลผล เพียงชุดคำสั่งเดียว และได้ผลลัพธ์ออกมาหลายๆผล ( เพราะมีหลายชุดข้อมูล )

• มันทำงานอย่างไร?
ถ้าเราต้องการคูณ Matrix A ขนาด 3*3 เข้ากับ Matrix B ขนาด 3*3 เพื่อให้ได้ผลลัพธ์ คือ Matrix C
โดยค่าของ Matrix C นั้นจะได้มาจาก ผลคูณและ ผลบวกของ Matrix A และ B ดังนี้
c11 = ( a11 * b11 ) + ( a21 * b12 ) + ( a31 * b13 )
ซึ่งก็คือ ค่าของ Matrix C ตัวแรก ( แถวที่ 1 หลักที่ 1 ) นั้น มาจาก ผลบวก ของผลคูณจากแถวที่ 1 ของ Matrix A กับ หลักที่ 1 ของ Matrix B และ ในทำนองเดียวกัน สำหรับค่าของ C ตัวที่สอง ( แถวที่ 1 หลักที่ 2 ) ก็จะมาจาก ผลบวกของผลคูณของแถวที่ 1 ของ Matrix A กับ หลักที่ 2 ของ Matrix B ดังนี้
c21 = ( a11 * b21 ) + ( a21 * b22 ) + ( a31 * b23 )
ถ้าให้ทำการคูณ Matrix ดังกล่าว เราจะต้องใช้เวลาในการทำงานเท่าไร ถ้าค่อยๆทำทีละ ชุดข้อมูล และ ชุดคำสั่ง ...
ดูกันง่ายๆ สำหรับการหาค่า ของ c11 ถ้ากำหนดให้การคูณนั้นใช้เวลาในการประมวลผลคือ 4 หน่วยเวลา และ การบวกเป็น 1 หน่วยเวลา เพราะฉะนั้นการทำงานแบบปกติ หรือ ทำตามลำดับขั้น ก็จะต้องเสียเวลาในการคูณ 3 ครั้ง ก็คือ a11*b11 และ a21*b12 และ a31*b13 ซึ่งก็จะใช้เวลา ไปทั้งสิ้น 3*4 = 12 หน่วยเวลา และ ยังต้องเสียการบวกอีก 2 ครั้ง เพราะในการบวก ต้องบวกทีละ 2 ค่า ไม่สามารถบวกครั้งเดียวด้วยค่า 3 ค่าได้ ก็จะเสียเวลาในการบวกอีก 1*2 = 2 หน่วยเวลา เพราะฉะนั้น ก็จะใช้เวลาในการหาค่าของ c11 ทั้งสิ้น 14 หน่วยเวลา ซึ่งสำหรับ Matrix นี้ เป็น Matrix ที่มีขนาด 3x3 คือ จะมีสมาชิกทั้งหมด 9 ตัว เพราะฉะนั้น ก็จะใช้เวลาในการหาผลคูณทั้งหมด 9*14 = 126 หน่วยเวลาเลยทีเดียว
ทีนี้เราลองมาดูการประมวลผลของสถาปัตยกรรมแบบ SIMD กันบ้าง สถาปัตยกรรมแบบนี้นั้น อย่างที่กล่าวมาแล้ว ก็คือ จะสามารถประมวลผล ด้วยชุดข้อมูลหลายๆชุด ซึ่งไม่เกี่ยวข้องกัน ด้วยคำสั่งเดียวกันได้พร้อมๆกันเลย เพราะฉะนั้น การคูณก็จะทำได้พร้อมๆกันเลยทั้ง 3 ค่า คือสามารถหาค่าขอ a11*b11และ a12*b12 และ a31*b13 ได้ในเวลาเดียวกัน เพราะฉะนั้นเวลาที่ใช้ ในการคูณ 3 ค่านี้ ก็คือ 4 หน่วยเวลาเท่านั้น และสำหรับการบวก ก็ยังคงต้องใช้ 2 ครั้ง เพราะไม่ว่าจะบวกยังไง ก็ไม่สามารถบวกกันทีละ 3 ค่าได้ และ ที่สำคัญก็คือ 3 ค่านั้น แบ่งกันบวกทีละ 2 ก็ไม่ได้ เพราะฉะนั้น ก็ต้องเสียเวลาอีก 2 ครั้งคือ 1*2 = 2 หน่วยเวลา สรุปก็คือจะใช้เวลาในการหาค่าหนึ่งๆ คือ 4+2 = 6 หน่วยเวลาเท่านั้นเอง และหากเป็นการหาค่าของทั้ง Matrix ทั้ง 9 ตัว ก็สามารถใช้เวลาในการคูณค่าทั้งหมดเพียง 4 เท่านั้น แล้วก็เสียเวลาในการบวก เพียง 2 เท่านั้น เช่นกันครับ เพราะว่าทำงานด้วยคำสั่งเดียวกัน แต่ต่างชุดข้อมูลกัน และ ข้อมูลนั้นไม่เกี่ยวเนื่องกัน เพราะฉะนั้น ผลคูณของทั้ง Matrix ก็จะสามารถหามาได้เพียงแค่ 6 หน่วยเวลา เลยด้วยซ้ำ
แต่ในความเป็นจริงนั้น ก็่ใช่ว่าจะสามารถทำได้เช่นนี้จริงๆ เพราะ การที่จะทำเช่นนี้ได้นั้น ( เช่นจากตัวอย่าง การคูณพร้อมๆกันทีละหลายๆ ตัว ) ก็ต้องใช้หน่วยความจำ และ Register มากๆ ซึ่งแน่นอน CPU ไม่รองรับถึงขนาดมากๆ เช่นนั้น มันก็จะมี Limit ของมัน ทำให้ผลที่ได้ ก็ไม่ได้ดีถึงระดับตามทฤษฎี จากตัวอย่างข้างต้น
และในบางเรื่องของการทำงาน ก็ไม่สามารถแสดงประสิทธิภาพออกมาได้อย่างเต็มที่ เช่น Loop ของการบวกค่าที่ ค่าผลลัพธ์ของ Process แรกจะไปเป็น ค่าอินพุทของ Process ถัดไป ดังนี้
A = B + C และ
D = C + A
ซึ่งจะเห็นได้ว่า จะทำการบวกค่า ทั้งสองค่า พร้อมๆกันไม่ได้แน่ๆ เนื่องจากว่า D นั้น จะต้องรอผลลัพธ์จาก A เสียก่อน จึงจะหาค่าของ D ได้ ตรงนี้ ก็ทำให้การประมวลผลแบบนี้ ไม่มีความหมาย หรือไม่ช่วยอะไรเลย

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

• สถาปัตยกรรมที่เกี่ยวข้อง
•SISD หรือ Single Instruction Single Data stream เป็นการประมวลผลแบบพื้นฐานที่สุด กล่าวคือ มีชุดข้อมูลเพียงชุดเดียว และ ทำงานด้วยคำสั่งเดียว
•MISD หรือ Multiple Instruction Single Data stream วิธีนี้ ก็จะเป็นการประมวลผลของชุดข้อมูลเพียงชุดเดียว แต่ว่า ทำกับหลายๆ คำสั่ง เช่น A+B, A*B, A-B และ A/B เป็นต้น ซึ่งก็คงไม่มีหรือมีน้อยมากที่จะใช้การประมวลผลแบบนี้ ทำให้สถาปัตยกรรมอันนี้ ไม่มีใครพัฒนา
•MIMD หรือ Multiple Instruction Multiple Data stream สำหรับวิธีนี้นั้น ก็ดูเหมือนจะแยกกันทำงานได้เลย คือ รับข้อมูลมาหลายๆ ชุด แล้วก็ทำงานหลายๆ คำสั่ง ไปพร้อมๆกัน

ที่มา ฉ 1999 BeyondXtream. Comment or Suggestion : ByX@vision4d.com
http://pantip.inet.co.th/club/comprice/SIMD.html

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

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