คำสั่งเดียว ข้อมูลหลายชุด
| อนุกรมวิธานของฟลินน์ |
|---|
| สตรีมข้อมูลเดียว |
| สตรีมข้อมูลหลายรายการ |
| หมวดหมู่ย่อย SIMD [ 1 ] |
| ดูเพิ่มเติม |

การประมวลผล แบบขนานด้วยคำสั่งเดียวและข้อมูลหลายชุด ( SIMD ) เป็นรูปแบบหนึ่งของ การประมวลผล แบบขนานในระบบจำแนกประเภทของฟลินน์ SIMD อธิบายถึงคอมพิวเตอร์ที่มีหน่วยประมวลผลหลายตัวที่ดำเนินการเดียวกันกับข้อมูลหลายชุดพร้อมกัน SIMD อาจเป็นแบบภายใน (เป็นส่วนหนึ่งของการออกแบบฮาร์ดแวร์) หรือสามารถเข้าถึงได้โดยตรงผ่านสถาปัตยกรรมชุดคำสั่ง (ISA) แต่ไม่ควรสับสนกับ ISA
เครื่องจักรประเภทนี้ใช้ประโยชน์จากความขนานในระดับข้อมูลแต่ไม่ใช่การทำงานพร้อมกัน : มีการคำนวณพร้อมกัน (แบบขนาน) แต่แต่ละหน่วยจะดำเนินการคำสั่งเดียวกันทุกประการในแต่ละช่วงเวลา (เพียงแต่ใช้ข้อมูลที่แตกต่างกัน) ตัวอย่างง่ายๆ คือการบวกตัวเลขหลายๆ คู่เข้าด้วยกัน หน่วย SIMD ทั้งหมดจะทำการบวก แต่แต่ละหน่วยจะมีค่าที่แตกต่างกันที่จะบวกกัน SIMD เหมาะอย่างยิ่งสำหรับงานทั่วไป เช่น การปรับความคมชัดในภาพดิจิทัลหรือการปรับระดับเสียงของเสียงดิจิทัล การออกแบบ หน่วยประมวลผลกลาง (CPU) สมัยใหม่ส่วนใหญ่รวมคำสั่ง SIMD เพื่อปรับปรุงประสิทธิภาพ การใช้งาน มัลติมีเดียใน CPU รุ่นใหม่ๆ หน่วย SIMD จะเชื่อมโยงอย่างแน่นหนากับลำดับชั้นของแคชและกลไกการดึงข้อมูลล่วงหน้า ซึ่งช่วยลดความหน่วงแฝงระหว่างการดำเนินการบล็อกขนาดใหญ่ ตัวอย่างเช่น โปรเซสเซอร์ที่เปิดใช้งาน AVX-512 สามารถดึงข้อมูลแคชทั้งหมดล่วงหน้าและใช้การดำเนินการคูณและบวกแบบรวม (FMA) ในรอบ SIMD เดียว
ความสับสนระหว่าง SIMT และ SIMD

SIMD มีสามหมวดหมู่ย่อยที่แตกต่างกันในอนุกรมวิธานของฟลินน์ปี 1972หนึ่งในนั้นคือคำสั่งเดียว หลายเธรด (SIMT) SIMT ไม่ควรสับสนกับเธรดซอฟต์แวร์หรือเธรดฮาร์ดแวร์ซึ่งทั้งสองอย่างเป็นการแบ่งเวลาการทำงาน (time-slicing) SIMT คือการประมวลผลแบบขนานพร้อมกันในระดับฮาร์ดแวร์อย่างแท้จริง เช่นในILLIAC IV
SIMD ไม่ควรสับสนกับการประมวลผลแบบเวกเตอร์ซึ่งมีลักษณะเฉพาะโดยCray 1และได้รับการอธิบายอย่างชัดเจนในระบบจำแนกประเภทของ Duncanความ แตกต่างระหว่าง SIMD และโปรเซสเซอร์เวกเตอร์SET VECTOR LENGTH นั้นอยู่ที่การมี คำสั่ง แบบ Cray เป็นหลัก
ประวัติศาสตร์
การใช้งานSIMD ภายในรีจิสเตอร์ ที่เป็นที่รู้จักครั้งแรก คือในTX-2ในปี 1958 ซึ่งสามารถประมวลผลข้อมูล 36 บิต และประมวลผลข้อมูลย่อย 18 บิตสองครั้ง หรือข้อมูลย่อย 9 บิตสี่ครั้งได้
การนำคำสั่ง SIMD ไปใช้ในเชิงพาณิชย์ครั้งแรกเกิดขึ้นในคอมพิวเตอร์ILLIAC IVซึ่งพัฒนาเสร็จสมบูรณ์ในปี 1972
ซูเปอร์คอมพิวเตอร์แบบเวกเตอร์ในช่วงต้นทศวรรษ 1970 เช่นCDC Star-100และTexas Instruments ASCสามารถประมวลผล "เวกเตอร์" ของข้อมูลด้วยคำสั่งเดียว การประมวลผลแบบเวกเตอร์ได้รับความนิยมอย่างมากโดยCrayในช่วงทศวรรษ 1970 และ 1980 ปัจจุบันสถาปัตยกรรมการประมวลผลแบบเวกเตอร์ถือว่าแยกต่างหากจากคอมพิวเตอร์ SIMD: การจำแนกประเภทของ Duncanรวมไว้ด้วย ในขณะที่การจำแนกประเภทของ Flynnไม่รวมไว้ เนื่องจากงานของ Flynn (1966, 1972) มาก่อนCray-1 (1977) อย่างไรก็ตาม ความซับซ้อนของโปรเซสเซอร์แบบเวกเตอร์ได้เป็นแรงบันดาลใจให้เกิดการจัดเรียงที่เรียบง่ายกว่าที่เรียกว่าSIMD ภายในรีจิสเตอร์
ยุคแรกของคอมพิวเตอร์ SIMD สมัยใหม่นั้นมีลักษณะเฉพาะคือซูเปอร์คอมพิวเตอร์แบบประมวลผลขนานขนาดใหญ่เช่นThinking Machines Connection Machine CM-1 และ CM-2 คอมพิวเตอร์เหล่านี้มีโปรเซสเซอร์ที่มีฟังก์ชันการทำงานจำกัดจำนวนมากที่สามารถทำงานแบบขนานได้ ตัวอย่างเช่น โปรเซสเซอร์บิตเดี่ยว 65,536 ตัวใน Thinking Machines CM-2 แต่ละตัวจะดำเนินการคำสั่งเดียวกันในเวลาเดียวกัน ทำให้สามารถรวมบิต 65,536 คู่ในเชิงตรรกะได้ในคราวเดียว โดยใช้เครือข่ายที่เชื่อมต่อด้วยไฮเปอร์คิวบ์หรือ RAM เฉพาะโปรเซสเซอร์เพื่อค้นหาตัวดำเนินการ ซูเปอร์คอมพิวเตอร์ได้เปลี่ยนไปจากแนวทาง SIMD เมื่อแนวทางแบบสเกลาร์หลายคำสั่งหลายข้อมูล (MIMD) ราคาไม่แพงซึ่งใช้โปรเซสเซอร์ทั่วไป เช่นIntel i860 XPมีประสิทธิภาพมากขึ้น และความสนใจใน SIMD ก็ลดลง[ 3 ]
ยุคปัจจุบันของโปรเซสเซอร์ SIMD เติบโตมาจากตลาดคอมพิวเตอร์เดสก์ท็อปมากกว่าตลาดซูเปอร์คอมพิวเตอร์ เมื่อโปรเซสเซอร์เดสก์ท็อปมีประสิทธิภาพมากพอที่จะรองรับการเล่นเกมแบบเรียลไทม์และการประมวลผลเสียง/วิดีโอในช่วงทศวรรษ 1990 ความต้องการพลังการประมวลผลประเภทนี้ก็เพิ่มขึ้น และผู้ผลิตไมโครโปรเซสเซอร์ก็หันมาใช้ SIMD เพื่อตอบสนองความต้องการ[ 4 ]การฟื้นตัวนี้ยังเกิดขึ้นพร้อมกับการเพิ่มขึ้นของ โมเดล shader ของ DirectXและ OpenGL ซึ่งใช้ SIMD อย่างมากอยู่เบื้องหลัง API กราฟิกกระตุ้นให้โปรแกรมเมอร์นำรูปแบบการเขียนโปรแกรมแบบขนานข้อมูลมาใช้ ซึ่งเร่งการนำ SIMD มาใช้ในซอฟต์แวร์เดสก์ท็อปทางอ้อม Hewlett-Packard ได้นำ คำสั่ง Multimedia Acceleration eXtensions (MAX) มาใช้ใน เดสก์ท็อป PA-RISC 1.1 ในปี 1994 เพื่อเร่งการถอดรหัส MPEG [ 5 ] Sun Microsystems ได้นำคำสั่งจำนวนเต็ม SIMD มาใช้ในส่วนขยายชุดคำสั่ง " VIS " ในปี 1995 ใน ไมโครโปรเซสเซอร์ UltraSPARC I MIPS ก็ทำตามด้วยระบบ MDMX ที่คล้ายกัน
SIMD บนเดสก์ท็อปที่ใช้งานอย่างแพร่หลายครั้งแรกคือ ส่วนขยาย MMX ของ Intel สำหรับ สถาปัตยกรรม x86ในปี 1996 ซึ่งกระตุ้นให้เกิดการนำ ระบบ AltiVec ที่ทรงพลังกว่ามากมาใช้ ในระบบMotorola PowerPCและ ระบบ POWER ของ IBM Intel ตอบโต้ในปี 1999 โดยการนำระบบ SSEใหม่ทั้งหมดมาใช้ตั้งแต่นั้นมาก็มีส่วนขยายหลายอย่างสำหรับชุดคำสั่ง SIMD สำหรับทั้งสองสถาปัตยกรรม ส่วนขยายเวกเตอร์ขั้นสูง AVX, AVX2และAVX-512ได้รับการพัฒนาโดย Intel AMD รองรับ AVX, AVX2และAVX-512ในผลิตภัณฑ์ปัจจุบันของตน[ 6 ]
ข้อเสีย
ด้วย SIMD การเพิ่มขนาดโค้ดขึ้นหนึ่งลำดับขนาดไม่ใช่เรื่องแปลก เมื่อเปรียบเทียบกับโค้ดสเกลาร์หรือโค้ดเวกเตอร์ที่เทียบเท่ากัน และประสิทธิภาพ (งานที่ทำต่อคำสั่ง) หนึ่งลำดับขนาดหรือมากกว่านั้นสามารถทำได้ด้วย Vector ISA [ 7 ]
ส่วนขยายเวกเตอร์แบบปรับขนาดได้ของ ARM ใช้แนวทางที่แตกต่างออกไป ซึ่งในอนุกรมวิธานของฟลินน์ หรือที่รู้จักกันทั่วไปในปัจจุบันว่า SIMD แบบ "มีเงื่อนไข" (หรือแบบมีหน้ากาก)แนวทางนี้ไม่กะทัดรัดเท่ากับการประมวลผลเวกเตอร์แต่ก็ยังดีกว่า SIMD ที่ไม่มีเงื่อนไขมาก ตัวอย่างเปรียบเทียบโดยละเอียดมีอยู่ในโปรเซสเซอร์เวกเตอร์ § ตัวอย่างคำสั่งเวกเตอร์
ลำดับเหตุการณ์
| ปี | ตัวอย่าง |
|---|---|
| พ.ศ. 2517 | ILLIAC IV - โปรเซสเซอร์แบบอาร์เรย์ที่ประกอบด้วยหน่วยประมวลผลเชิงตัวเลข (PE) ขนาด 64 บิต |
| พ.ศ. 2517 | ตัวประมวลผลอาร์เรย์แบบกระจายของ ICL (DAP) |
| พ.ศ. 2519 | เครื่องประมวลผลวิทยาศาสตร์เบอร์โรห์ส |
| 1981 | โปรเซสเซอร์แบบขนานเชิงเรขาคณิตและเลขคณิตจากMartin Marietta (พัฒนาต่อที่Lockheed Martinจากนั้นที่TeranexและSilicon Optix ) |
| พ.ศ. 2526–2534 | หน่วยประมวลผลแบบขนานขนาดใหญ่ (MPP) จากNASA / ศูนย์การบินอวกาศก็อดดาร์ด |
| พ.ศ. 2528 | เครื่องเชื่อมต่อข้อมูล (Connection Machine)รุ่นที่ 1 และ 2 (CM-1 และ CM-2) จากบริษัท Thinking Machines Corporation |
| พ.ศ. 2530–2539 | MasPar MP-1 และ MP-2 |
| 1991 | Zephyr DC จาก Wavetracer |
| 2001 | Xplor จาก Pyxsys, Inc. |
ฮาร์ดแวร์
ซีพียู
คำสั่ง SIMD ขนาดเล็ก (64 หรือ 128 บิต) ได้รับความนิยมในซีพียูอเนกประสงค์ในช่วงต้นทศวรรษ 1990 และต่อเนื่องมาจนถึงปี 1997 และต่อมาด้วยคำสั่ง Motion Video Instructions (MVI) สำหรับAlphaคำสั่ง SIMD สามารถพบได้ในระดับหนึ่งในซีพียูส่วนใหญ่ รวมถึงAltiVecและ Signal Processing Engine (SPE) ของIBM สำหรับ PowerPC , Multimedia Acceleration eXtensions (MAX) ของHewlett-Packard ( HP), MMX และ iwMMXtของIntel , Streaming SIMD Extensions (SSE), SSE2 , SSE3, SSSE3และSSE4.x , 3DNow ! ของ AMD , ARC Video subsystem, VISและ VIS2 ของSPARC , MAJCของSun , เทคโนโลยีNeon ของ ARM , MDMX (MaDMaX) ของMIPSและMIPS- 3D
คำสั่ง AVX-512 SIMD ของ Intel ประมวลผลข้อมูล 512 บิตพร้อมกัน
โคโปรเซสเซอร์
ชุดคำสั่ง ของ Synergistic Processing Element (SPE) ในโปรเซสเซอร์ Cell ซึ่งพัฒนาร่วมกันโดย IBM, Sony และ Toshiba นั้นใช้ SIMD เป็นหลัก
GPU บางส่วน แต่ไม่ใช่ทั้งหมด ใช้ SIMD GPU ของ AMD ตั้งแต่TeraScale (สถาปัตยกรรมไมโคร)ใช้ SIMD ซึ่งเป็นคุณสมบัติที่ยังคงอยู่ในสถาปัตยกรรมไมโคร RDNA และ CDNA ในช่วงปี 2020 [ 8 ]โดยมีเลเยอร์ของคำสั่งเดียว หลายเธรด (SIMT) อยู่ด้านบน[ 9 ]ในทางกลับกัน สถาปัตยกรรม CUDA ของ Nvidia ใช้คอร์แบบสเกลาร์ร่วมกับ SIMT [ 10 ]
บริษัท Philipsซึ่งปัจจุบันคือNXPได้พัฒนาโปรเซสเซอร์ SIMD หลายรุ่นภายใต้ชื่อXetal โดย Xetal มีองค์ประกอบประมวลผล 16 บิต จำนวน 320 ตัว ซึ่งออกแบบมาเป็นพิเศษสำหรับงานด้านการประมวลผลภาพ
ชิป M1 และ M2 ของ Apple ยังรวมเอาหน่วยประมวลผล SIMD ที่ผสานรวมอย่างลึกซึ้งกับ GPU และ Neural Engine โดยใช้ไปป์ไลน์ SIMD ที่ออกแบบโดย Apple ซึ่งได้รับการปรับให้เหมาะสมสำหรับการกรองภาพ การคำนวณคอนโวลูชัน และการคูณเมทริกซ์ สถาปัตยกรรมหน่วยความจำแบบรวมนี้ช่วยให้คำสั่ง SIMD ทำงานบนพูลหน่วยความจำที่ใช้ร่วมกันได้อย่างมีประสิทธิภาพมากขึ้น (ส่วน CPU ใช้ NEON ทั่วไป)
ซอฟต์แวร์


คำสั่ง SIMD ถูกใช้กันอย่างแพร่หลายในการประมวลผลกราฟิก 3 มิติ แม้ว่าการ์ดกราฟิก สมัยใหม่ ที่มี SIMD ฝังตัวจะเข้ามาทำหน้าที่นี้แทน CPU เป็นส่วนใหญ่แล้วก็ตาม บางระบบยังรวมถึงฟังก์ชัน permute ที่จัดเรียงองค์ประกอบใหม่ภายในเวกเตอร์ ทำให้มีประโยชน์อย่างยิ่งสำหรับการประมวลผลและการบีบอัดข้อมูล นอกจากนี้ยังใช้ในการเข้ารหัสลับอีกด้วย[ 11 ] [ 12 ] [ 13 ]แนวโน้มของการประมวลผลทั่วไปบน GPU ( GPGPU ) อาจนำไปสู่การใช้งาน SIMD ที่กว้างขวางมากขึ้นในอนาคต คอมไพเลอร์รุ่นใหม่ เช่นLLVM , GNU Compiler Collection (GCC) และ ICC ของ Intel มีตัวเลือก auto-vectoring ที่มีประสิทธิภาพ นักพัฒนาสามารถเปิดใช้งานสิ่งเหล่านี้ได้ด้วยแฟล็กเช่น-O3หรือ-ftree-vectorizeซึ่งจะแนะนำคอมไพเลอร์ให้ปรับโครงสร้างลูปเพื่อให้เข้ากันได้กับ SIMD
การนำระบบ SIMD มาใช้ใน ซอฟต์แวร์ คอมพิวเตอร์ส่วนบุคคลในช่วงแรกเป็นไปอย่างช้าๆ เนื่องจากปัญหาหลายประการ หนึ่งในนั้นคือ ชุดคำสั่ง SIMD รุ่นแรกๆ จำนวนมากมักทำให้ประสิทธิภาพโดยรวมของระบบช้าลงเนื่องจากการนำรีจิสเตอร์จุดลอยตัวที่มีอยู่มาใช้ซ้ำ ระบบอื่นๆ เช่นMMXและ3DNow!ให้การสนับสนุนชนิดข้อมูลที่ไม่น่าสนใจสำหรับผู้ใช้ส่วนใหญ่ และมีคำสั่งสลับบริบทที่สิ้นเปลืองในการสลับระหว่างการใช้FPUและรีจิสเตอร์ MMX นอกจากนี้ คอมไพเลอร์มักขาดการสนับสนุน ทำให้โปรแกรมเมอร์ต้องหันไปใช้การเขียนโค้ด ภาษาแอสเซมบ ลี
SIMD บนx86เริ่มต้นอย่างช้าๆ การเปิดตัว3DNow!โดยAMDและSSEโดยIntelทำให้เกิดความสับสนขึ้นบ้าง แต่ในปัจจุบันระบบดูเหมือนจะเข้าที่เข้าทางแล้ว (หลังจากที่ AMD นำ SSE มาใช้) และคอมไพเลอร์รุ่นใหม่น่าจะทำให้ซอฟต์แวร์ที่ใช้ SIMD เพิ่มมากขึ้น ปัจจุบันทั้ง Intel และ AMD ต่างก็มีไลบรารี ทางคณิตศาสตร์ที่ปรับให้เหมาะสม ซึ่งใช้คำสั่ง SIMD และทางเลือกแบบโอเพนซอร์ส เช่นlibSIMD , SIMDx86และSLEEFก็เริ่มปรากฏขึ้น (ดูlibm ด้วย ) [ 14 ]
บริษัท Apple Computerประสบความสำเร็จมากกว่าบริษัทอื่นๆ แม้ว่าจะเข้าสู่ตลาด SIMD ช้ากว่าบริษัทอื่นๆ ก็ตามAltiVecเป็นระบบที่มีฟังก์ชันการทำงานครบครัน และสามารถตั้งโปรแกรมได้โดยใช้คอมไพเลอร์ที่ซับซ้อนมากขึ้นจากMotorola , IBMและGNUดังนั้นจึงไม่ค่อยจำเป็นต้องใช้ภาษาแอสเซมบลี นอกจากนี้ ระบบหลายระบบที่ได้รับประโยชน์จาก SIMD ก็มาจาก Apple เอง เช่นiTunesและQuickTimeอย่างไรก็ตาม ในปี 2549 คอมพิวเตอร์ Apple ได้เปลี่ยนไปใช้โปรเซสเซอร์ Intel x86 APIและเครื่องมือพัฒนา ของ Apple ( XCode ) ได้รับการปรับปรุงเพื่อรองรับSSE2และSSE3รวมถึง AltiVec ด้วย Apple เป็นผู้ซื้อชิป PowerPC จาก IBM และFreescale Semiconductor รายใหญ่ แม้ว่า Apple จะหยุดใช้โปรเซสเซอร์ PowerPC ในผลิตภัณฑ์ของตนแล้ว แต่การพัฒนา AltiVec ยังคงดำเนินต่อไปในดีไซน์ PowerPC และPower ISA หลายแบบ จาก Freescale และ IBM
SIMD ภายในรีจิสเตอร์หรือSWARคือเทคนิคและกลเม็ดต่างๆ ที่ใช้ในการดำเนินการ SIMD ในรีจิสเตอร์อเนกประสงค์บนฮาร์ดแวร์ที่ไม่รองรับคำสั่ง SIMD โดยตรง ซึ่งสามารถนำไปใช้เพื่อเพิ่มประสิทธิภาพการทำงานแบบขนานในอัลกอริทึมบางอย่างได้ แม้บนฮาร์ดแวร์ที่ไม่รองรับ SIMD โดยตรงก็ตาม
ส่วนต่อประสานโปรแกรมเมอร์
เป็นเรื่องปกติที่ผู้พัฒนาชุดคำสั่ง SIMD จะสร้างส่วนขยายภาษาCและC++ ของตนเอง โดยมี ฟังก์ชันภายในหรือชนิดข้อมูลพิเศษ (พร้อมการโอเวอร์โหลดตัวดำเนินการ ) เพื่อรับประกันการสร้างโค้ดเวกเตอร์ Intel, AltiVec และ ARM NEON มีส่วนขยายที่คอมไพเลอร์ซึ่งมุ่งเป้าไปที่ซีพียูของตนนำไปใช้อย่างกว้างขวาง (การดำเนินการที่ซับซ้อนกว่านั้นเป็นหน้าที่ของไลบรารีคณิตศาสตร์เวกเตอร์)
ประเภทข้อมูลทั่วไป
คอมไพเลอร์ GNU Cนำส่วนขยายไปอีกขั้นโดยแยกส่วนออกเป็นอินเทอร์เฟซสากลที่สามารถใช้งานได้บนแพลตฟอร์มใดก็ได้โดยการจัดหาวิธีการกำหนดชนิดข้อมูล SIMD [ 15 ] คอมไพเลอร์ LLVM Clangก็ใช้คุณสมบัตินี้เช่นกัน โดยมีอินเทอร์เฟซที่คล้ายคลึงกันซึ่งกำหนดไว้ใน IR [ 16 ] crate ของ Rust (และแบบทดลอง) ใช้อินเทอร์เฟซนี้ เช่นเดียวกับSwift 2.0+ packed_simdstd::simd
C++ มีอินเทอร์เฟซทดลองstd::experimental::simdที่ทำงานคล้ายกับส่วนขยาย GCC ดูเหมือนว่า libcxx ของ LLVM จะนำไปใช้ สำหรับ GCC และ libstdc++ มีไลบรารี wrapper ที่สร้างขึ้นบนส่วนขยาย GCC [ 17 ]
Microsoftเพิ่ม SIMD ลงใน.NETใน RyuJIT [ 18 ]แพ็กSystem.Numerics.Vectorเกจที่มีให้ใช้งานบน NuGet จะใช้ประเภทข้อมูล SIMD [ 19 ] Java ยังมี API ที่เสนอใหม่สำหรับคำสั่ง SIMD ที่มีให้ใช้งานในOpenJDK 17 ในโมดูลบ่มเพาะ[ 20 ]นอกจากนี้ยังมีกลไกการสำรองที่ปลอดภัยสำหรับ CPU ที่ไม่รองรับไปยังลูปแบบง่าย
คำแนะนำเกี่ยวกับการแปลงเป็นเวกเตอร์
แทนที่จะจัดเตรียมชนิดข้อมูล SIMD คอมไพเลอร์ยังสามารถได้รับคำแนะนำให้ทำการเวกเตอร์ลูปบางส่วนโดยอัตโนมัติ ซึ่งอาจมีการตรวจสอบบางอย่างเกี่ยวกับการขาดการพึ่งพาข้อมูล วิธีนี้ไม่ยืดหยุ่นเท่ากับการจัดการตัวแปร SIMD โดยตรง แต่ใช้งานง่ายกว่าOpenMP 4.0+ มี#pragma omp simdคำแนะนำ[ 21 ]อินเทอร์เฟซ OpenMP นี้ได้เข้ามาแทนที่ส่วนขยายที่ไม่เป็นมาตรฐานจำนวนมาก รวมถึงของ Cilk [ 22 ]#pragma simdของGCC และอื่นๆ อีกมากมาย[ 23 ]#pragma GCC ivdep
"SIMD everywhere" ซึ่งเป็นชุดส่วนหัว C/C++ ที่ใช้อินทรินซิกเฉพาะแพลตฟอร์มสำหรับแพลตฟอร์มอื่น (เช่น อินทรินซิก SSE สำหรับ ARM NEON) ประกอบด้วยการใช้อินทรินซิกเฉพาะแพลตฟอร์ม อินเทอร์เฟซเวกเตอร์ทั่วไป และคำแนะนำเวกเตอร์ สามารถใช้เป็น "Rosetta Stone" สำหรับเปรียบเทียบกระบวนทัศน์การเขียนโปรแกรม SIMD ที่แตกต่างกันเหล่านี้ได้[ 24 ]
SPMD บน SIMD
อีกแนวทางหนึ่งคือSPMD : เขียนโปรแกรมที่ดูเหมือนว่าจะทำงานเพียงองค์ประกอบเดียวในแต่ละครั้ง จากนั้นให้คอมไพเลอร์ขยายให้ตรงกับความกว้างของเวกเตอร์ SIMD นี่คือแนวทางที่ใช้โดยshaders กราฟิก และเพิ่งนำมาใช้โดยเครื่องมือที่เน้น CPU เช่น Intel IPSC [ 25 ]
การกำหนดเวอร์ชันหลายแบบของ SIMD
โดยทั่วไปแล้ว ซอฟต์แวร์สำหรับผู้บริโภคจะต้องทำงานได้บนซีพียูหลายรุ่น ซึ่งอาจจำกัดความสามารถของโปรแกรมเมอร์ในการใช้คำสั่ง SIMD ใหม่เพื่อปรับปรุงประสิทธิภาพการคำนวณของโปรแกรม วิธีแก้ปัญหาคือการรวมโค้ดเวอร์ชันต่างๆ ที่ใช้เทคโนโลยี SIMD ทั้งรุ่นเก่าและรุ่นใหม่ แล้วเลือกเวอร์ชันที่เหมาะสมกับซีพียูของผู้ใช้มากที่สุดในขณะรันไทม์ ( การเลือกใช้แบบไดนามิก ) มีวิธีการแก้ปัญหาหลักๆ สองแนวทาง:
- การสร้างฟังก์ชันหลายเวอร์ชัน (FMV): ซับรูทีนในโปรแกรมหรือไลบรารีจะถูกทำซ้ำและคอมไพล์สำหรับส่วนขยายชุดคำสั่งหลายแบบ และโปรแกรมจะตัดสินใจว่าจะใช้เวอร์ชันใดในขณะรันไทม์
- การกำหนดเวอร์ชันไลบรารีหลายเวอร์ชัน (LMV): ไลบรารีการเขียนโปรแกรม ทั้งหมด จะถูกทำซ้ำสำหรับส่วนขยายชุดคำสั่งจำนวนมาก และระบบปฏิบัติการหรือโปรแกรมจะเป็นผู้ตัดสินใจว่าจะโหลดเวอร์ชันใดในระหว่างการทำงาน
FMV ซึ่งเขียนโค้ดด้วยตนเองในภาษาแอสเซมบลี มักใช้กันทั่วไปในไลบรารีที่ต้องการประสิทธิภาพสูงหลายแห่ง เช่น glibc และ libjpeg-turbo คอมไพเลอร์ Intel C++ , GNU Compiler Collectionตั้งแต่ GCC 6 และClangตั้งแต่ clang 7 อนุญาตให้ใช้วิธีการที่ง่ายขึ้น โดยคอมไพเลอร์จะดูแลการทำซ้ำและการเลือกฟังก์ชัน GCC และ clang ต้องการtarget_clonesป้ายกำกับที่ชัดเจนในโค้ดเพื่อ "โคลน" ฟังก์ชัน[ 26 ]ในขณะที่ ICC ทำเช่นนั้นโดยอัตโนมัติ (ภายใต้ตัวเลือกบรรทัดคำสั่ง/Qax) ภาษาโปรแกรม Rustก็รองรับ FMV เช่นกัน การตั้งค่าคล้ายกับ GCC และ Clang ตรงที่โค้ดกำหนดชุดคำสั่งที่จะคอมไพล์ แต่การโคลนทำด้วยตนเองผ่านการอินไลน์[ 27 ]
เนื่องจากการใช้ FMV จำเป็นต้องมีการแก้ไขโค้ดบน GCC และ Clang ผู้จำหน่ายจึงมักใช้การกำหนดเวอร์ชันหลายไลบรารีมากกว่า ซึ่งทำได้ง่ายกว่าเพราะต้องเปลี่ยนเฉพาะสวิตช์คอมไพเลอร์เท่านั้นGlibcรองรับ LMV และฟังก์ชันนี้ได้รับการนำไปใช้โดยโครงการ Clear Linux ที่ได้รับการสนับสนุนจาก Intel [ 28 ]
SIMD บนเว็บ
ในปี 2013 John McCutchan ประกาศว่าเขาได้สร้างอินเทอร์เฟซประสิทธิภาพสูงสำหรับชุดคำสั่ง SIMD สำหรับ ภาษาการเขียนโปรแกรม Dartซึ่งนำประโยชน์ของ SIMD มาสู่โปรแกรมเว็บเป็นครั้งแรก อินเทอร์เฟซประกอบด้วยสองประเภท: [ 29 ]
- Float32x4, ค่าทศลอยความแม่นยำเดี่ยว 4 ค่า
- Int32x4, ค่าจำนวนเต็ม 32 บิต 4 ค่า
อินสแตนซ์ของประเภทเหล่านี้ไม่สามารถเปลี่ยนแปลงได้ และในโค้ดที่ได้รับการปรับแต่งแล้ว จะถูกแมปโดยตรงไปยังรีจิสเตอร์ SIMD การดำเนินการที่แสดงใน Dart โดยทั่วไปจะถูกคอมไพล์เป็นคำสั่งเดียวโดยไม่มีค่าใช้จ่ายเพิ่มเติม ซึ่งคล้ายกับฟังก์ชันภายในของ C และ C++ การทดสอบประสิทธิภาพสำหรับการคูณเมทริกซ์4×4 การแปลงจุดยอด 3 มิติและ การแสดงภาพ เซต Mandelbrotแสดงให้เห็นถึงความเร็วที่เพิ่มขึ้นเกือบ 400% เมื่อเทียบกับโค้ดสเกลาร์ที่เขียนใน Dart
Intel ประกาศในงาน IDF 2013 ว่าพวกเขากำลังดำเนินการตามข้อกำหนดของ McCutchan สำหรับทั้งV8 และ SpiderMonkey [ 30 ]อย่างไรก็ตามในปี 2017 SIMD.jsถูกถอนออกจาก คิวมาตรฐาน ECMAScriptเพื่อหันไปใช้อินเทอร์เฟซที่คล้ายกันในWebAssemblyแทน[ 31 ]
การสนับสนุน SIMD ถูกเพิ่มเข้าไปใน ข้อกำหนด WebAssembly 2.0 ซึ่งเสร็จสมบูรณ์ในปี 2022 และกลายเป็นทางการในเดือนธันวาคม 2024 [ 32 ]การ autovectoring ของ LLVM เมื่อคอมไพล์ C หรือ C++ เป็น WebAssembly สามารถกำหนดเป้าหมายไปที่ WebAssembly SIMD เพื่อใช้ SIMD โดยอัตโนมัติ ในขณะที่ SIMD intrinsic ก็มีให้ใช้งานเช่นกัน[ 33 ]
การใช้งานเชิงพาณิชย์
โดยทั่วไปแล้ว การค้นหาแอปพลิเคชันเชิงพาณิชย์ที่ยั่งยืนสำหรับโปรเซสเซอร์ SIMD เพียงอย่างเดียวในการประมวลผลทั่วไปนั้นพิสูจน์แล้วว่าเป็นเรื่องยาก
หนึ่งในเทคโนโลยีที่ประสบความสำเร็จในระดับหนึ่งคือGAPPซึ่งพัฒนาโดยLockheed Martinและนำไปใช้ในเชิงพาณิชย์โดยTeranex ซึ่งเป็นบริษัทใน เครือ GAPP รุ่นล่าสุดได้กลายเป็นเครื่องมือที่มีประสิทธิภาพใน แอปพลิเคชัน การประมวลผลวิดีโอ แบบเรียลไทม์ เช่น การแปลงระหว่างมาตรฐานวิดีโอและอัตราเฟรมต่างๆ ( NTSCเป็น/จากPAL , NTSC เป็น/จาก รูปแบบ โทรทัศน์ความละเอียดสูง (HDTV) เป็นต้น) การลด การแทรกสลับเฟรมการลดสัญญาณรบกวนในภาพ การ บีบอัดวิดีโอแบบปรับได้และการปรับปรุงคุณภาพของภาพ
การประยุกต์ใช้ SIMD ที่พบได้ทั่วไปมากขึ้นคือในวิดีโอเกม : เกือบทุกเครื่องเล่นเกมคอนโซล สมัยใหม่ ตั้งแต่ปี 1998 เป็นต้น มาได้รวมเอาโปรเซสเซอร์ SIMD ไว้ในสถาปัตยกรรมของมันPlayStation 2 นั้น มีความพิเศษตรงที่หน่วยประมวลผลเวกเตอร์-โฟลตตัวหนึ่งสามารถทำงานเป็นโปรเซสเซอร์ประมวลผลสัญญาณดิจิทัล (DSP) แบบอิสระ โดยประมวลผลคำสั่งของตัวเอง หรือทำงานเป็นโคโปรเซสเซอร์ที่ขับเคลื่อนด้วยคำสั่ง CPU ทั่วไป แอปพลิเคชันกราฟิก 3 มิติมีแนวโน้มที่จะเหมาะกับการประมวลผล SIMD เนื่องจากต้องอาศัยการดำเนินการกับเวกเตอร์ 4 มิติเป็นอย่างมากDirect3D 9.0 ของMicrosoftในปัจจุบันเลือกใช้การดำเนินการทางคณิตศาสตร์เฉพาะโปรเซสเซอร์ในขณะทำงาน รวมถึงการใช้คำสั่งที่รองรับ SIMD ด้วย
โปรเซสเซอร์รุ่นต่อมาที่ใช้การประมวลผลแบบเวกเตอร์คือโปรเซสเซอร์ Cellที่ใช้ใน PlayStation 3 ซึ่งพัฒนาโดยIBMร่วมกับToshibaและSonyมันใช้โปรเซสเซอร์ SIMD จำนวนมาก ( สถาปัตยกรรม หน่วยความจำแบบเข้าถึงไม่สม่ำเสมอ (NUMA) โดยแต่ละตัวมีหน่วยเก็บข้อมูลภายในที่ เป็นอิสระ และควบคุมโดย CPU อเนกประสงค์) และมุ่งเน้นไปที่ชุดข้อมูลขนาดใหญ่ที่จำเป็นสำหรับแอปพลิเคชันการประมวลผล 3 มิติและวิดีโอ มันแตกต่างจาก ISA แบบดั้งเดิมตรงที่เป็น SIMD ตั้งแต่เริ่มต้นโดยไม่มีรีจิสเตอร์สเกลาร์แยกต่างหาก
Ziilabs ผลิตโปรเซสเซอร์ประเภท SIMD สำหรับใช้ในอุปกรณ์เคลื่อนที่ เช่น เครื่องเล่นสื่อและโทรศัพท์มือถือ[ 34 ]
โปรเซสเซอร์ SIMD ขนาดใหญ่สำหรับใช้งานเชิงพาณิชย์มีจำหน่ายจาก ClearSpeed Technology, Ltd. และ Stream Processors, Inc. CSX600 (ปี 2004) ของ ClearSpeed มี 96 คอร์ แต่ละคอร์มีหน่วยประมวลผลทศลอยแบบความแม่นยำสองเท่าสองหน่วย ในขณะที่ CSX700 (ปี 2008) มี 192 คอร์ Stream Processors นำโดยสถาปนิกคอมพิวเตอร์Bill Dallyโปรเซสเซอร์ Storm-1 (ปี 2007) ของพวกเขามี 80 คอร์ SIMD ที่ควบคุมโดยซีพียู MIPS
ดูเพิ่มเติม
- ส่วนขยาย SIMD สำหรับการสตรีมมิ่ง , MMX , SSE2 , SSE3 , ส่วนขยายเวกเตอร์ขั้นสูง , AVX-512
- สถาปัตยกรรมชุดคำสั่ง
- อนุกรมวิธานของฟลินน์
- SIMD ภายในรีจิสเตอร์ ( SWAR )
- โปรแกรมเดียว ข้อมูลหลายชุด (SPMD)
- โอเพ่นซีแอล
ลิงก์ภายนอก
- สถาปัตยกรรม SIMD (2000)
- แกะกล่องเพนเทียม 3 (1999)
- ส่วนขยายเวกเตอร์สั้นในไมโครโปรเซสเซอร์เชิงพาณิชย์
- บทความเกี่ยวกับการเพิ่มประสิทธิภาพกระบวนการเรนเดอร์โมเดลแอนิเมชันโดยใช้ Intel Streaming SIMD Extensions
- "เย้!": ไลบรารี SIMD แบบโอเพนซอร์สที่ใช้งานได้หลายแพลตฟอร์มจาก Georgia Tech
- บทนำเกี่ยวกับการประมวลผลแบบขนาน จากห้องปฏิบัติการแห่งชาติลอว์เรนซ์ลิเวอร์มอร์ (LLNL) เก็บถาวรเมื่อวันที่ 10 มิถุนายน 2013 ที่Wayback Machine