Tags:
Node Thumbnail

อีกไม่นาน 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

ข่าวดีสำหรับบริษัทที่อยู่ใน Intel Software Partner Program:

โครงการ Accelerate Global Champion ให้ส่ง project ที่พัฒนาโปรแกรมแบบเชิงขนานประกวดจากทั่วโลก ชิงเงินสนับสนุนทำ project ถึง $5000 และมีรางวัลรายเดือนเป็นเน็ตบุ๊ค สนใจอ่านรายละเอียดเพิ่มเติมได้ที่ http://intel-accelerate.com/eng/

คุณจิรวิทย์ แม้ประสาท ผู้จัดการฝ่ายกลยุทธ์ บริษัทอินเทล ขณะแจ้งข่าวดี
ข่าวดี

Get latest news from Blognone

Comments

By: sugarplz
AndroidUbuntuWindows
on 22 March 2009 - 23:33 #92291

ชอบ OMP ครับ ง่ายและเร็ว หุหุ

ใช้vtuneวัดแล้วเห็นความแตกต่างชัดเจน

By: pawinpawin
Writer
on 23 March 2009 - 00:05 #92299

โอ้ นานๆ ทีจะมีรายงานจากสุภาพสตรี ;)

_________________pawinpawin | blog

By: TAXZe
iPhoneAndroidUbuntuWindows
on 23 March 2009 - 01:23 #92315

พอดีใช้โปรแกรม เบิร์นเครื่องที่ซื้อมาใหม่ มันทำงานคอร์เดียวซะงั้น - -"

ก็คิดอยู่ น่าจะมีโปรแกรม ทำงาน หลายๆคอร์มาให้แน่ๆ

อิอิ

TAXZe.com|[T]echnology [A]dvise [X]-Ray [Z]ero [E]ffect

By: cloverink
iPhoneAndroidUbuntuWindows
on 23 March 2009 - 08:35 #92330
cloverink's picture

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

By: natt_han
ContributoriPhoneAndroid
on 23 March 2009 - 11:02 #92364

กำลังสนใจอยากศึกษาอยู่ คิดว่ามันเริ่มจะจำเป็นแล้ว

By: somsak_sr
ContributorAndroidUbuntu
on 23 March 2009 - 11:16 #92370
somsak_sr's picture

นามสกุลคุณจิรวิทย์ผิดหรือเปล่าครับ? น่าจะเป็น "จิรวิทย์ แม้นประสาท"

By: KaewGB
Contributor
on 23 March 2009 - 18:36 #92427 Reply to:92370
KaewGB's picture

ไม่แน่ใจเหมือนกันค่ะ ในประกาศนียบัตรเห็นนามสกุลภาษาอังกฤษสะกดเป็น MAE เลยเขียนเป็น "แม้ประสาท"

..รอ @lewcpe มาตอบค่ะ ^^"

By: oakyman
ContributorAndroid
on 23 March 2009 - 12:50 #92389

parallel contruct นั้นเอาไว้ระบุส่วนของโค้ดที่จะให้แต่ละ thread ที่เปิดทำเหมือนๆ กัน

ยังไม่ค่อยเข้าใจตรงนี้เท่าไหร่ครับ

Oakyman.com

By: KaewGB
Contributor
on 23 March 2009 - 18:19 #92424 Reply to:92389
KaewGB's picture

ก็คือ ทุก thread ที่เปิดขึ้นมา จะทำโค้ดชุดที่อยู่ต่อจากบรรทัด parallel เหมือนกันหมดน่ะค่ะ :)

ส่วนคำว่า construct นั้นหมายถึง คำว่า parallel เป็น keyword ชนิด construct เฉยๆ (for ก็ด้วย)

By: oakyman
ContributorAndroid
on 24 March 2009 - 16:23 #92619 Reply to:92424

ถ้าทุก Thread ทำโค้ดตรงนั้นเหมือนกันหมด
มันจะมีประโยชน์อะไรเหรอครับ?

Oakyman.com

By: javaboom
WriteriPhone
on 24 March 2009 - 19:50 #92686 Reply to:92619
javaboom's picture

เผอิญตัวอย่างตรงนั้นคงต้องการแสดงแบบ simple สุดๆกระมังครับ

ประโยชน์ของมันอย่างเช่น thread ที่โค้ดเดียวกัน แต่ parameter ต่างกันครับ ประมาณ​ single code แต่ multiple data เช่น 2 thread เรนเดอร์ animation ความยาว 100 เฟรม ก็แบ่งกันคนละ 50 เฟรม โดยโค้ดเรนเดอร์เหมือนกันทุกประการ ตามอุดมคติ (ไม่มี overhead/bottleneck/latency) ก็ควรจะเร็วขึ้น 2 เท่า

My Blog / hi5 / Facebook / Follow me


My Blog

By: KaewGB
Contributor
on 24 March 2009 - 21:28 #92700 Reply to:92619
KaewGB's picture

ใช่เลยค่ะ ตามที่คุณ @javaboom อธิบายทุกประการ ^^"

ขออภัยที่ยกตัวอย่างสิ้นคิดไปหน่อย dTvTb

พอดีว่าถ้ายกตัวอย่างที่ในแต่ละ thread มีตัวแปร local จะต้องพูดเรื่อง private clause

หรือถ้าให้แต่ละ thread ต่างก็บวกลบเลขกับตัวแปรชุดเดียวกัน (shared variable) ก็จะต้องขยายความเรื่อง lock ..เดี๋ยวจะยาวอะค่ะ

By: javaboom
WriteriPhone
on 24 March 2009 - 23:02 #92722 Reply to:92700
javaboom's picture

อุ้ย! ขอประทานโทษอย่างสูงครับ ผมไม่ได้จะว่าอย่างนั้นนะครับคุณ KaewGB ไม่ใช่ตัวอย่างสิ้นคิดเลยครับ ถ้าผมเป็นวิทยากรผมก็คงโชว์ตัวอย่างนี้เป็นตัวอย่างแรกครับ ผมแค่หมายถึงตัวอย่างง่ายสุดๆจะได้อธิบาย concept ง่ายๆ แต่ถ้าจะเอาไปใช้งานจริงๆคงต้องไปศึกษาเองตามรายบุคคลครับ

ใช่ครับ synchronization เป็นเรื่องยาว(และน่าปวดหัว) ผมรอผลงานคุณ KaewGB เขียนเรื่อง synchronization กับ OpenMP อยู่นะครับ :)

My Blog / hi5 / Facebook / Follow me


My Blog

By: KaewGB
Contributor
on 25 March 2009 - 12:55 #92815 Reply to:92722
KaewGB's picture

ง่า.. เปล่าน้อยใจนะคะ ที่ว่าตัวอย่างสิ้นคิดไปหน่อยนี่คือความเห็นตัวเองอ่ะค่ะ 555

ตอนพิมพ์ก็ไม่รู้สึก พอมีคนมาทักแล้วเพิ่งรู้สึกว่าไม่ค่อยสื่อเท่าไหร่ (เป็นโรคเออออตามคนอื่นง่าย)

ถ้าสนใจเรื่อง sync. กันใน OpenMP เดี๋ยวไว้อีกสักพักจะมาขยายต่อค่ะ แต่ก็รู้ไม่มากเท่าไหร่นะคะ ตอนอบรมไม่ได้ลงลึก (เรียนแค่ atomic, critical section)

By: HyBRiD
ContributoriPhoneSymbianUbuntu
on 23 March 2009 - 13:45 #92393
HyBRiD's picture

คุ้นๆนะ เหมือนจะเคยเรียน

NERD GOD

By: caznova
AndroidRed HatUbuntuWindows
on 23 March 2009 - 19:47 #92440
caznova's picture

คือ งงอะ ครับ
-"แน่นอนว่าเวอร์ชันที่ได้ลองใช้คือเวอร์ชันสำหรับ Windows, เวอร์ชันนี้ฝังตัวกับ VS 2008 ได้แนบเนียนมาก (ราวกับเป็น Add-on)
"
-"Intel C++ Compiler - ใช้ compile โค้ดที่เรียกใช้ OpenMP เนื่องจาก compiler ของ VS 2008 นั้นยังไม่รองรับ (ใช้ flag /Qopenmp) "

สรุปเป็น add-on ที่เนียนมากจนยังไม่รองรับเหรอคับ

By: KaewGB
Contributor
on 23 March 2009 - 20:00 #92444 Reply to:92440
KaewGB's picture

หมายถึง compiler ของ VS 2008 ยังไม่สามารถ compile OpenMP ได้น่ะค่ะ ^^"

คือเขียน OpenMP ใน VS 2008 แต่เลือกใช้ Intel C++ Compiler แทน compiler ของ VS 2008 อะค่ะ

//แก้เป็น "ยังไม่รองรับ OpenMP" แล้วค่ะ เพื่อความเคลียร์

By: luckyman
ContributoriPhoneAndroidRed Hat
on 25 March 2009 - 01:57 #92756 Reply to:92444

จริงๆ vs2008 รองรับนะครับ ^^

openmp 2.0 ผ่าน flag /openmp แต่ต้องเป็นเวอร์ชัน professional ขึ้นไป

By: aimakung
AndroidUbuntuWindowsIn Love
on 24 March 2009 - 07:14 #92496

เอ.. มันจะเหมือนกับ System.Threading ของ .NET รึเปล่าครับ
ผมเขียนด้วย C# อาจจะไม่เข้าใจคนใช้ C++ เท่าไหร่นัก - -"

By: wklk
ContributorAndroid
on 24 March 2009 - 08:32 #92501

OpenMP มันจะง่ายไปมั้ยเนี่ย... :P

By: AronSun
Windows PhoneAndroidWindows
on 24 March 2009 - 16:56 #92637

โห น่าเรียนมากๆ
OpenMP ดูง่ายดีแฮะ แทรกไปบรรทัดเดียวจบละ

By: somsak_sr
ContributorAndroidUbuntu
on 24 March 2009 - 19:51 #92687
somsak_sr's picture

จะได้ฤกษ์ดังซักทีหรือยังน้อ OpenMP เห็นทั้งผลักทั้งดันทั้งเข็นกันหลายเจ้าเหลือเกิน คงเป็นเพราะหาอะไรดีกว่านี้ไม่ได้จริงๆ

By: KaewGB
Contributor
on 24 March 2009 - 21:36 #92702
KaewGB's picture

จริงๆ อยากขยายความเรื่อง Intel (R) Software Development Products อีกหน่อยอะค่ะ เพราะน่าสนใจดี เป็นแนวๆ วิเคราะห์จากกราฟ ติดตรงที่ screenshot ที่ capture ไว้ตอนอบรมหายเกลี้ยงเนื่องจากก๊อบไฟล์ผิดพลาด เสียดายจัง (ตอนนี้เพิ่งมานึกได้ว่าเอารูปจากสไลด์ก็ได้ แต่ก็ไม่ว่างเขียนซะแล้ว)

By: haxpor on 25 March 2009 - 03:27 #92765

ทำให้ผมนึกไปถึงความเป็นรากฐานที่แน่นและมั่นคงของ C/C++
มันก็ยังดีอยู่วันยังค่ำ แฮะๆๆ

By: hononbier
iPhoneAndroidWindows
on 18 August 2012 - 11:07 #459537

ชื่อจริงๆคือ Intel® VTune™ Amplifier ไม่ใช่เหรอครับ ไม่ใช่ Analyzer

ตามเวป http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/