Tags:

เป็นสมการง่ายๆ ที่ว่าโปรแกรมที่มี thread เดียว (single thread application) เมื่อนำไปรันบนโปรเซสเซอร์แบบ multi-core แล้วจะให้ผลลัพธ์ไม่ต่างไปจากนำโปรแกรมไปรันบนโปรเซสเซอร์ที่มี core เดียว หากอยากใช้สมรรถนะของ multi-core ให้เต็มที่ เราจำต้องออกแบบและพัฒนาโปรแกรมนี้ให้ประมวลผลแบบขนานตามไปด้วย อย่างเช่นการพัฒนาโปรแกรมให้มีมากกว่า 1 thread และให้แต่ละ thread ทำงานแยกจากกันอยู่บน core คนละหน่วย

อย่างไรก็ตาม การพัฒนาโปรแกรมแบบขนานไม่ใช่เรื่องง่าย โดยเฉพาะอย่ายิ่ง หากโปรแกรมถูกแบ่งการทำงานออกเป็นหลายๆ thread อย่างเช่นมีหลายสิบหรือหลายร้อย thread เพื่อรันบนโปรเซสเซอร์ many-core เป็นต้น เมื่อมีจำนวน thread เยอะขึ้นแล้ว การควบคุมและประสานการทำงานระหว่าง thread จนถึงขั้นตอนการดีบั๊กโปรแกรมย่อมมีความยุ่งยากตามมาด้วย และเพื่อลดความยุ่งยากดังกล่าว นักพัฒนาส่วนหนึ่งจึงอาศัยเครื่องมือหรือเฟรมเวิร์คสำหรับพัฒนาโปรแกรม อย่างเช่น OpenMP และ Intel Threading Building Blocks รวมไปถึง Intel Parallel Studio ที่เพิ่งเสนอข่าวไป

อาจจะมีคนตั้งคำถามว่า "Multi-core มีบทบาทสำคัญในงานประเภทไหนบ้าง ?" แหล่งข่าว buildera ได้ยกตัวอย่างผ่านโปรแกรม 3 ประเภทดังนี้

  1. โปรแกรมเซิร์ฟเวอร์ที่ต้องรองรับโปรเซสจำนวนมาก โปรเซสเหล่านี้เกิดจากการติดต่อของโปรแกรมไคลเอนต์​ อย่างเช่น โปรเซส HTTP และโปรเซสที่เข้าถึงฐานข้อมูล เป็นต้น multi-core สามารถรันโปรเซสได้พร้อมกันมากยิ่งขึ้นและทำให้ตอบสนองผลลัพธ์ไปให้โปรแกรมไคลเอนต์ได้เร็วขึ้นด้วย (ในศาสตร์ทางด้าน High Performance Computing เรียกว่าเป็นการเพิ่มผลลัพธ์หรือ throughput ของการประมวลผล)
  2. โปรแกรมจำลองระบบเสมือน (Virtualization) อย่างการรัน Guest OS (หรือ Virtual Machine) บน Host OS (หรือคอมพิวเตอร์จริงๆ) โดย multi-core สามารถลดการแย่งทรัพยากรประมวลผลระหว่าง Host OS กับ Guest OS ได้
  3. เกม เพราะว่าโปรแกรมเกมสามารถแบ่งการทำงานออกเป็นหลายๆหน่วยได้ (เสมือนว่าแบ่งเป็นหลายๆ thread) ตัวอย่างเช่น Game Engine ที่อยู่เบื้องหลังเกม Half Life 2: Episode Two สามารถแบ่งการทำงานของเกมเป็นหน่วยๆตามจำนวน core ของโปรเซสเซอร์ได้ ซึ่งหน่วยการทำงานเหล่านี้ได้แก่ หน่วยคำนวณแสง (lighting) และหน่วยปัญญาประดิษฐ์​ (AI) เป็นต้น โดย Game Engine นี้สามารถแบ่งการประมวลผลออกจากกันได้สูงถึง 32 หน่วย นอกจากนี้แล้ว เราจะพบว่าโปรเซสเซอร์ที่ติดตั้งบนเครื่องเกมคอลโซลอย่าง PlayStation 3 (มี 8 core) และ XBOX360 (มี 3 core) นั้นเล่นบทบาทสำคัญมาก อันส่งผลให้ Game Engine ต้องสนับสนุนการทำงานแบบขนานตามไปด้วย

แหล่งข่าวได้ทิ้งท้ายไว้ว่า หากเครื่องมือพัฒนาโปรแกรมแบบขนานสามารถตัดภาระของการควบคุม thread ออกไปได้ อนาคตตลาดของโปรเซสเซอร์ Multi-core คงเบ่งบานมากกว่านี้

ที่มา - builderau จากแหล่งข่าวมีวิดีโอคลิปบทสัมภาษณ์​ Sun และ Microsoft ถึงการพัฒนาเทคโนโลยีจาวาและ .NET บน Multi-core

Get latest news from Blognone

Comments

By: paepod on 24 August 2008 - 09:33 #62275

อยากทราบว่า AMD ได้ทำการพัฒนาเฟรมเวิร์คสำหรับพัฒนาโปรแกรมสำหรับ สำหรับ Multi-core หรือ Many-core ไหมครับ?

By: javaboom
WriteriPhone
on 24 August 2008 - 12:33 #62281 Reply to:62275
javaboom's picture

ที่เป็น framework ของ AMD ผมไม่ทราบน่ะครับ

แต่เท่าที่ผมทราบแน่ๆคือ AMD เป็นพาร์ตเนอร์กับ PGI (เจ้าพ่อ compiler ด้าน HPC) ลองไปดูรายละเอียดได้ที่ http://www.pgroup.com มันมีทั้ง compiler และ Debugger (PGDBG) และก็ส่วนทำ analyzer+tuning ชื่อ ​Profiler (PGPROF) ใช้กับ OpenMP และก็ MPI ได้ครับ

Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com


My Blog

By: avaya
Android
on 24 August 2008 - 17:31 #62308
avaya's picture

น่าสนใจครับ

By: polaromonas
ContributorWindows PhoneWindows
on 25 August 2008 - 14:21 #62378

ไม่ค่อยรู้เรื่องงานด้านนี้ แต่อยากรู้ว่าถ้า CPU แบบ Heterogenous core อย่าง Fusion ออกมานี่ ความยุ่งยากในการเขียนโปรแกรมจะยากขึ้นไหมครับ? เพราะว่ามีทั้งระบบประมวลผลแบบ series และ parallel อยู่ด้วยกัน

By: javaboom
WriteriPhone
on 25 August 2008 - 19:49 #62385 Reply to:62378
javaboom's picture

ตอบแบบวิเคราห์ด้วยประสบการณ์ส่วนตัวครับ ยากไม่ยากอยู่ที่ SDK เป็นสำคัญครับ แต่โดยความคิดเห็นส่วนตัวเท่าที่เคยใช้ SDK/Framework สำหรับ Multicore (เช่น Cell SDK) ส่วนใหญ่ยังใช้งานยากสำหรับผู้ใช้เบื้องต้นอยู่ครับ โดยเฉพาะยังไม่มีพื้นด้าน parallel

*** ข้อความต่อไปนี้จะอ่านหรือไม่ก็ได้ พอดีคำถามคุณเกี่ยวข้องกับสิ่งที่ผมเพิ่งฟังมาเอง ***

ผมเพิ่งเข้าร่วมโครงการที่เขาวิจัยด้าน heterogeneous multicore เมื่อสัปดาห์ที่ผ่านมานี่เองครับ เขาไม่ได้ระบุแค่ AMD Fusion เท่านั้น แต่เขาพูดรวมๆถึง Processor ที่เป็นแบบ Fusion คือมีหลาย core และมีความสามารถหลายแบบบน package เดียวกัน

ผมฟังรู้เรื่องบ้างไม่รู้เรื่องบ้างนะครับ ภาษาอังกฤษแบบวิชาการและศัพท์แสงมากๆก็เล่นผมงงได้ คนบรรยายชื่อ Dr.Rick Goh Siow Mong ของ iHPC ที่สิงคโปร์ เขาพูดถึงแง่ scheduling โดยการที่โปรแกรมเมอร์ต้องแบ่งโปรแกรมเป็น subtask (เช่น function) จากนั้น scheduler จะตัดสินใจว่าจะนำ subtask ไหน map เข้ากับ Core ไหน (เช่น เป็น Computing core หรือ GPU Core เป็นต้น) จากนั้นก็รันอัลกอเพื่อเลือก Core ID และเลือกช่วงเวลาที่จะเอา subtask เข้าไปรันครับ จริงๆเขาอธิบายละเอียดกว่านี้ครับ อันนี้เป็น concept คร่าวๆ และสิ่งที่ต้องพึ่งพาที่สุดคือ SDK / API ที่ต้องออกแบบมาให้โปรแกรมเมอร์ระบุ subtask ของโปรแกรมว่าเน้น Computing / Graphics / Data รวมไปถึงฟังก์ชันอื่นๆเช่น function สำหรับสร้าง shared memory เพื่อติดต่อสื่อสารหรือแชร์ตัวแปรระหว่าง core และฟังก์ชันทีช่วยประสานงานระหว่าง subtask หรือ synchronization ซึ่งเป็นปัญหาชวนปวดหัวหากไม่มี framework และการออกแบบ logic ดีๆ ครับ

จากนั้นคือขั้นตอน Scheduling มันมี 2 แนวทาง คือ static (จัดการโดย compiler) และ dynamic (จัดการตอนรันไทม์) และนี่คือความยากต่อไปของงานวิจัย

Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com


My Blog