เมื่อหลายปีก่อนนั้น คอมพิวเตอร์มีความเร็วเริ่มที่ 1 เมกะเฮิร์ต (เครื่อง Apple II+) ต่อมาไอบีเอ็มสร้าง PC XT เริ่มที่ 4.77 เมกะเฮิร์ต ในยุคถัดมา PC AT ก็เร็วขึ้นอีกเป็น 6 เมกะเฮิร์ต ขณะนี้ เราใช้เครื่องที่ซีพียูเร็วราว 2-3 กิกะเฮิร์ตกันอยู่ ทุกครั้งที่คอมพิวเตอร์เร็วขึ้นผู้ใช้ก็จะได้ใช้ซอฟต์แวร์ที่รวดเร็วอยู่พักหนึ่งก่อนที่บริษัทจะออกโปรแกรมใหม่ๆ ที่เพิ่มความสามารถ แต่กินแรงเครื่องจนช้าเท่าเดิม อย่างไรก็ตามไม่มีใครห่วงมากนักเพราะสักพัก ซีพียูใหม่ๆก็เพิ่มความเร็วสัญญาณนาฬิกาอีก ทำให้เครื่องเร็วขึ้นเอง ผู้ใช้แค่เก็บเงินไว้เปลี่ยนเครื่องใหม่ๆเป็นระยะก็พอ ในหลายปีที่ผ่านมา วิธีการเพิ่มสัญญาณนาฬิกาแบบเดิมเริ่มไม่ได้ผล ปัญหาที่เกิดขึ้นคือ ความร้อนที่เพิ่มขึ้น ได้กลายเป็นขีดจำกัดที่ยังไม่สามารถหาทางแก้ไขได้ ทำให้ยังไม่มี ซีพียูที่มีความเร็วเกินกว่า 4 กิกะเฮิร์ต ทางเลือกใหม่ที่ทุกบริษัทใช้ คือ เทคโนโลยีมัลติคอร์
เทคโนโลยีที่เรียกว่า มัลติคอร์ (multi-core) หรือ เมนี่คอร์ (many core) คือ การสร้างซีพียูหลายๆ ชุดลงในชิบเดียวและให้ซีพียูเหล่านี้ช่วยกันทำงาน การที่เทคโนโลยีนี้ถูกเลือกให้เป็นทางออกในการออกแบบซีพียูรุ่นใหม่ๆ ของบริษัทอย่างอินเทลและเอเอ็มดี นั้นเป็นเพราะความก้าวหน้าด้านกระบวนการผลิต (process technology) ของสารกึ่งตัวนำยังคงดำเนินต่อไป ทำให้สามารถสร้างวงจรได้ซับซ้อนมากขึ้นในชิปตัวเดียว ทางเลือกนี้จึงชัดเจนและกลายเป็นทางเลือกที่จำเป็น ขณะทางอินเทลมีชิปขนาด 80 คอร์ที่ทำงานได้แล้วอยู่ในแล็บ เป็นที่คาดหมายกันว่าภายใน 10 ปีนี้จะมีชิปกว่า 256 คอร์ออกสู่ตลาดให้ได้ใช้งานกัน แน่นอนว่าโลกของคอมพิวเตอร์ก็จะเกิดการเปลี่ยนแปลงขนานใหญ่
เมื่อใช้มัลติคอร์ซีพียูแล้ว โปรแกรมที่ใช้งานจะเร็วขึ้นโดยอัตโนมัติไหม?
คำตอบ คือ ไม่ใช่
เนื่องจากการทำงานของโปรแกรมจะมีสองลักษณะ ลักษณะแรกเป็นการรับงานจำนวนมากมาทำและต้องการจำนวนงานต่อหน่วยเวลามากๆ เช่น โปรแกรมเว็บเซิร์ฟเวอร์ ระบบฐานข้อมูล งานแบบนี้ที่เรียกว่าการประมวลผลแบบ High throughput นั้น สามารถใช้งานมัลติคอร์ได้ระดับหนึ่ง เนื่องจากระบบปฏิบัติการจะช่วยกระจายการทำงานไปบนหลายคอร์ให้ได้บ้าง แต่ไม่ได้ความเร็วเต็มที่มากนัก
ส่วนงานที่ต้องการประมวลผลให้เร็วขึ้นหรือ High Performance Computing นั้นโปรแกรมจะไม่เร็วขึ้นเลยนอกจากจะเขียนโปรแกรมให้รู้จักและใช้งานระบบมัลติคอร์ ให้ได้ อย่างไรก็ตามการที่โปรแกรมจะใช้งานซีพียูแบบมัลติคอร์ให้ได้อย่างดีนั้นนั้น จะต้องเขียนให้ประมวลผลแบบขนานได้
การประมวลผลแบบขนานนั้นเป็นอย่างไร การทำงานแบบขนานนั้นอัลกอริทึมที่ใช้ต้องพยายามแตกกระจายงานทุกอย่างให้เป็นงานย่อยๆที่ ทำพร้อมกันให้ได้มากที่สุด ตัวอย่างหนึ่งคือการทำ graphics rendering ซึ่งสามารถกระจายภาพแต่ละภาพในหนังแอนิเมชั่นให้ทำงานเรนเดอร์ไปพร้อมๆ กันได้ เนื่องจากแต่ละเฟรมจะไม่ขึ้นต่อกัน
ปัญหาหลักของการทำงานแบบขนาน คือปัญหาย่อยยังมีความขึ้นต่อกัน (dependency) ทำให้ต้องแก้ปัญหาเป็นลำดับ เนื่องจากปัญหาย่อยหนึ่งต้องแก้ให้ได้ก่อนจึงจะแก้อีกปัญหาได้ไม่เช่นนั้นผลจะผิดพลาดได้ เนื่องจากการใช้ตัวแปรร่วมกันแล้วควบคุมการใช้งานไม่ถูกต้อง สรุปแล้วการพัฒนาโปรแกรมแบบขนานบนซีพียูมัลติคอร์ให้เต็มที่นั้น โปรแกรมเมอร์ต้อง หนึ่ง ออกแบบอัลกอริทึมที่ใช้ให้มีความขนานแฝงเร้นมากที่สุด สอง พัฒนาโปรแกรมให้ทำงานแบบขนานได้ดีที่สุด
การพัฒนาโปรแกมแบบขนานบนซีพียูมัลติคอร์นั้นมีหลายวิธี แต่ที่ใช้กันมากคือการพัฒนาโปรแกรมให้ทำงานแบบมัลติเทรด การทำงานแบบมัลติเทรด คือการเขียนโปรแกรมโดยสร้างส่วนของโปรแกรมที่เรียกว่า "เทรด" ขึ้นมาหลายเทรด เมื่อต้องการประมวลผล ก็จะมีการสร้างเทรดมาอย่างรวดเร็ว โดยในระบบปฏิบัติการหรือระบบโปรแกรมกระจาย เทรดเหล่านี้ไปบนหลายๆ คอร์ทำให้ แต่ละคอร์ช่วยกันทำงานได้ ภาษาสมัยใหม่ เช่น C# หรือ Java จะสนับสนุนการเขียนโปรแกรมแบบนี้ในตัวภาษาเลย
ปัญหาที่ต้องเผชิญคือการเขียนโปรแกรมในลักษณะนี้ไม่ใช่งานง่ายๆ วารสาร Fortune ฉบับเดือนสิงหาคมลงบทความไว้โดยระบุว่า วงการซอฟต์แวร์ทั่วโลกต้องมีการปรับตัวขนานใหญ่ เนื่องจากการพัฒนาซอฟต์แวร์ต้องเปลี่ยนไปมากเนื่องจากเทคโนโลยีมัลติคอร์
ปัญหาที่ท้าทายโปรแกรมเมอร์ในโลกมัลติคอร์คือ
หนึ่ง โปรแกรมเมอร์ไม่เคยถูกสอนมาให้คิดอัลกอริทึมเป็นแบบขนาน ทำให้โปรแกรมส่วนใหญ่ไม่ได้ถูกออกแบบมาจากรากฐานให้ทำงานได้ดีกับระบบมัลติคอร์ ในเรื่องนี้จะต้องปรับหลักสูตรการสอนใหม่ให้นำเรื่องการประมวลผลแบบขนานมาสอนแต่เนิ่นๆ หัดให้โปรแกรมเมอร์รุ่นใหม่คิดอัลกอริทึมออกมาเป็นแบบขนานตั้งแต่ต้น
สอง เครื่องมือพัฒนาซอฟต์แวร์ที่ใช้กันยังไม่มีประสิทธิภาพเพียงพอในการหาจุดผิดพลาดในโปรแกรมแบบมัลติเทรด การพัฒนาโปรแกรมแบบมัลติเทรดมีความซับซ้อนในกรณีที่มีการใช้ข้อมูลในหน่วยความจำร่วมกันจะต้องล็อคตัวแปรนั้นให้ทีการแก้ไขได้โดยเทรดเดียว มิฉนั้นแล้วจะเกิดการทำงานที่ผิดพลาดเรียกว่า Race Condition หากปราศจากเครื่องมือพัฒนาที่ทรงประสิทธิภาพ โปรแกรมเมอร์ต้องพึ่งสัญชาตญาณและความคิดที่เป็นระบบสูงมากจึงจะพัฒนาโปรแกรมที่เร็วและเสถียรได้ ตอนนี้บริษัททั่วโลก เช่น อินเทล และ ไมโครซอฟต์ กำลังเริ่มสนใจอย่างจริงจังในการพัฒนาซอฟต์แวร์ที่ช่วยตรวจจับความผิดพลาดในการเขียนโปรแกรมแบบมัลติคอร์เพื่อให้การพัฒนาเกิดได้เร็วขึ้น ไมโครซอฟต์เริ่มพัฒนาให้ Visual Studio รุ่นใหม่ๆ ทำงานแบบขนาน ในขณะที่อินเทลก็ปรับเครื่องมือทางซอฟต์แวร์ เช่น Intel Parallel Studio ให้ช่วยเร่งการพัฒนาได้ดีขึ้น
สุดท้ายเราต้องไม่ลืมว่าคอมพิวเตอร์แบบลำดับปกตินั้นหมดไปแล้ว นับแต่นี้คอมพิวเตอร์ใหม่ๆ ทุกเครื่องเป็นคอมพิวเตอร์ที่ซีพียูทำงานแบบขนานหมด ถ้าไม่เร่งพัฒนาขีดความสามารถของอุตสาหกรรมซอฟต์แวร์ไทยแล้ว เราก็จะสร้างได้แต่ซอฟต์แวร์ที่ทำงานช้ากว่าคนอื่นทั่วโลก
อันที่จริงสำหรับโปรแกรมเมอร์ชาวไทยเทคโนโลยีนี้นับเป็นโอกาสที่จะพัฒนาขีดความสามารถให้เท่ากับคนทั้งโลก เนื่องจากมัลติคอร์เป็น disruptive technology ดังนั้นทุกคนทั่วโลกจะมีความรู้ที่แตกต่างกันไม่มากนักเนื่องจากทุกคนใหม่หมด ประเทศเราจึงมีโอกาสใช้เทคโนโลยีนี่พัฒนาโปรแกรมใหม่ๆที่รวดเร็วและมีประสิทธิภาพสูงได้ก่อนใคร ภาคการศึกษาควรพิจารณาบรรจุเรื่องการพัฒนาอัลกอริทึมและโปรแกรมบนซีพียูแบบมัลติคอร์ให้เป็นมาตรฐาน ให้โปรแกรมเมอร์ไทยทุกคนรู้เรื่องนี้ ภาคเอกชนอาจจะต้องจับโปรแกรมเมอร์ระดับเทพในบริษัทมาเรียนเรื่องนี้กันใหม่ เพื่อให้เรามีขีดความสามารถในการสร้างนวัตกรรมระดับโลกกับเขาบ้าง
ข้อมูลเพิ่มเติม
Comments
อยากกลับไปเรียนใหม่จัง
ว่าแต่มันจะมีสอนไหมเนี่ย วิชา ออกแบบอัลกอริธึมแบบขนานๆ ><
ผมว่าคงปรับลำบากทีเดียว.. เพราะคนเรามีหัวเดียว แค่คิดแทนหัวเดียวก็ปวดหัวแล้ว นี่ต้องคิดแทนสองหัวอีก อิอิ
เคยฟังบรรยายจากผู้รู้ท่านหนึ่ง เขาบอกว่าเด็กยุคหลังสามารถคิดได้แบบขนานดีกว่ายุคเรานะครับ อีกหน่อยเราอาจจะเห็นโปรแกรมที่ออกมาเป็นแบบขนานเลยไม่ต้องมานั่ง "ทำให้เป็นขนาน (parallelize)" เหมือนปัจจุบัน ก็ขอให้เป็นยังงั้นจริงๆครับ
เห็นด้วย
คนเดี๋ยวนี้โดยเฉพาะเด็กรุ่นใหม่ชอบทำอะไรหลาย ๆ อย่างพร้อมกัน
ทั้งเดินขึ้นรถไฟฟ้าพร้อมฟังเพลงจาก MP3 Player
ทั้งกินข้าวไป คุยโทรศัพท์ไป เขย่าขาไป
นั่งเรียนแล็ปไป ดู Hi 5 ไป (พร้อมกับอีกหลายเว็บ - ก็มีแท็ปแล้วนี่) แล้วยังออน M แถมหันไปคุยกับเพื่อนอีก (ยังไม่นับนั่งฟังอาจารย์กับโค้ดตามโจทย์แล็ปนะเนี่ย (-_-'))
เหมาะกับเทคโนโลยีสมัยหน้าจริง ๆ
นี่ผมก็พิมพ์ไป ฟังข่าวสลายม็อบทางโทรทัศน์ไปอยู่เหมือนกัน (^___^)
แปลว่า คนรุ่นเก่า ยังเป็น Windows 3.1 ไม่รองรับ Multi-tasking ฮิฮิ
win 3.1 มันเป็น multi-tasking นะครับ
อือม ก็จริงครับ แต่ Windows 3.1 ทำงานแบบ cooperative scheduling คือ ทุกโปรแกรมต้องร่วมมือในการทำงาน เมื่อโปรแกรมไหนทำงานเสร็จต้องคืนการควบคุมให้ระบบปฏิบัติการเอง ถ้าพลาดก็จะแฮงค์ได้ แต่ Windows รุ่นใหม่ๆใช้ Preemptive scheduling ซึ่งใช้ Hardware Timer Interrupt ทำให้ระบบปฏิบัติการแย่งโปรเซสเซอร์คืนได้ ระบบใหม่ๆนี้จึงทำ multitasking ได้เต็มรูปแบบกว่า Windows 3.1 ซึ่งเป็น multitasking แบบไม่สมบูรณ์ครับ
มีกิ๊กหลายคนได้ด้วย
ต้องทำ multitasking และ collision detection ได้อย่างดีมากๆ
รุ่นแก่ๆทำไม่เป็นแฮะ
เรามีสองขา สองแขน
เดี๋ยวก็ชิน
อยากกลับไปเรียนใหม่ +1
คงจะมีศาสตร์ที่มาเพื่อการนี้ในอนาคตมั้งครับ
I need healing.
เห็นเค้าเขียนกัน many-core หรือ manycore นะครับ
ถ้าแยกกันก็ควรจะเป็น Many Cores
ให้ความหมายถึง Multi-Core ที่มีจำนวนมากๆ (หลายสิบหรือเป็นร้อย) เห็นบอกว่าปัจจุบันก็เริ่มต้นเรียก Manycore ที่ 16 Core ในเครื่องเดียว
การเขียนโปรแกรมแบบขนานแบบหนึ่งที่เริ่มต้นได้ไม่ยาก คือ Multithreading อย่างที่อาจารย์ภุชงค์กล่าวไว้ในบทความ
มีมหาลัยต่างประเทศสอนวิชา Concurrency ไปแล้วครับ แต่ (น่า) จะเป็นวิชาเลือกอยู่ ซึ่งก็เป็นวิชาว่าด้วยเรื่องการออกแบบโปรแกรมแบบ Multithreading และ Multiprocess ให้มีประสิทธิภาพ รวมถึงป้องกันปัญหาที่เกิดขึ้น เช่น Deadlock กับ Racing อย่างที่อาจารย์กล่าวไว้ในบทความ เนื้อหาที่เกี่ยวข้องกับ Concurrency มีเยอะมาก ถ้าท่านใดนึกไม่ออกว่า Concurrency เป็นอย่างไร ลองนึกวิชา OS ที่กล่าวถึง Process Synchronization ครับ ส่วนวิชา Concurrency เขาจะเอาเรื่อง Synchronization มาแบ่งเป็นหัวข้อย่อยๆมากมายครับ
สำหรับผู้เริ่มต้น ที่รู้วิธีการเขียน thread แล้ว จะศึกษาการเขียนโปรแกรม multithreading แบบง่ายๆ ลองวิธี Master-Worker หรือ Master-Slave ดูก็ได้ครับ คือ Thread หลักเป็น Master และมี thread ลูกๆเรียกว่าเป็น Worker คอยทำงานแยกจากกันเด็ดขาด ดังนั้น จะมี Master อยู่ตัวเดียว และมี Worker มากกว่า 1
ตัว Master ทำหน้าที่ประสานงานระหว่าง Worker โดยการรับผลลัพธ์จาก Worker จากนั้น Master จะทำหน้าที่รวมผลจาก Worker หรือแม้แต่ส่งผลลัพธ์จาก worker ตัวหนึ่งไปให้อีกตัวทำ ก็ตามแต่ตรรกะหรือ logic ของโปรแกรมครับ วิธีการนี้ควบคุม Concurrency หรือ Synchronization ได้ง่ายกว่าวิธีพวก Message Passing แต่ก็เสียเวลาหรือมี overhead ที่ Master แหละครับ แต่ถ้าจะเริ่มเขียนโปรแกรมแบบ Multithreading ง่ายๆ ผมชอบวิธีนี้แหละครับ พวกโปรแกรมแบบที่ thread เป็นอิสระจากกันมากๆ (independency) วิธีการนี้เหมาะมากครับ เช่น rendering โดยให้ Master ส่ง frame ของ animation จ่ายไปให้ Worker ที่มีฟังก์ชันการทำงานเหมือนกัน (คือ render) ผลลัพธ์ที่ได้ก็ส่งกลับมารวมที่ Master ครับ วิธีนี้สามารถไปประยุกต์ใช้กับ Cell SDK บน Cell Processor ได้ด้วยครับ
ถ้าผมมีเวลาว่างคงจะได้กล่าวเรื่องนี้มากขึ้นในส่วน hpc ของ blognone (ไม่แน่ใจว่าเปิดตัวเป็นทางการหรือยัง) หรือพี่ๆน้องๆท่านใดทราบวิธีนี้จะเริ่มแนะนำไปเลยก็ได้นะครับ
JavaBoom (Boom is not Java, but Java was boom)
http://javaboom.wordpress.com
My Blog
เออ แต่ทำไมคุ้นๆว่าสมัยที่เรียนวศ.คอมอยู่ มันมี project ให้เขียน parallel processing อะไรทำนองนี้ว้าาาา จำรายละเอียดไม่ได้ คุ้นๆๆแค่ว่าเขียนเสร็จแล้วเบลอไปหลายวันอยู่
Parallel Processing / Programming เริ่มใหม่ๆก็มึนหัวและเบลอไปตามๆกันน่ะครับ ไม่ทราบว่าเฒ่าทารกในมังกรหยกผู้ฝึกวิชาแบ่งแยกประสาทจะชำนาญเรื่องนี้หรือเปล่า ^_^
บางมหาวิทยาลัยในไทยจะมีสอนวิชา Parallel Processing และ/หรือ Parallel Algorithms ในระดับปริญญาตรี แต่ (น่า) จะยังคงเป็นวิชาเลือกอยู่ครับ ส่วนในปริญญาโท/เอก มีเปิดไว้อยู่แล้วครับ แต่มีอาจารย์สอนให้ได้หรือเปล่าก็เปิดไว้ก่อนครับ
สำหรับวิชา Concurrency จะเน้นเนื้อหาไปที่ Multithreading เป็นส่วนใหญ่ และมีอีกวิชาที่ใกล้เคียงกันก็คือ Distributed Systems
JavaBoom (Boom is not Java, but Java was boom)
http://javaboom.wordpress.com
My Blog
วิชาของเฒ่าทารกใช้สองมือสู้กันเองในสมองต้องเป็น มัลติเทรดครับ แต่สมองเป็นมัลติคอร์หรือเปล่าไม่แน่ใจครับ
ชอบความคิดที่เป็นแบบนี้จัง อ่านแล้วได้ความรู้ดี