Category: C++

ก้าวแรก HPC #10: ทลายขีดจำกัดด้วย ZeroMQ 0

ก้าวแรก HPC #10: ทลายขีดจำกัดด้วย ZeroMQ

เกริ่นนำ ที่ผ่านมาเราได้เรียนรู้ในการรีดกำลังของ CPU มาใช้ให้เต็มประสิทธิภาพซึ่งก็ผ่านไปด้วยดี ผลลัพธ์เป็นที่น่าพอใจ ในบทนี้เราจะไปกันต่อ เมื่อเราสูบทรัพยากรของเครื่องคอมพิวเตอร์หมดแล้ว เราก็ต้องไปสูบเครื่องอื่นต่อไป ใช่ครับ เรากำลังพูดถึงการทำงานแบบคลัสเตอร์ นั่นก็ไม่ใช่เรื่องใหม่สำหรับเรานัก เพราะได้ผ่านหูผ่านตามาจาก Apache Spark ไปแล้ว ตัวของ Apache Spark นั้นให้เราได้ทุกสิ่ง เหลือเพียงอย่างเดียวที่เรายังไม่ได้ก็คือประสิทธิภาพ ในบทนี้เรามาทวงถามหาประสิทธิภาพกัน เปิดเรื่องด้วย Message Queue บทความนี้เราจะใช้งาน ZeroMQ ซึ่ง MQ ในที่นี้ย่อมาจากคำว่า message queue เราจึงควรทำความเข้าใจเป็นปฐมกันก่อน คำว่า message more »

ก้าวแรก HPC #09: Thread Library เก่าแต่เก๋า 0

ก้าวแรก HPC #09: Thread Library เก่าแต่เก๋า

เกริ่นนำ เราเริ่มแหย่ขาเข้าสู่โลกแห่งการประมวลผลแบบขนาน โดยผ่านเรียนรู้จากการใช้งาน Apache Spark ซึ่งเป็นโมเดลการเขียนโปรแกรมแบบ MapReduce ที่ได้รับความนิยมอย่างสูงในยุคปัจจุบัน แต่โจทย์เราอาจจะไม่เหมาะสมกับเครื่องมือ เลยทำให้ได้รับผลตอบสนองที่สอบตกทุกวิชา มาวันนี้เราจะย้อนกลับไปโมเดลดั่งเดิม โมเดลที่ไม่ค่อยมีใครเขียนกันแล้วเพราะยุ่งยาก ส่วนมากก็ไปใช้ library ที่ขี่บนโมเดลนี้อีกที โมเดลนี้ก็คือ Fork-Join นั่นเอง ผมว่าถ้าเรียนรู้อย่างเป็นระบบแล้ว ก็ไม่ได้ยุ่งยากอะไร เปิดใจให้กว้างแล้วมาเรียนรู้ด้วยกันครับ เรียนรู้ศัพท์การประมวลผลแบบขนานผ่านมุมมองประวัติศาสตร์ ใครเคยเขียนโปรแกรมทำงานบนโมโครคอนโทรลเลอร์ขนาดเล็กจะเข้าใจดีว่า เมื่อเราเขียนโปรแกรมเสร็จ คอมไพล์ แล้วโหลดโปรแกรมจากคอมพิวเตอร์ไปเก็บไว้ใน flash ของไมโครคอนโทรลเลอร์แล้วก็บูทใหม่ เท่านี้โปรแกรมก็จะเริ่มทำงาน ไม่เห็นจำเป็นต้องมี OS แต่อย่างใด  โปรแกรมที่รันนั้นเป็นโปรแกรมเดียว ไม่สามารถทำงานพร้อมกันหลายโปรแกรมได้ more »

ก้าวแรก HPC #07: เตรียมเสบียงเลี้ยงตัว สู่โลกแห่งการประมวลผลแบบขนาน 0

ก้าวแรก HPC #07: เตรียมเสบียงเลี้ยงตัว สู่โลกแห่งการประมวลผลแบบขนาน

เกริ่นนำ ผมเริ่มเขียนบทความเรื่อง Apache Spark ปรากฏว่ามันเริ่มบวมใหญ่ เลยตัดสินใจแยกเนื้อหาที่ไม่เข้าพวกที่ต้องเกริ่นนำเป็นพื้นฐานออกมาเป็นบทความอีกบทความหนึ่ง กลายเป็นสะพานเชื่อมจากโลกการประมวลผลแบบเดี่ยวมาสู่การประมวลผลแบบขนานได้ ระหว่างการเขียนบทความนี้ก็บวมใหญ่อีก ผมเลยตัดเนื้อหาในส่วนที่ซับซ้อนไปไว้ในบทความชุดใหม่ “ก้าวสอง” ทั้งนี้เพื่อให้บทความชุดก้าวแรกนี้ยังคงง่ายสบายๆ นั่นเอง ดังนั้นบทความนี้จึงเหลือเท่าที่เห็น ไม่ง่ายและไม่ยากจนเกินไปนัก ในบทความนี้ผมขอเน้นการวิเคราะห์โปรแกรมที่เราเขียนกันผ่านมา พิจารณาดูว่าโปรแกรมส่วนไหนควรปรับให้เป็นการประมวลผลแบบขนานและมีข้อควรระวังอะไรบ้าง เรามาเริ่มกันเลยครับ **หมายเหตุ ในบทความนี้ผมใช้คำว่า “ตัวประมวลผล” แทนคำว่าคอร์ เพราะความหมายมันกว้างกว่า แต่ถ้าท่านคุ้นเคยกับกับว่าคอร์ก็ให้ทราบว่าเป็นเรื่องเดียวกัน Dr. Gene Amdahl ผู้นิยามขอบเขตการประมวลผลแบบขนาน ธรรมชาติการประมวลผลแบบขนานนั้น ในชั่วอายุของการทำงานของโปรแกรมนั้นไม่ใช่ว่าจะสามารถประมวลผลแบบขนานได้ตลอดเวลา บางเวลาโดยเฉพาะอย่างยิ่งตอนเริ่มและการสิ้นสุดการทำงานนั้นจะเป็นการประมวลผลแบบเดี่ยว เพื่อให้เห็นภาพผมเลยวาดให้ดูดังนี้ จากภาพจะเห็นได้ชัดเจนครับ การเริ่มทำงานนั้น จะเริ่มที่ตัวประมวลผลเดี่ยว more »

ก้าวแรก HPC #06: อัลกอริทึมประสิทธิภาพสูงและการปรับปรุงประสิทธิภาพ 0

ก้าวแรก HPC #06: อัลกอริทึมประสิทธิภาพสูงและการปรับปรุงประสิทธิภาพ

เกริ่นนำ ในบทความที่แล้วผมนำเสนออัลกอริทึมอย่างง่ายเพื่อใช้หาค่า Bernoulli Number มาบทนี้เราจะไปกันต่อครับ เราจะไปเรียนรู้ถึงอัลกอริทึมที่มีประสิทธิภาพสูง สูงจริงครับ เป็นแชมป์ในตอนนี้ และเช่นเคยครับ เราจะมาเรียนรู้การปรับปรุงประสิทธิภาพของอัลกอริทึม ตลอดจนเฉลยการบ้านที่ค้างคามาจากบทความก่อนหน้า การแข่งขันเพื่อหาค่า Bernoulli Number ในบทความที่ผ่านมา ผมใช้อัลกอริทึมอย่างง่าย นั่นคือ Recursive เป็นหาค่า Bernoulli Number ไปจนถึง B(1000) ท่านสงสัยไหมครับว่าค่า Bernoulli Number ที่สูงที่สุดเท่าที่มนุษย์หาได้คือ B ลำดับที่เท่าไร ผมมีคำตอบครับ ลองดูที่ตารางนี้ดูครับ   ข้อมูลจาก http://en.wikipedia.org/wiki/Bernoulli_number อย่างที่เราทราบกับว่า more »

ก้าวแรก HPC #05: อัลกอริทึมอย่างง่ายและการปรับปรุงประสิทธิภาพ 0

ก้าวแรก HPC #05: อัลกอริทึมอย่างง่ายและการปรับปรุงประสิทธิภาพ

เกริ่นนำ บทความนี้เป็นบทความแรกตั้งแต่เริ่มทำเว็ปนี้ที่เขียนเป็นโปรแกรมจริงๆ  โปรแกรมที่เราจะเขียนกันนั้นก็มาจากทฤษฎีบทก่อนหน้าเรื่องการหาค่า Bernoulli Number นั่นเอง ซึ่งเป็นแบบง่ายที่สุด เป้าหมายที่แท้จริงของบทความนี้คงไม่ใช่อยู่ตัวอัลกอริทึมแต่อย่างใด เพราะไม่มีอะไรซับซ้อนมากมายตรงไปตรงมา แต่หากอยู่ที่อยู่มุมมองเรื่องของประสิทธิภาพ การเขียนโปรแกรมให้ทำงานได้ถูกต้องนั้นเป็นแค่เพียงขั้นแรกเท่านั้น ขั้นต่อไปเราต้องปรับปรุงประสิทธิภาพให้ดีด้วย ในบทความนี้จะใช้ Python เป็นตัวทำ Prototype เมื่อเรียบร้อยแล้วจึงไปใช้ C++ ในกระบวนการสุดท้าย ท่านจะได้เห็น workflow การทำงานจริง เชิญสดับ อัลกอริทึมในการหา Bernoulli Number อย่างง่าย Bernoulli Number ก็เฉกเช่นเดียวกับคณิตศาสตร์ทั่วไปคือมีวิธีหาค่าได้หลายวิธีที่อาจแตกต่างกันโดยสิ้นเชิง ท่านอาจนึกไม่ถึงว่าบางวิธีที่แปลกๆ จะสามารถหาค่าคำตอบถูกต้องได้ แต่ละวิธีนั้นก็มีข้อดีข้อเสียแตกต่างกันไป วิธีเหล่านั้นเราเรียกว่าอัลกอริทึม more »

ก้าวแรก HPC #03: การสร้าง Cluster ส่วนตัวราคาถูกและดี

เกริ่นนำ ในบทความก่อนหน้า ผมคุยถึงเรื่องภาษาที่เลือกใช้ไปแล้วได้แก่ภาษา Python และ C++ ตอนแรกคิดว่าบทความนี้จะเข้าเรื่องโจทย์ตัวอย่างเลย แต่มาคิดอีกทียังขาดพื้นฐานที่สำคัญอีกเรื่องหนึ่ง ผมว่าเราควรมาคุยกันก่อนเพื่อจะได้ไม่เสียเวลาย้อนมาคุยกันอีก เรื่องที่ผมจะคุยในบทนี้ก็คือเรื่องเครื่องคอมพิวเตอร์ที่ผมใช้ครับ เนื่องจากเนื้อหาในเว็ปนี้เป็นการประมวลผลแบบขนาน ซึ่งไม่ได้จำกัดว่าจะขนานกับบนเครื่องคอมพิวเตอร์เพียงเครื่องเดียว ผมมีคอมพิวเตอร์หลายเครื่องครับ แต่การเปิดเครื่องคอมพิวเตอร์หลายเครื่องทำงานพร้อมๆ กัน ทั้งกินพื้นที่และกินไฟ ดูยุ่งยากครับ ผมก็เลยจะใช้วิธีเอาเครื่องคอมพิวเตอร์ถูกๆ ถูกจริงๆ ครับ กินพื้นที่น้อยมาก จอภาพแต่ละเครื่องก็ไม่ต้องใช้ ผมใช้ notebook ตัวเดียวเพื่อเข้าไปควบคุมทั้งหมด เป็น Single-board Computer หน้าตาจะเป็นอย่างไร เราไปดูรายละเอียดกันครับ ประวัติ Single-board Computer คอมพิวเตอร์ราคาถูกที่ผมจะใช้นั้น more »

ก้าวแรก HPC #02 : C++ 0

ก้าวแรก HPC #02 : C++

เกริ่นนำ หนึ่งในภาษาที่นิยมใช้งานทางด้าน HPC นั่นคือ C++ แต่ก็ไม่ใช่ว่าเขาใช้กันเราก็เอาบ้าง มีบ่อยครั้งที่เขาใช้กันผมก็ไม่เอาด้วย ผมก็เลยมาขอแจงรายละเอียดให้ท่านอ่านกัน ถ้าท่านจริตเดียวกับผมก็มาใช้กันครับ แต่ถ้าคิดว่าไม่ใช่ อย่าฝืนนะครับตัวเลือกยังมีอีกมาก หน้าประวัติศาสตร์ภาษา C++ เป็นธรรมเนียมของผมก่อนจะคุยเรื่องอะไรต้องมีการการเท้าความไล่ประวัติกันก่อน อยากรู้ที่ไปก็ต้องรู้ที่มา จะได้เห็นภาพรวมของทั้งหมด C++ นั้นเกิดหลังจาก C มาประมาณ 10 ปี โดยผู้คิดค้นคือ Bjarne Stroustrup เป็นวิทยานิพนธ์ระดับปริญญาเอก โดยผสม C เข้ากับ Simula กลายเป็น “C with Classes” more »