ล้อมวงกันเข้ามา จะเทศนาเรื่อง High Performance Computing

กำหนดแนวทาง

ที่ผ่านมาผมนำเสนอเรื่องราวเกี่ยวกับพื้นฐานของ Functional Programming ซึ่งเป็นฐานสำหรับเรื่องต่อๆ ไปที่ผมจะทยอยนำเสนอ แต่นี้เป็นต้นไปจะเริ่ม “เข้าเรื่อง” ในสิ่งที่ผมอยากจะนำเสนอ บทความนี้เป็นบทความเริ่มต้นของชุดบทความชุดใหม่ ผมคิดว่าเราน่าจะต้องมาคุยเรื่องทิศทางกันว่าผมจะนำเสนออะไรกันแน่ ท่านกับผมจะได้เข้าใจตรงกัน ผมขอเริ่มที่จุดนี้ก่อนครับ เว็ปนี้เป็นเว็ปการเขียนโปรแกรม เน้นการเขียนโปรแกรมเป็นแกนหลัก แต่ลำพังการเขียนโปรแกรมอย่างเดียวนั้นอาจจะไม่เพียงพอ อาจจะมีเรื่องเกี่ยวกับ Hardware ต่างๆ มาเกี่ยวข้องด้วย และทฤษฏีต่างๆ เท่าที่จำเป็น

โปรแกรมที่เขียนในเว็ปนี้เอาให้ชัดเจนครับ ไม่ได้เน้นเรื่องการเขียนโปรแกรมทางธุรกิจ ไม่ได้เขียน Web Application ไม่ได้เน้น SQL ไม่ได้เขียนเกมส์ และคงไม่ได้พรรณนาถึงแนวคิด Object Oriented (อย่างที่เคยเคยเขียนไปเมื่อ 10 ปีที่แล้ว) สิ่งที่จะเน้นคืองานคำนวณทางวิทยาศาสตร์และวิศวกรรมเน้นที่การรีดเอาประสิทธิภาพมากที่สุดเท่าที่ทำได้ แต่อาจจะมีเรื่องเกี่ยวข้อง Hardware ต่างๆ  อิเล็กทรอนิกส์  และไมโครคอนโทรลเลอร์มาแทรกยามเบื่อ ดังนั้นในบทความนี้ผมปูเนื้อหาเพื่อเอาไปต่อยอดในบทความอื่นๆ ต่อไป ผมจึงเขียนบทความชุดนี้ขึ้นมาตั้งชื่อว่า “ก้าวแรก High Performance Computing” เพื่อเป็นการพาท่านเข้าสู่โลกของการรีดประสิทธิภาพการเขียนโปรแกรม แต่ท่านก็ต้องมีความรู้พื้นฐานการเขียนโปรแกรมอย่างน้อยก็ระดับ “อ่านออกเขียนได้” ภาษาอะไรก็ได้ครับขอให้พอได้ก็แล้วกัน แต่ถ้าท่านยังเขียนโปรแกรมยังไม่คล่องมือ หยุดอ่านก่อนครับ มิฉะนั้นอาจสับสนได้ ขอให้ไปฝึกเขียนโปรแกรมให้คล่องก่อน ถ้านึกไม่ออกว่าจะเรียนภาษาอะไรดี ลองอ่านบทความต่อไปดูครับ เผื่อจะได้มีแนวทาง

อาจจะยังไม่ชัดเจนนักว่าผมอาจเขียนอะไรกันแน่ ลองอ่านบทความนี้จนจบดูครับ น่าจะทำให้ท่านเข้าใจชัดขึ้น ตามผมมาเลยครับ

 

ปักธงแรกที่การกำเนิดเครื่องคอมพิวเตอร์

เพื่อที่จะทำความเข้าใจเนื้อหาบทความชุดนี้ ผมเลยขอย้อนเวลาไปยังเครื่องคอมพิวเตอร์เครื่องแรกของโลก เอาเป็นเครื่องคอมพิวเตอร์ที่เป็นต้นแบบเครื่องคอมพิวเตอร์สมัยใหม่จริงๆ นะครับ ไม่ใช่เอาลูกคิดมาแล้วบอกว่านี่เครื่องต้นแบบของคอมพิวเตอร์ เครื่องคอมพิวเตอร์เครื่องแรกชื่อว่า Colossus ในปี ค.ศ. 1944 เกิดขึ้นที่อังกฤษ ทำไมถึงว่าเครื่องนี้คือเครื่องคอมพิวเตอร์เครื่องแรกของโลก จริงๆ ก็เพราะมันเป็นเครื่องคำนวณที่โปรแกรมได้ที่เป็นดิจิตอลเครื่องแรกนั่นเอง ขีดเส้นใต้ตรงที่ดิจิตอลครับ เพราะก่อนหน้านั้นมันมีอีกมากมายแต่ไม่ใช่ดิจิตอล เครื่องนี้ทำให้สงครามโลกพลิกโฉมครับ มิฉะนั้นทุกวันนี้เราอาจต้องเรียนภาษาเยอรมันกับญี่ปุ่นแทนภาษาอังกฤษก็เป็นได้ ทั้งนี้ก็เพราะ เครื่องนี้เองเป็นเครื่องที่สามารถถอดรหัสลับ Enigma ที่ใช้สื่อสารทางวิทยุของเยอรมัน การ “รู้เขารู้เรา” ทำให้เยอรมันแพ้สงครามในเวลานั้น

จากนั้นเมื่ออังกฤษทำได้ อเมริกาก็ทำบ้าง ออกมาเป็น ENIAC ซึ่งการเขียนโปรแกรมใช้สายไฟจัมพ์ไปในช่องต่างๆ ก็ถือว่าเป็นการโปรแกรมแบบหนึ่งโปรแกรมได้แต่ยุ่งยาก สายไฟรุงรังมากมาย  John von Neumann อยู่ในทีมนั้นและอีกหลายคนมีแนวคิดในการออกแบบโปรแกรมใหม่ให้สามารถโปรแกรมโดยใช้หลักการ stored program แทนการจั๊มสายไฟ ซึ่งก็คือการเขียนโปรแกรมโดยอาศัยหน่วยความจำ (หลอดสุญญากาศ) นั่นเอง เครื่องนั้นคือ EDVAC มีขนาดใหญ่เท่าห้อง ความเร็ว 1.16kHz มีหน่วยความจำ 5.5kb  ซึ่งถือว่าใหญ่มากในสมัยนั้น เครื่องจักรนี้ก็เป็นเครื่องจักรสงครามเช่นเดียวกันกับเครื่องที่เกิดมาไล่เลี่ยกัน  เครื่องคอมพิวเตอร์เครื่องนี้ประจำการตั้งแต่ปี 1949   และต่อเนื่องมาในปี 1952 von Neumann และผองเพื่อนสร้างเครื่องที่ชื่อว่า IAS สำเร็จ ซึ่งเครื่องนี้ปรับปรุงจุดอ่อนที่ผ่านมาทั้งหมด จนกลายเป็นเครื่องต้นแบบของเครื่องคอมพิวเตอร์สมัยใหม่จริงๆ เครื่องนี้จึงมีชื่อเรียกว่า von Neumann Machine  แนวคิดในการประมวลผลของเครื่องจักรเครื่องนี้กับ CPU ที่เราใช้นั้นเป็นแบบเดียวกัน เพียงแค่ที่เราใช้นั้นเล็กกว่าอย่างมากและเร็วกว่าอย่างเทียบไม่ติด

ถ้าย้อนเวลากล่าวถึงกำเนิดของ CPU ตัวแรก ก็ต่อไล่จากการพัฒนาทางเทคโนโลยี จากหลอดสุญญากาศ มาเป็นทรานซิสเตอร์ จนกลายเป็น IC ในที่สุด และเครื่องคอมพิวเตอร์ก็เช่นกัน จากความใหญ่เท่าห้อง ก็ลดลงเหลือ IC เล็กๆ ไม่กี่ตัว ซึ่งตัว CPU ตัวแรกที่เป็น IC คิดค้นโดย Intel ในปี 1971 แม้ว่าเทียบกับเครื่องคอมพิวเตอร์อย่าง IAS ขนาดจะต่างกันมากมาย แต่แนวคิดก็ยังเป็นแนวคิดเดิมๆ Intel ก็ไปลอกเอาแนวคิดของ IAS มา บริษัทอื่นก็ไปลอก Intel อีกต่อ ก็เลยถือว่า CPU ในยุคปัจจุบันที่เราใช้กันทั่วไปนั้นเป็นแบบ von Neumann ด้วยประการฉะนี้

 

การประยุกต์ใช้คอมพิวเตอร์ในอดีต

แน่นอนครับคอมพิวเตอร์นั้นเกิดมาเพื่อเป็นเครื่องจักรสงคราม คำนวณตัวเลขต่างๆ ที่ใช้ในการสงคราม คอมพิวเตอร์จึงเป็นผลผลิตของสงครามโลกครั้งที่ 2 เมื่อสงครามสิ้นสุดลง การใช้คอมพิวเตอร์เพื่อสันติจึงเกิดขึ้น กลุ่มแรกๆ ที่ใช้คอมพิวเตอร์คือกลุ่มนักวิทยาศาสตร์ครับ ซึ่งแยกตามรูปศัพท์ได้เป็นสองตัวครับคือ

  • Scientific Computing
  • Technical Computing

Scientific Computing คืองานคำนวณทางวิทยาศาสตร์ที่เป็นศาสตร์บริสุทธิ์ เป็นงานคำนวณที่ซับซ้อนเกินกว่ามนุษย์จะทำได้  ต้องการหาค่า Pi ที่มีขนาด 1 ล้านหลัก หรืองานพิสูจน์เช่น August Mobius กล่าวว่าแผนที่ใดๆ ในโลกก็ตาม เราใช้สีระบายแตกต่างกันในแต่ละประเทศ เราสามารถใช้แค่เพียงสี่สีเท่านั้น จะสามารถระบายแผนที่ที่ไม่มีประเทศที่มีชายแดนติดกันต้องใช้สีเดียวกัน ทฤษฏีนี้เป็นที่รู้จักกันในชื่อว่าทฤษฏีสี่สี (four color theorem) นั่นเอง งานเหล่านี้จำเป็นต้องใช้เครื่องคอมพิวเตอร์ช่วยในการคำนวณ

Technical Computing คืองานคำนวณเช่นเดียวกัน แต่เน้นไปทางด้านการประยุกต์ต่างๆ โดยมากจะเป็นงานทางวิศวกรรม การคำนวณการรับน้ำหนักของโครงสร้างต่างๆ ก็ใช่ การคำนวณวิถีกระสุนก็ใช่ หรืออาจไม่เกี่ยวใดๆ กับสายวิทย์เลยเช่นการคำนวณเกี่ยวกับการเงิน ก็ถือว่าใช่เช่นกัน

การใช้งานทั้งทางด้าน Scientific Computer / Technical Computing นั้น ได้รับความนิยมตั้งแต่ยุคปลาย 1950 เป็นต้นมา และภาษาที่นิยมใช้สมัยนั้นก็คือ FORTRAN ซึ่งเป็นภาษาคอมพิวเตอร์ระดับสูงภาษาแรก

จากนั้นคอมพิวเตอร์ก็เริ่มเข้าสู่งานทางธุรกิจ การคำนวณต่างๆ เช่นทางด้านบัญชี การเงิน เป็นต้น ซึ่งความนิยมเริ่มจากยุคกลางๆ ของ 1960 เป็นต้นมา ภาษาระดับสูงที่คิดค้นสำหรับงานนี้โดยเฉพาะคือ COBOL

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

 

ขีดจำกัดของเครื่องคอมพิวเตอร์

ในยุคแรกๆ ของการใช้เครื่องคอมพิวเตอร์นั้น เป็นยุคที่น่าตื่นเต้นครับ เพราะงานคำนวณมือที่เคยใช้เวลาทั้งวันหรือเป็นเดือน แต่พอใช้เครื่องคอมพิวเตอร์กลับใช้เวลาเพียงแค่ไม่กี่วินาทีก็เสร็จแล้ว แถมยังความถูกต้องก็หายห่วงอีกต่างหาก (ถ้าโปรแกรมที่เขียนไม่ผิด) แต่ก็ใช่ว่ามีเครื่องคอมพิวเตอร์แล้ว ปัญหาทุกอย่างจบ ไม่ใช่นะครับ บางปัญหานั้นต่อให้รวมเครื่องคอมพิวเตอร์ในโลกนี้กับโลกหน้าเข้าด้วยกัน ก็ยังไม่พอมือเช่นนักคณิตศาสตร์อยากรู้ว่า ค่า Pi นี่จริงๆ แล้วมันเท่าไหร่กันแน่ เราเคยรู้ว่าค่า Pi มีค่า 3.14159265359…  ที่เห็นว่าจุดจุดจุดไว้นั้น แสดงว่ายังมีต่อ ว่าแต่มันจะต่อไปถึงเท่าใด ลองให้คอมพิวเตอร์ช่วยหาจุดสิ้นสุดของมัน ล่าสุดมีคนใช้กำลังเครื่องคอมพิวเตอร์ระดับสุดยอดหาได้ถึง 10ล้านล้านหลักแล้ว ยังไม่พบจุดซ้ำหรือจุดสิ้นสุด การคำนวณก็คงยังทำต่อไป  งานแบบนี้บางคนเรียกงานแบบนี้ว่า Big Compute หรืองานคำนวณขนาดใหญ่ เพื่อล้อคำว่า Big Data ที่กำลังนิยม สอง Big ต่างกันอย่างไรเดี๋ยวเราค่อยมาดูกันครับ

การทำงานของเครื่องคอมพิวเตอร์นั้น จะมีตัวกำหนดจังหวะอยู่ เราเรียกว่า Clock การกระตุ้นหนึ่งครั้งก็จะทำงานเสร็จหนึ่งงาน หนึ่งงานในที่นี้เป็นงานง่ายๆ ครับอาจจะบวกเลขสองจำนวนเข้าด้วยกัน ซึ่งตัวที่กระทำการบวกจริงๆ คือวงจรบวกที่เป็นวงจรอิเล็กทรอนิกส์ ส่วนหนึ่งงานที่พูดถึงก็คือคำสั่งภาษาเครื่องหนึ่งคำสั่งนั่นเอง แต่ในความเป็นจริงแล้วส่วนมากต้องการมากกว่าหนึ่ง Clock ต่อหนึ่งคำสั่งครับ เช่น Intel ในยุคแรกๆ ต้องกระตุ้นถึง 12 ครั้ง จึงจะบวกเลขขนาด 8 bits เสร็จหนึ่งจำนวน การคูณยิ่งยากกว่าการบวกมากครับ อาจต้องกระตุ้นหลายรอบกว่า จึงมีคำนิยามวงรอบการทำงานเสร็จหนึ่งหน่วยงานว่า Cycle อย่าง Intel ในยุคแรก 12 Clocks เป็น 1 Cycle  แต่ในยุคปัจจุบัน เทคโนโลยีพัฒนาขึ้นไปมากแล้ว ถือได้ว่า 1 Clock เสร็จ 1 งาน โดยเฉลี่ยก็น่าจะได้ (หรืออาจจะดีกว่านั้นเล็กน้อย) หรือ 1 Clock = 1 Cycle  วิธีการจะทำให้เครื่องคอมพิวเตอร์ทำงานเร็วขึ้น ก็คือการหาอัลกอริทึมใหม่ๆ ในการคำนวณ เพื่อสังเคราะห์เป็นวงจรที่ทำงานเร็วขึ้น เมื่อวงจรทำงานได้เร็วขึ้น ก็สามารถรองรับ Clock ที่เต้นได้เร็วขึ้น ซึ่งการเต้นถี่ขึ้นทำงานได้งานมากขึ้นในเวลาที่เท่ากัน   Gordon Moore ผู้ก็ตั้ง Intel เคยกล่าวเอาไว้ว่า เทคโนโลยีทำให้เราสามารถเพิ่มความเร็วขึ้นเป็นสองเท่าตัวทุกๆ 18 เดือน หรือ 1.5 ปีนั่นเอง จาก clock ของ EDVAC ที่ความเร็วระดับ KHz  (1000 Clocks ในหนึ่งวินาที) มาถึงยุค IC ความเร็วเพิ่มขึ้นระดับ MHz (ล้าน Clocks ในหนึ่งวินาที) จนมาถึง Pentium III สามารถทำความเร็วระดับ GHz (พันล้าน clocks ในหนึ่งวินาที) พอถึง Pentium IV ในยุคต้นปี 2000 ความเร็วเข้าใกล้ 4GHz  แต่จนถึงวันนี้ ผ่านมาแล้วกว่า 10 ปี ความเร็ว Core i7 รุ่นที่ความถี่สูงที่สุด ก็เพียง 3.9GHz   ตัว ผ่านมาแล้วสิบกว่าปี ความเร็ว Clock ยังเท่าเดิม แน่นอนครับ งานที่ได้ต่อ Clock มีการพัฒนาขึ้น อย่างเช่นจากเดิมการหารเลขใช้ 4 clocks อาจจะลดเหลือ 2 clocks แต่กระนั้นก็ตาม ถ้าปั่น clock ขึ้นกว่านี้ไม่ได้ ความเร็วอย่างก้าวกระโดดจะเกิดขึ้นไม่ได้

“หมดแล้วอาหารกลางวันฟรี” (The Free Lunch is Over) เป็นวลีทองของ Herb Sutter (ผู้เชี่ยวชาญ C++ ของ Microsoft) บอกเราเมื่อปี 2009 ว่า ที่ผ่านมาโปรแกรมเมอร์ไม่จำเป็นต้องเน้นเรื่องความเร็วการทำงานของโปรแกรมที่เขียนขึ้นมากนัก เนื่องจากถ้าเราพบว่ามันทำงานช้า เราก็สามารถใช้วิธีเปลี่ยนเครื่องคอมพิวเตอร์ใหม่ ช้าเมื่อไหร่ก็ซื้อใหม่ที่เร็วขึ้น หรือไม่ก็รอหน่อยเดี๋ยวมันก็มี CPU รุ่นใหม่ที่เร็วกว่าเดิมและอาจจะถูกลงด้วยซ้ำ  ก็เครื่องคอมพิวเตอร์เร็วขึ้นทุกวันอย่างนี้ โปรแกรมเมอร์เลยไม่ต้องลงแรงมากนัก อาศัยเงินก็ซื้อความเร็วได้ แต่ของฟรีตรงนี้หมดแล้ว Clock ปั่นขึ้นกว่านี้ไม่ได้แล้ว  เพื่อรักษากฎของ Moore เมื่อสูงไม่ได้ก็ขออ้วนแทน เราเลยใช้วิธีการขยายด้านข้างคือ เพิ่มจำนวน CPU และในสมัยใหม่นี้ ก็เพิ่มจำนวน Cores ต่อ CPU เข้าไป หลายหัวช่วยคิดดีกว่าหัวเดียว

จำนวน Cores หรือ CPU ที่เพิ่มขึ้นมานั้น ไม่ใช่ของฟรี มีคนเข้าใจผิดไม่น้อยครับว่า ถ้าเราไปซื้อ Core i7 มาใช้ ภายในมี 4 Cores ดังนั้นเวลาเขียนโปรแกรมให้ทำงานทั้ง 4 Cores จะช่วยกันทำ ไม่ใช่นะครับ เข้าใจอย่างนั้นเป็นมายาครับ แท้ที่จริงแล้วโปรแกรมของเรามันทำงานเพียง Core เดียว นั่นหมายความว่าอีก 3 Cores ไม่ได้ทำงานหรือทำงานอย่างอื่น เราต้องใช้กลยุทธ์บางอย่างในการเขียนโปรแกรมเพื่อเรียก Core ทั้งหมดมาช่วยกันทำงาน โปรแกรมจึงจะทำงานเร็วขึ้น นั่นถือเป็นหน้าที่หลักของผมในเว็ปนี้เลยครับที่จะอธิบายถึงกลยุทธ์ที่วุ่นวายซับซ้อนเหล่านั้น

และสิ่งที่เข้าใจผิดกันรองลงมาก็คือ ถ้างานเราที่ใช้เพียง core เดียว ทำงาน 4 ชั่วโมง เมื่อเราเขียนโปรแกรมให้ 4 Cores ทำงานพร้อมกัน งานจะเสร็จเร็วกว่าเดิม 4 เท่า หรือเหลือเพียง 1 ชั่วโมง นั่นคือความฝันอันสูงสุดครับ ในโลกความเป็นจริงไม่ได้เป็นอย่างนั้น เขียนไม่ดี เผลอๆ 4 cores จะทำงานช้ากว่า core เดียวอีก บางครั้งเสร็จภายใน 2 ชั่วโมงก็ถือว่าหรูแล้ว ดังนั้นหน้าที่ของผมในเว็ปนี้อีกอย่างคือ คือการหาเทคนิคที่ทำให้ได้ผลลัพธ์เร็วขึ้น ทำให้เข้าใกล้หนึ่งชั่วโมงที่สุดเท่าที่จะทำได้

ขอนิยามคำศัพท์เล็กน้อยครับ ในอดีตนั้นในสมัยที่ CPU มีเพียง core เดียว เราสามารถทำงานหลายๆ งานพร้อมกันได้ เช่น พิมพ์เอกสารพร้อมไปกับฟังเพลง และเครื่องก็ยัง Scan Virus ไปพร้อมกันอีก การทำงานเช่นนี้เรียกว่าการทำงานแบบ Concurrency โดยอาศัยการทำงานแบ่งเวลา (Time Sharing) มีหลาย Cores แต่ทำคนละงานก็เรียก Concurrency ครับ แต่ในเว็ปนี้สิ่งที่เน้นคือการประมวลผลแบบขนาน (Parallel Computing) ซึ่งเรามีหลาย Cores หลาย CPU หรือหลายเครื่องคอมพิวเตอร์ ต้องมาทำงานร่วมกันเพียงงานเดียว เพื่อให้ได้ผลลัพธ์ที่เร็วที่สุด

 

ฉีกข้อจำกัดของ von Neumann

ถ้ามองมิติเรื่องการทำงานของคำสั่งแต่ละคำสั่ง CPU ที่สร้างตามแนวคิดของ von Neumann ถือว่าทำงานเป็นแบบอนุกรม ซึ่งทำงานทีละคำสั่งเรียงลงมา จนกระทั่งในปี 2001 IBM ออก Power4 ซึ่งเป็น CPU ที่มีสอง cores เป็นตัวแรก ซึ่งทำให้สามารถทำงานสองคำสั่งพร้อมๆ กัน และอิสระต่อกัน จากนั้น CPU ยี่ห้ออื่นก็มีจำนวน Core ตามขึ้นไม่ จนกระทั่งถึงปัจจุบันเครื่องคอมพิวเตอร์ที่วางขายทุกเครื่องมีมากกว่าหนึ่ง core และเหตุการณ์นี้จะเกิดขึ้นกับโทรศัพท์มือถือในอีกไม่นานนี้

ทำไมการเพิ่มจำนวน Core ขึ้นหนึ่ง core ถึงไม่ทำให้งานเสร็จเร็วขึ้นเป็นสองเท่า คำตอบอยู่ที่การเสียเวลาในการสื่อสารและจัดการจราจรระหว่าง Cores นั่นเอง ซึ่งจะกล่าวในบทความต่อๆ ไปครับ ตอนนี้ผมขอกล่าวถึงเครื่องคอมพิวเตอร์ชนิดพิเศษหน่อยครับ เมื่อมีความต้องการเกินกว่าเครื่องคอมพิวเตอร์ตลาดทั่วไป ดังนั้นจึงมีบริษัทหลายบริษัทที่ออกแบบเครื่องคอมพิวเตอร์ใหม่เน้นการคำนวณให้เร็วที่สุดและขายกันในราคาที่สูงมาก กลายมาเป็นเครื่องที่เราเรียกว่า Supercomputer  ที่โด่งดังก็เช่น Cray เป็นต้น  ท่านอาจจะสงสัยว่ามันเร็วได้อย่างไร ในเมื่อ Clock ปั่นให้ตายมันก็ไม่น่าจะเกิน 5GHz หรือมันไม่จำเป็นต้องใช้ Clock  มันใช้ครับ มันคงยังใช้ Clock และก็ยังคงมีข้อจำกัดเช่นเดียวกันเครื่องคอมพิวเตอร์ทั่วไป แล้วมันจะเร็วกว่า CPU ปกติอย่างไร ความลับของมันอยู่ที่การประมวลผลแบบขนานครับ นั่นหมายความว่าอาจมีตัวประมวลผลหลายตัว ในยุคแรกๆ ตัวประมวลผลไม่ได้อิสระต่อกันนะครับ  ทุกตัวต้องทำคำสั่งเดียวกัน เช่นให้บวก ก็ต้องบวกเหมือนกัน ไม่ต้องตกใจนะครับ มันไม่ได้ทำงานซ้ำซ้อน ถึงจะบวกเหมือนกัน แต่กระทำกับตัวเลขคนละตัว พูดง่ายๆ ว่า ตัวเลขอยู่ใน Array ถ้าเรามีตัวประมวลผล 100 ตัว ก็จะสามารถบวกเลขใน Array ได้ 100 ตัวในเวลาเดียวกัน ซึ่งในเชิงวิทยาศาสตร์ เราเรียกข้อมูลที่เรียงเป็นแถวอย่าง Array นี่ว่า Vector ดังนั้นเครื่องคอมพิวเตอร์แบบนี้จึงเรียกว่า Vector Machine การเขียนโปรแกรมจึงต้องพยายามจัดข้อมูลรูปให้อยู่ใน Vector เพื่อประมวลผลพร้อมกันให้ได้มากที่สุด จึงจะทำงานเร็วได้ การจัดให้อยู่ในรูปนี้เราเรียกว่า Vectorization  ใน CPU ยุคใหม่ๆ จำพวก Intel หรือ ARM นั้น ก็เริ่มมีการนำเอาแนวคิด Vectorization มาใช้ โดยที่ Intel มีชุดคำสั่ง ตั้งแต่ MMX, SSE เป็นต้น ส่วน ARM รุ่นสูงๆ ขึ้นมาก็จะมี NEON แต่น่าเสียดาย ที่เราต้องอาศัย Compiler ที่ดีพอ จึงจะสามารถสร้าง Code โปรแกรมเพื่อเรียกใช้คำสั่งดังกล่าวได้

เครื่อง Supercomputer มีราคาสูงมาก แต่เมื่อเวลาผ่านไป CPU รุ่นใหม่ๆ มีราคาถูกลงมากเพราะมนตราคำว่า mass product ที่สามารถกระจายค่าใช้จ่ายต่างๆ ที่เกิดขึ้นเช่นค่าการวิจัยไปยังผลิตภัณฑ์ที่วางจำหน่าย บริษัทต่างๆ ที่เคยทำ Supercomputer เลยเปลี่ยนวิธีการโดยเอา CPU ท้องตลาดนี่เองหลายตัวมาต่อเชื่อมกัน โดยออกแบบ Mainboard ให้เป็นแบบ Modular สามารถเสียบเพิ่มขึ้นได้เรื่อยๆ เสียบเพิ่มกันถึงหลักล้านตัวกันเลยทีเดียว กลายเป็น Supercomputer แนวใหม่

ข้ามฟากมาอีกฝั่งครับ ในระหว่างที่พวกนักวิทยาศาสตร์กำลังสาละวนกับการคำนวณที่น่าปวดหัว บริษัทผลิตเกมส์ก็แข่งกันแย่งลูกค้าโดยพัฒนาเกมส์ให้มีความเหมือนจริงยิ่งขึ้น ทั้งในด้านความละเอียดแล้วความลื่นไหน เพื่อดูดเงินของนักเล่นเกมส์ทั่วโลก ภาพที่เกิดขึ้นในเกมส์มันก็คือคณิตศาสตร์นั่นเอง  ซึ่งภาพเกิดจากการคำนวณทางคณิตศาสตร์ที่เราเรียกว่าการ render ยิ่งสวยมากยิ่งกินกำลัง CPU มาก มาถึงจุดหนึ่ง CPU คำนวณไม่ทันแล้วใหนจะภาพในจะตัวเกมส์อีก ผู้ออกแบบ Graphics Card จึงออกแบบ GPU ขึ้นมาเพื่อช่วยในการประมวลผลภาพแทน CPU และ GPU ไม่ได้ทำงานเร็วกว่า CPU นะครับ  ดังนั้นจึงใช้วิธีการสร้าง Cores ขึ้นมาเยอะๆ  จากสิบเป็นร้อยเป็นพัน ต่อแผ่น โดยการแบ่งหน้าจอเป็นส่วนย่อยๆ และให้แต่ละ Core ของ GPU รับหน้าที่คำนวณในส่วนนั้น แล้วค่อยรวมกลับมาเป็นภาพเดียวแบบนี้จะเร็วขึ้นมาก

ในปี 2007  Nvidia เจ้าพ่อ Graphics Card เกิดมีความคิดในการแตกไลน์ธุรกิจของต้น โดยอยู่บนพื้นฐานที่ว่า Core ใน GPU นั้นมันก็เป็น Core สำหรับการคำนวณทาง Graphics มันน่าจะดีถ้าทำให้ Cores เหล่านี้คำนวณตัวเลขอย่างอื่นที่นอกเหนือการประมวลผลภาพ Nvidia ก็ออกชุดพัฒนาโปรแกรมขึ้นมา เรียกว่า CUDA  เพื่อเขียนโปรแกรมเริ่มแรกคือภาษา C ไปสั่งงานตัวประมวลผลหลายร้อย cores ของ GPU เพื่อคำนวณงานทางคณิตศาสตร์ที่เราต้องการ ไม่ใช่งานทาง Graphics  ซึ่งใช้หลักการของ Vectorization เหมือนใน Supercomputer รุ่นแรกๆ และความเร็วที่ได้น่าเหลือเชื่อครับ  ถ้าวันนี้คุณกำเงิน ประมาณ 25,000 บาท ไปร้านคอมพิวเตอร์ซื้อ Notebook มาซักตัว เชื่อไหมครับว่า กำลังการประมวลผล GPU เพียงตัวเดียวที่ให้มาใน Notebookนั้น มีกำลังประมวลผลเร็วว่าเครื่อง Supercomputer อันดับ 100 ของโลกของปี 2004 หรือเมื่อเพียงสิบปีที่แล้วนี่เอง ที่พูดอย่างนี้หมายความว่า คุณสามารถมี Supercomputer ในบ้านคุณได้ครับ ทำให้ Nvidia สามารถขาย Graphic Card ระดับเทพ โดยที่คนซื้อไปไม่ได้เอาไปเล่นเกมส์ Nvidia เลยรับทรัพย์กำไรพุ่ง และเมื่อปี 2012  Ridge National Laboratory ของอเมริกาว่าจ้าง Cray สร้าง Supercomputer ขึ้นมากลายเป็นเครื่องคอมพิวเตอร์ที่เร็วที่สุดในโลก ถ้าไปเปิดดูในเครื่องจะพบตัวประมวลผล GPU ของ Nvidia  หลายแสนตัวอยู่ในนั้น เครื่องคอมพิวเตอร์เครื่องนั้นตั้งชื่อว่า Titan

ในตลาดการประมวลผลความเร็วสูงที่ Intel เคยเป็นจ้าวตลาดมากหลายปี ถูก Nvidia แย่งทั้งรายได้และหน้าตา ถือว่าเป็นการเสียเหลี่ยมมากครับ  Intel จึงซุ่มแก้เกมส์ โดยออกแบบตัวช่วยประมวลผลใหม่มีชื่อว่า Intel Xeon Phi ซึ่งหน้าตาเหมือนกับ VGA card ของ Nvidia เสียบเข้าเครื่องคอมพิวเตอร์ ด้วยวิธีเดียวกัน ซึ่งจำนวน Cores มีมากถึง 60 Cores ต่อ card กันเลยทีเดียว ถึงแม้ว่าไม่มากมายเหมือน Nvidia ที่มีนับหลักพัน Cores แต่ก็เป็น Cores ที่สามารถทำงานได้อย่างอิสระ ไม่จำเป็นต้องทำ Vectorlization ดังนั้นการเขียนโปรแกรมจึงง่ายกว่าและมีประสิทธิภาพกว่า ในปี 2013 National University of Defence Technology ของจีน สร้าง Supercomputer ให้ National Super Computer Center ในกว่างโจว โดยใช้ Intel Xeon Phi หลัก มี cores รวมถึง 3 ล้าน cores ตั้งชื่อว่า เทียนเหอ-2 (คงคาสวรรค์) ซึ่งสามารถเอาชนะ Titan และขึ้นมากลายเป็นเครื่องคอมพิวเตอร์ที่ทำงานเร็วที่สุดในโลกได้อย่างไม่ยากเย็นนัก แต่ Intel Xeon Phi แผ่นหนึ่ง ราคาเกือบแสน แพงมาก เกินกำลังที่หามาทดลองได้ ผมจึงไม่มีข้อมูลมากนัก

Cluster  ทางเลือกที่น่าสนใจ

เมื่อประมาณ 20 ปีแล้ว ผมเคยอ่านข่าวอยู่ข่าวหนึ่ง ผมจำรายละเอียดไม่ค่อยแม่นแล้ว แต่ประมาณว่าเป็นนักศึกษามหาวิทยาลัยแห่งหนึ่ง น่าจะเป็นอเมริกา เขียนโปรแกรมขึ้นมาสำหรับถอดรหัสของกลุ่มค้าของเถื่อนใน internet โดยไม่ได้ใช้ Supercomputer แต่อย่างใด แต่หากเขียนโปรแกรมฝังในเครื่องคอมพิวเตอร์ธรรมดามหาวิทยาลัยที่ตัวเองเรียนอยู่ จำไม่ได้แล้วครับว่ากี่เครื่องแต่ไม่น้อยแน่นอน โดยเอาเวลาที่ idle ของ CPU ก็คือเวลาว่างนั่นเอง โดยเฉพาะช่วงเที่ยงที่ไม่มีใครใช้เครื่อง เครื่องมันจะช่วยกันประมวลผลถอดรหัส ทำงานไปประมาณหนึ่งเดือนก็สามารถถอดรหัสได้สำเร็จ ซึ่งข่าวนี้เป็นแรงบันดาลใจให้ผมเริ่มศึกษาการเขียนโปรแกรมทั้งแบบขนานและข้ามเครื่อง ซึ่งแนวคิดการข้ามเครื่องแบบนี้ต่อมารู้จักกันในชื่อว่า Cluster  ซึ่งการสร้าง Cluster นั้นสร้างอย่างจริงจังก็ไม่ยากมาก เพราะเราสามารถอาศัยเทคโนโลยี Server ที่ในวงการธุรกิจใช้มาประยุกต์ใช้ การเขียนโปรแกรมก็อาศัยการส่งผ่าน Message เช่น MPI เป็นต้น

มีการเปลี่ยนแปลงเกิดขึ้น เมื่อปี 2012 มีองค์กรหนึ่งอยากสร้างเครื่องคอมพิวเตอร์ขนาดเล็ก และถูกที่สุดที่สามารถใช้งาน Linux ได้ เพื่อขยายโอกาสทางการศึกษาของเด็ก ผลปรากฏว่าสามารถลดขนาดเครื่องคอมพิวเตอร์ให้เล็กลงเท่ากับขนาดของบัตรเครดิต ราคาแค่เพียง $25 สามารถต่อจอภาพ keyboard และ mouse ทำงานได้เหมือนเครื่องคอมพิวเตอร์เครื่องหนึ่งเลยทีเดียว ความเร็วอยู่ในเกณฑ์ใช้ได้ แน่นอน ความเล็ก ไม่มีกลไกการเคลื่อนที่อย่างพัดลม ทำให้กินไฟต่ำ หลังจากนั้นไม่นาน ก็มีคนคิดว่า ถ้าเราเอาเครื่องเล็กๆ นี้ต่อกันเป็น Cluster ก็น่าจะดี ต้นทุนไม่แพง กลายเป็นเป็น Cluster คนยาก แต่อย่างดูถูกไปนะครับ ต่อไปเยอะๆ เครื่อง มันก็เร็วนะครับ  เรื่องนี้จึงเป็นอีกหัวข้อหนึ่งที่ผมอยากนำเสนอ แต่ก็ตามคิวครับ

 

Big compute vs Big Data

พูดถึงความเร็วของคอมพิวเตอร์ จาก IAS ความเร็ว หลัก KHz -> MHz -> GHz    กระโดดมาสองขั้น แต่ละขึ้นอย่างที่ทราบกันก็คือ 1000 เท่า แต่ถ้าเทียบกับพื้นที่ในการเก็บข้อมูลจาก  IAS  KB -> MB -> GB -> TB  อีกไม่นานเกินรอ จะเป็น PB   ซึ่งเห็นว่าการกระโดดของ Storage นั้นมาอย่างน้อยสามขั้นแล้ว พัฒนาได้ไกลกว่าความเร็วของ CPU ซึ่งตันแล้ว

งานของคอมพิวเตอร์ในยุคแรกๆ จึงเป็นงาน Big Compute คำนวณเป็นหลักอย่างที่กล่าวมาข้างต้น แต่ที่โตขึ้นอย่างเงียบๆ คือปริมาณข้อมูล ข้อมูลที่เก็บเป็นแฟ้มต่างๆ  ไม่ใช่ในรูปตารางอย่าง SQL บ้างครั้งเราก็เรียกกันว่าข้อมูลแบบ NoSQL ข้อมูลเหล่านี้คือ Data หรือข้อมูลดิบ เพื่อให้มันกลายเป็น สารสนเทศ หรือ Information มันต้องผ่านกระบวนการรวมรวม ซึ่งข้อมูลขนาดใหญ่ เป็น Big Data แบบนี้ ก็ต้องอาศัยเครื่องมือที่ดีพอ Google เองก็ใช้ เรียกว่า MapReduce จากนั้น Yahoo ก็เอาไปทำบ้าง และก็แจกฟรีเป็น Opensource จนกลายเป็น Hadoop และน้องใหม่คือ Spark ซึ่งมีความสามารถในการทำ Big Compute อยู่ด้วย ในเว็ปนี้ผมคงไม่ได้เน้นไปที่ Big Data มากนัก แต่ก็คงจะกล่าวถึงบ้างเฉพาะส่วนที่เกี่ยวข้องกับ Big Compute ซึ่ง Spark ก็เป็นหนึ่งในนั้น

 

ทิศทางของเว็ปนี้

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

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

 

ก่อนจาก

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

[Total: 16    Average: 3.8/5]

You may also like...

2 Responses

  1. Kai says:

    ชอบครับ อาจารย์

  2. W!up says:

    โมทนาสาธุ

Leave a Reply

Your email address will not be published. Required fields are marked *