รีวิว Intel Multi-core Programming Workshop

tags:

อีกไม่นาน CPU ที่มีเพียง core เดียวก็จะหยุดวางจำหน่าย -- Multi-core CPU กำลังจะยึดครองโลก! -- เหตุผลแค่นี้ก็เพียงพอแล้วที่จะทำให้โปรแกรมเมอร์ต้องหันมาเขียนโปรแกรมเชิงขนานกันอย่างจริงจัง

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

<br/>
อ.ดร.วรวรรณ มะเริงสิทธิ์ ขณะบรรยายเรื่อง Windows Thread
บรรยากาศการอบรม

<br/>
การอบรมเป็นไปแบบสบายๆ ใช้ความรู้พื้นฐานด้าน 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)

<br/>

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 เป็นต้น

อยากลองใช้แล้ว? เชิญเข้าไปที่

<br/>

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/

<br/>

Windows Thread (Win32 API)

อันนี้คงไม่พูดยาว เป็น API สำหรับเขียน multi-thread บน Windows, การใช้ก็คล้ายๆ กับ pthread มาก

<br/>

Intel ® Threading Building Blocks

เขียนล่อให้เข้ามาอ่านเฉยๆ ค่ะ ความจริงหัวข้อนี้ไม่ได้อบรม 555 (เพราะผลโหวตแพ้ Win32 API ..ฮือๆ)

<br/>

ลิงก์สำหรับผู้สนใจการเขียน Parallel

<br/>


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

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

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

sugarplz's picture

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

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

pawinpawin's picture

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


_________________
pawinpawin | blog

TAXZe's picture

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

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

อิอิ


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

cloverink's picture

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

natt_han's picture

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

somsak_sr's picture

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

KaewGB's picture

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

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

oakyman's picture

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

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


Oakyman.com

KaewGB's picture

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

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

oakyman's picture

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


Oakyman.com

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

KaewGB's picture

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

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

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

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

javaboom's picture

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

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

My Blog / hi5 / Facebook / Follow me

KaewGB's picture

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

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

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

HyBRiD's picture

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


NERD GOD

caznova's picture

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

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

KaewGB's picture

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

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

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

luckyman's picture

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

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

aimakung's picture

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

wklk's picture

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

AronSun's picture

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

somsak_sr's picture

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

KaewGB's picture

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

haxpor's picture

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