อีกไม่นาน CPU ที่มีเพียง core เดียวก็จะหยุดวางจำหน่าย -- Multi-core CPU กำลังจะยึดครองโลก! -- เหตุผลแค่นี้ก็เพียงพอแล้วที่จะทำให้โปรแกรมเมอร์ต้องหันมาเขียนโปรแกรมเชิงขนานกันอย่างจริงจัง
เมื่อวันพฤหัส-ศุกร์ที่ผ่านมา (19-20 มีนาคม) มีโอกาสได้เข้าร่วม โครงการฝึกอบรมการใช้เทคโนโลยีมัลติคอร์ (Intel Multi-core Programming Workshop) จัดโดย คณะวิทยาศาสตร์และเทคโนโลยี มหาวิทยาลัยธรรมศาสตร์ และอินเทล เนื้อหาอบรมเน้นสอนการเขียนโปรแกรมเชิงขนานเบื้องต้น หลักการเปลี่ยนโปรแกรมเก่าให้ทำงานแบบเชิงขนาน ไปจนถึงการวิเคราะห์และปรับปรุงประสิทธิภาพการทำงานของโปรแกรม
___อ.ดร.วรวรรณ มะเริงสิทธิ์ ขณะบรรยายเรื่อง Windows Thread___

การอบรมเป็นไปแบบสบายๆ ใช้ความรู้พื้นฐานด้าน Computer Architecture และ Operating Systems แบบไม่ลงลึกมาก; ใช้ภาษา C++ โปรแกรมหลักที่ใช้เขียนคือ Microsoft Visual Studio 2008 และได้ทดลองใช้อะไรใหม่ๆ (สำหรับคนเขียนนะคะ - -") หลายอย่าง
- OpenMP
- Intel ® Software Development Products
- Intel C++ Compiler
- VTune Analyzer
- Thread Checker
- Thread Profiler
- Windows Thread (Win32 API)
- (Intel ® Threading Building Blocks)
#__OpenMP__
API ที่ช่วยให้การเขียนโปรแกรมเชิงขนานเป็นเรื่องง่ายพอๆ กับปอกกล้วยเข้าปาก, ขณะนี้รองรับภาษา C/C++, Fortran และทำงานได้ในหลาย platform
ตัวจริงของ OpenMP เป็นคำสั่งในรูปแบบ compiler directive ที่ใช้ร่วมกับ environment variables ตัวอย่างเช่น
(ยกตัวอย่างของภาษา C/C++ ซึ่งจะขึ้นต้น directive ด้วย #pragma omp)
#pragma omp parallel
{
printf("Hello, Blognone!\n");
printf("Hello again!\n");
}
parallel contruct นั้นเอาไว้ระบุส่วนของโค้ดที่จะให้แต่ละ thread ที่เปิดทำเหมือนๆ กัน
ตอน compile, compiler จะอ่านค่าจาก environment variables ชื่อ OMP_NUM_THREADS ว่าต้องการให้เปิดกี่ thread และคลี่โค้ดให้กลายเป็นแต่ละ thread ทำโค้ดในบล็อก parallel เช่น OMP_NUM_THREADS=2 จะได้ 2 thread ที่ทำคำสั่งตั้งแต่บรรทัดที่ 3-4
#pragma omp parallel for
for(i=0;i<10;i++)
printf("Hello, Blognone! #%d\n", i);
for construct เอาไว้กระจายงานใน for ให้แต่ละ thread ทำเท่าๆ กัน สมมติเช่น OMP_NUM_THREADS=2
จะได้ว่า thread แรกทำรอบที่ i=0-4, อีก thread ทำรอบที่ i=5-9 เป็นต้น
อยากลองใช้แล้ว? เชิญเข้าไปที่
#__Intel (R) Software Development Products__
ชุดพัฒนาโปรแกรมเชิงขนานของอินเทล มีสำหรับหลาย platform ทั้ง Windows, MacOS, Linux -- ได้ยินว่าเวอร์ชันสำหรับ Linux นั้นฟรี (แต่ใช้ยากมากกก); แน่นอนว่าเวอร์ชันที่ได้ลองใช้คือเวอร์ชันสำหรับ Windows, เวอร์ชันนี้ฝังตัวกับ VS 2008 ได้แนบเนียนมาก (ราวกับเป็น Add-on) _<-- จริงๆ ก็เว่อร์ไปนิดค่ะ ที่เนียนๆ เห็นจะมีแต่ตัว Intel C++ Compiler แหะๆ_
สำหรับการอบรมนี้ได้ใช้แค่ 4 ตัว
- Intel C++ Compiler - ใช้ compile โค้ดที่เรียกใช้ OpenMP เนื่องจาก compiler ของ VS 2008 นั้นยังไม่รองรับ OpenMP (ใช้ flag /Qopenmp)
- VTune Analyzer - ใช้หาส่วนของโค้ดที่จะเอาไปทำ parallel ปรับปรุงประสิทธิภาพการทำงานได้, หาคอขวด
- Intel Thread Checker - หา deadlock และ race condition ที่จะเกิดขึ้นกับโปรแกรมเวอร์ชันขนานของเรา
- Intel Thread Profiler - วิเคราะห์ประสิทธิภาพการทำงานของโปรแกรมเวอร์ชันขนาน (แต่ละ thread เฉลี่ยงานกันได้พอเหมาะหรือยัง, งานไปกองอยู่ที่ thread ไหนมากไป ฯลฯ)
โดยส่วนตัวรู้สึกว่าเนื้อหาส่วนนี้น่าสนใจที่สุดค่ะ ^^ (แอบรู้สึกเหมือนได้เปิดหูเปิดตา)
นอกจาก tools ชุดนี้ อินเทลกำลังจะออก Intel Parallel Studio ที่เน้นสำหรับช่วยมือใหม่ให้เขียนโปรแกรมเชิงขนานได้ง่ายๆ (เข้าใจว่าเป็น Wizard กดๆ เอา) มี beta version ให้โหลดมาลองใช้ที่ http://software.intel.com/en-us/intel-sdp-home/
#__Windows Thread (Win32 API)__
อันนี้คงไม่พูดยาว เป็น API สำหรับเขียน multi-thread บน Windows, การใช้ก็คล้ายๆ กับ pthread มาก
#__Intel ® Threading Building Blocks__
เขียนล่อให้เข้ามาอ่านเฉยๆ ค่ะ ความจริงหัวข้อนี้ไม่ได้อบรม 555 (เพราะผลโหวตแพ้ Win32 API ..ฮือๆ)
#__ลิงก์สำหรับผู้สนใจการเขียน Parallel__
* Go-parallel.com
* วิดีโอจากอินเทล
#__ข่าวดีสำหรับบริษัทที่อยู่ใน Intel Software Partner Program:__
โครงการ **Accelerate Global Champion** ให้ส่ง project ที่พัฒนาโปรแกรมแบบเชิงขนานประกวดจากทั่วโลก ชิงเงินสนับสนุนทำ project ถึง $5000 และมีรางวัลรายเดือนเป็นเน็ตบุ๊ค สนใจอ่านรายละเอียดเพิ่มเติมได้ที่ http://intel-accelerate.com/eng/
___คุณจิรวิทย์ แม้ประสาท ผู้จัดการฝ่ายกลยุทธ์ บริษัทอินเทล ขณะแจ้งข่าวดี___

ชอบ OMP ครับ
sugarplz Sun, 03/22/2009 - 23:33
ชอบ OMP ครับ ง่ายและเร็ว หุหุ
ใช้vtuneวัดแล้วเห็นความแตกต่างชัดเจน
โอ้ นานๆ
pawinpawin Mon, 03/23/2009 - 00:05
โอ้ นานๆ ทีจะมีรายงานจากสุภาพสตรี ;)
_________________pawinpawin | blog
พอดีใช้โป
TAXZe Mon, 03/23/2009 - 01:23
พอดีใช้โปรแกรม เบิร์นเครื่องที่ซื้อมาใหม่ มันทำงานคอร์เดียวซะงั้น - -"
ก็คิดอยู่ น่าจะมีโปรแกรม ทำงาน หลายๆคอร์มาให้แน่ๆ
อิอิ
TAXZe.com|[T]echnology [A]dvise [X]-Ray [Z]ero [E]ffect
กำลังรออย
cloverink Mon, 03/23/2009 - 08:35
กำลังรออยู่เลยครับ ต่อไป ผมจาได้เอามาใช้ใน project ผมให้มันคำนวนได้เร็วขึ้น
กำลังสนใจ
natt_han Mon, 03/23/2009 - 11:02
กำลังสนใจอยากศึกษาอยู่ คิดว่ามันเริ่มจะจำเป็นแล้ว
นามสกุลคุ
somsak_sr Mon, 03/23/2009 - 11:16
นามสกุลคุณจิรวิทย์ผิดหรือเปล่าครับ? น่าจะเป็น "จิรวิทย์ แม้นประสาท"
ไม่แน่ใจเ
KaewGB Mon, 03/23/2009 - 18:36
In reply to นามสกุลคุ by somsak_sr
ไม่แน่ใจเหมือนกันค่ะ ในประกาศนียบัตรเห็นนามสกุลภาษาอังกฤษสะกดเป็น MAE เลยเขียนเป็น "แม้ประสาท"
..รอ @lewcpe มาตอบค่ะ ^^"
parallel contruct
oakyman Mon, 03/23/2009 - 12:50
ยังไม่ค่อยเข้าใจตรงนี้เท่าไหร่ครับ
Oakyman.com
ก็คือ ทุก
KaewGB Mon, 03/23/2009 - 18:19
In reply to parallel contruct by oakyman
ก็คือ ทุก thread ที่เปิดขึ้นมา จะทำโค้ดชุดที่อยู่ต่อจากบรรทัด parallel เหมือนกันหมดน่ะค่ะ :)
ส่วนคำว่า construct นั้นหมายถึง คำว่า parallel เป็น keyword ชนิด construct เฉยๆ (for ก็ด้วย)
ถ้าทุก Thread
oakyman Tue, 03/24/2009 - 16:23
In reply to ก็คือ ทุก by KaewGB
ถ้าทุก Thread ทำโค้ดตรงนั้นเหมือนกันหมด
มันจะมีประโยชน์อะไรเหรอครับ?
Oakyman.com
เผอิญตัวอ
javaboom Tue, 03/24/2009 - 19:50
In reply to ถ้าทุก Thread by oakyman
เผอิญตัวอย่างตรงนั้นคงต้องการแสดงแบบ simple สุดๆกระมังครับ
ประโยชน์ของมันอย่างเช่น thread ที่โค้ดเดียวกัน แต่ parameter ต่างกันครับ ประมาณ single code แต่ multiple data เช่น 2 thread เรนเดอร์ animation ความยาว 100 เฟรม ก็แบ่งกันคนละ 50 เฟรม โดยโค้ดเรนเดอร์เหมือนกันทุกประการ ตามอุดมคติ (ไม่มี overhead/bottleneck/latency) ก็ควรจะเร็วขึ้น 2 เท่า
My Blog / hi5 / Facebook / Follow me
ใช่เลยค่ะ
KaewGB Tue, 03/24/2009 - 21:28
In reply to ถ้าทุก Thread by oakyman
ใช่เลยค่ะ ตามที่คุณ @javaboom อธิบายทุกประการ ^^"
ขออภัยที่ยกตัวอย่างสิ้นคิดไปหน่อย dTvTb
พอดีว่าถ้ายกตัวอย่างที่ในแต่ละ thread มีตัวแปร local จะต้องพูดเรื่อง private clause
หรือถ้าให้แต่ละ thread ต่างก็บวกลบเลขกับตัวแปรชุดเดียวกัน (shared variable) ก็จะต้องขยายความเรื่อง lock ..เดี๋ยวจะยาวอะค่ะ
อุ้ย!
javaboom Tue, 03/24/2009 - 23:02
In reply to ใช่เลยค่ะ by KaewGB
อุ้ย! ขอประทานโทษอย่างสูงครับ ผมไม่ได้จะว่าอย่างนั้นนะครับคุณ KaewGB ไม่ใช่ตัวอย่างสิ้นคิดเลยครับ ถ้าผมเป็นวิทยากรผมก็คงโชว์ตัวอย่างนี้เป็นตัวอย่างแรกครับ ผมแค่หมายถึงตัวอย่างง่ายสุดๆจะได้อธิบาย concept ง่ายๆ แต่ถ้าจะเอาไปใช้งานจริงๆคงต้องไปศึกษาเองตามรายบุคคลครับ
ใช่ครับ synchronization เป็นเรื่องยาว(และน่าปวดหัว) ผมรอผลงานคุณ KaewGB เขียนเรื่อง synchronization กับ OpenMP อยู่นะครับ :)
My Blog / hi5 / Facebook / Follow me
ง่า..
KaewGB Wed, 03/25/2009 - 12:55
In reply to อุ้ย! by javaboom
ง่า.. เปล่าน้อยใจนะคะ ที่ว่าตัวอย่างสิ้นคิดไปหน่อยนี่คือความเห็นตัวเองอ่ะค่ะ 555
ตอนพิมพ์ก็ไม่รู้สึก พอมีคนมาทักแล้วเพิ่งรู้สึกว่าไม่ค่อยสื่อเท่าไหร่ (เป็นโรคเออออตามคนอื่นง่าย)
ถ้าสนใจเรื่อง sync. กันใน OpenMP เดี๋ยวไว้อีกสักพักจะมาขยายต่อค่ะ แต่ก็รู้ไม่มากเท่าไหร่นะคะ ตอนอบรมไม่ได้ลงลึก (เรียนแค่ atomic, critical section)
คุ้นๆนะ
HyBRiD Mon, 03/23/2009 - 13:45
คุ้นๆนะ เหมือนจะเคยเรียน
NERD GOD
คือ งงอะ
caznova Mon, 03/23/2009 - 19:47
คือ งงอะ ครับ
-"แน่นอนว่าเวอร์ชันที่ได้ลองใช้คือเวอร์ชันสำหรับ Windows, เวอร์ชันนี้ฝังตัวกับ VS 2008 ได้แนบเนียนมาก (ราวกับเป็น Add-on)
"
-"Intel C++ Compiler - ใช้ compile โค้ดที่เรียกใช้ OpenMP เนื่องจาก compiler ของ VS 2008 นั้นยังไม่รองรับ (ใช้ flag /Qopenmp) "
สรุปเป็น add-on ที่เนียนมากจนยังไม่รองรับเหรอคับ
หมายถึง
KaewGB Mon, 03/23/2009 - 20:00
In reply to คือ งงอะ by caznova
หมายถึง compiler ของ VS 2008 ยังไม่สามารถ compile OpenMP ได้น่ะค่ะ ^^"
คือเขียน OpenMP ใน VS 2008 แต่เลือกใช้ Intel C++ Compiler แทน compiler ของ VS 2008 อะค่ะ
//แก้เป็น "ยังไม่รองรับ OpenMP" แล้วค่ะ เพื่อความเคลียร์
จริงๆ vs2008
luckyman Wed, 03/25/2009 - 01:57
In reply to หมายถึง by KaewGB
จริงๆ vs2008 รองรับนะครับ ^^
openmp 2.0 ผ่าน flag /openmp แต่ต้องเป็นเวอร์ชัน professional ขึ้นไป
เอ..
aimakung Tue, 03/24/2009 - 07:14
เอ.. มันจะเหมือนกับ System.Threading ของ .NET รึเปล่าครับ
ผมเขียนด้วย C# อาจจะไม่เข้าใจคนใช้ C++ เท่าไหร่นัก - -"
OpenMP
wklk Tue, 03/24/2009 - 08:32
OpenMP มันจะง่ายไปมั้ยเนี่ย... :P
โห
AronSun Tue, 03/24/2009 - 16:56
โห น่าเรียนมากๆ
OpenMP ดูง่ายดีแฮะ แทรกไปบรรทัดเดียวจบละ
จะได้ฤกษ์
somsak_sr Tue, 03/24/2009 - 19:51
จะได้ฤกษ์ดังซักทีหรือยังน้อ OpenMP เห็นทั้งผลักทั้งดันทั้งเข็นกันหลายเจ้าเหลือเกิน คงเป็นเพราะหาอะไรดีกว่านี้ไม่ได้จริงๆ
จริงๆ
KaewGB Tue, 03/24/2009 - 21:36
จริงๆ อยากขยายความเรื่อง Intel (R) Software Development Products อีกหน่อยอะค่ะ เพราะน่าสนใจดี เป็นแนวๆ วิเคราะห์จากกราฟ ติดตรงที่ screenshot ที่ capture ไว้ตอนอบรมหายเกลี้ยงเนื่องจากก๊อบไฟล์ผิดพลาด เสียดายจัง (ตอนนี้เพิ่งมานึกได้ว่าเอารูปจากสไลด์ก็ได้ แต่ก็ไม่ว่างเขียนซะแล้ว)
ทำให้ผมนึ
haxpor Wed, 03/25/2009 - 03:27
ทำให้ผมนึกไปถึงความเป็นรากฐานที่แน่นและมั่นคงของ C/C++
มันก็ยังดีอยู่วันยังค่ำ แฮะๆๆ
ชื่อจริงๆคือ Intel® VTune™
hononbier Sat, 08/18/2012 - 11:07
ชื่อจริงๆคือ Intel® VTune™ Amplifier ไม่ใช่เหรอครับ ไม่ใช่ Analyzer
ตามเวป http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/