หลายครั้งในขณะนี้ฉันได้พบคำศัพท์นี้ใน matlab, fortran ... บางคน ... แต่ฉันไม่เคยพบคำอธิบายความหมายและสิ่งที่มันทำ? ผมเลยถามตรงนี้, เวกเตอร์คืออะไร, และมันมีความหมายว่าอะไร, ตัวอย่างเช่น "a loop is vectorized"?
หลายครั้งในขณะนี้ฉันได้พบคำศัพท์นี้ใน matlab, fortran ... บางคน ... แต่ฉันไม่เคยพบคำอธิบายความหมายและสิ่งที่มันทำ? ผมเลยถามตรงนี้, เวกเตอร์คืออะไร, และมันมีความหมายว่าอะไร, ตัวอย่างเช่น "a loop is vectorized"?
คำตอบ:
ซีพียูจำนวนมากมีชุดคำสั่ง "vector" หรือ "SIMD" ซึ่งใช้การดำเนินการเดียวกันพร้อมกันกับข้อมูลสอง, สี่หรือมากกว่า ชิพ x86 รุ่นใหม่มีคำสั่ง SSE ชิป PPC จำนวนมากมีคำสั่ง "Altivec" และแม้แต่ชิป ARM บางอันก็มีชุดคำสั่งเวกเตอร์เรียกว่า NEON
"Vectorization" (ลดความซับซ้อน) เป็นกระบวนการของการเขียนลูปใหม่ดังนั้นแทนที่จะประมวลผลองค์ประกอบเดียวของอาเรย์ N ครั้งมันประมวลผล (พูด) องค์ประกอบ 4 ของอาเรย์พร้อมกัน N / 4 ครั้ง
(ฉันเลือก 4 เพราะเป็นฮาร์ดแวร์ที่ทันสมัยที่สุดที่สนับสนุนโดยตรงมากที่สุดคำว่า "vectorization" ยังใช้เพื่ออธิบายการแปลงซอฟต์แวร์ระดับสูงขึ้นซึ่งคุณอาจแยกวงออกไปโดยสิ้นเชิงและอธิบายการทำงานบนอาร์เรย์แทนองค์ประกอบ ที่ประกอบด้วยพวกเขา)
ความแตกต่างระหว่างการทำให้เป็นเวกเตอร์และการวนซ้ำ: พิจารณาลูปอย่างง่าย ๆ ต่อไปนี้ซึ่งเพิ่มองค์ประกอบของสองอาร์เรย์และเก็บผลลัพธ์ไว้ในอาร์เรย์ที่สาม
for (int i=0; i<16; ++i)
C[i] = A[i] + B[i];
การยกเลิกการวนซ้ำนี้จะเปลี่ยนเป็นอะไรแบบนี้:
for (int i=0; i<16; i+=4) {
C[i] = A[i] + B[i];
C[i+1] = A[i+1] + B[i+1];
C[i+2] = A[i+2] + B[i+2];
C[i+3] = A[i+3] + B[i+3];
}
ในทางกลับกันการทำให้ Vectorizing เป็นเช่นนี้:
for (int i=0; i<16; i+=4)
addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);
โดยที่ "addFourThingsAtOnceAndStoreResult" เป็นตัวยึดตำแหน่งสำหรับสิ่งที่อยู่ภายในคอมไพเลอร์ของคุณใช้เพื่อระบุคำแนะนำเวกเตอร์ โปรดทราบว่าคอมไพเลอร์บางตัวสามารถปรับเวกเตอร์อัตโนมัติแบบวนซ้ำได้ง่ายเช่นนี้ซึ่งมักจะเปิดใช้งานผ่านตัวเลือกการคอมไพล์ อัลกอริทึมที่ซับซ้อนมากขึ้นยังต้องการความช่วยเหลือจากโปรแกรมเมอร์เพื่อสร้างรหัสเวกเตอร์ที่ดี
Vectorization เป็นคำสำหรับการแปลงโปรแกรมสเกลาร์ไปเป็นโปรแกรมเวกเตอร์ โปรแกรม Vectorized สามารถเรียกใช้การดำเนินการหลายอย่างจากคำสั่งเดียวในขณะที่สเกลาร์สามารถทำงานกับคู่ของตัวถูกดำเนินการในครั้งเดียวเท่านั้น
จากวิกิพีเดีย :
วิธีเกลา:
for (i = 0; i < 1024; i++)
{
C[i] = A[i]*B[i];
}
วิธีการ Vectorized:
for (i = 0; i < 1024; i+=4)
{
C[i:i+3] = A[i:i+3]*B[i:i+3];
}
มันหมายถึงความสามารถในการดำเนินการทางคณิตศาสตร์เดียวในรายการ - หรือ "เวกเตอร์" - ของตัวเลขในขั้นตอนเดียว คุณเห็นบ่อยครั้งกับ Fortran เพราะมันเกี่ยวข้องกับการคำนวณทางวิทยาศาสตร์ซึ่งเกี่ยวข้องกับการคำนวณแบบซูเปอร์ซึ่งการคำนวณทางคณิตศาสตร์แบบเวกเตอร์ปรากฏขึ้นครั้งแรก ทุกวันนี้ซีพียูเดสก์ท็อปเกือบทุกตัวเสนอการคำนวณแบบเวกเตอร์บางส่วนผ่านเทคโนโลยีเช่น SSE ของ Intel GPUs ยังเสนอรูปแบบของเวกเตอร์คณิตศาสตร์
Vectorizationถูกนำมาใช้อย่างมากในการคำนวณทางวิทยาศาสตร์ที่จำเป็นต้องประมวลผลข้อมูลจำนวนมากอย่างมีประสิทธิภาพ
ในแอปพลิเคชันการเขียนโปรแกรมจริงฉันรู้ว่ามันใช้ใน NUMPY (ไม่แน่ใจในสิ่งอื่น)
Numpy (แพ็คเกจสำหรับการคำนวณทางวิทยาศาสตร์ในไพ ธ อน) ใช้vectorizationสำหรับการจัดการอาเรย์ n-มิติอย่างรวดเร็วซึ่งโดยทั่วไปจะช้ากว่าหากทำด้วยตัวเลือกของไพ ธ อนในการสร้างอาเรย์
แม้ว่าตันของคำอธิบายออกมีนี่คือสิ่งที่vectorizationถูกกำหนดให้เป็นในNumPy เอกสารหน้า
Vectorization จะอธิบายถึงการขาดการวนซ้ำอย่างชัดเจนการจัดทำดัชนี ฯลฯ ในโค้ด - สิ่งเหล่านี้กำลังเกิดขึ้นแน่นอนว่า“ เบื้องหลัง” ในโค้ด C ที่ปรับแต่งล่วงหน้า รหัส Vectorized มีข้อดีหลายประการซึ่ง ได้แก่ :
รหัส vectorized กระชับและอ่านง่ายขึ้น
โดยทั่วไปบรรทัดที่น้อยลงหมายถึงข้อบกพร่องที่น้อยลง
รหัสใกล้เคียงกับสัญกรณ์คณิตศาสตร์มาตรฐานมากขึ้น (ทำให้ง่ายขึ้นโดยทั่วไปเพื่อสร้างรหัสทางคณิตศาสตร์ที่ถูกต้อง)
ผล vectorization ในรหัส“ Pythonic” เพิ่มเติม โค้ดของเราจะเกลื่อนไปด้วยลูปที่ไม่มีประสิทธิภาพและอ่านยากสำหรับลูป
Vectorization กล่าวง่ายๆว่าหมายถึงการปรับอัลกอริธึมให้เหมาะสมเพื่อให้สามารถใช้คำสั่ง SIMD ในโปรเซสเซอร์ได้
AVX, AVX2 และ AVX512 เป็นชุดคำสั่ง (intel) ที่ทำงานเหมือนกันกับข้อมูลจำนวนมากในหนึ่งคำสั่ง สำหรับเช่น AVX512 หมายถึงคุณสามารถดำเนินการกับค่าจำนวนเต็ม 16 ค่า (4 ไบต์) ในแต่ละครั้ง นั่นหมายความว่าถ้าคุณมีเวกเตอร์จำนวนเต็ม 16 ตัวและคุณต้องการเพิ่มค่านั้นเป็นสองเท่าในแต่ละจำนวนเต็มจากนั้นบวก 10 ลงไป คุณสามารถโหลดค่าลงในการลงทะเบียนทั่วไป [a, b, c] 16 ครั้งและทำการดำเนินการเดียวกันหรือคุณสามารถดำเนินการเดียวกันโดยโหลด 16 ค่าทั้งหมดลงในการลงทะเบียน SIMD [xmm, ymm] และดำเนินการหนึ่งครั้ง สิ่งนี้จะช่วยเพิ่มความเร็วในการคำนวณข้อมูลเวกเตอร์
ในการทำให้เป็น vectorization เราใช้สิ่งนี้เพื่อประโยชน์ของเราโดยการปรับปรุงข้อมูลของเราเพื่อให้เราสามารถดำเนินการกับ SIMD และเพิ่มความเร็วของโปรแกรม
ปัญหาเกี่ยวกับ vectorization เท่านั้นคือเงื่อนไขการจัดการ เนื่องจากเงื่อนไขแยกการไหลของการดำเนินการ สิ่งนี้สามารถจัดการได้โดยการปิดบัง โดยการสร้างแบบจำลองเงื่อนไขลงในการดำเนินการทางคณิตศาสตร์ เช่น. ถ้าเราต้องการเพิ่ม 10 ให้เป็นค่าถ้ามันมากกว่า 100 เราก็ทำได้
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
หรือเราสามารถสร้างโมเดลเงื่อนไขลงในการดำเนินการทางคณิตศาสตร์เพื่อสร้างเงื่อนไขเวกเตอร์ c
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
นี่เป็นตัวอย่างที่น่าสนใจมากแม้ว่า ... ดังนั้น c คือเวกเตอร์การปิดบังของเราซึ่งเราใช้เพื่อดำเนินการไบนารีตามค่าของมัน วิธีนี้หลีกเลี่ยงการแยกโฟลว์การประมวลผลและเปิดใช้งานการทำให้เป็นเวกเตอร์
Vectorization มีความสำคัญพอ ๆ กัน ดังนั้นเราควรใช้ให้มากที่สุด โปรเซสเซอร์ยุคใหม่ทั้งหมดมีคำแนะนำ SIMD สำหรับการคำนวณภาระงานหนัก เราสามารถเพิ่มประสิทธิภาพโค้ดของเราเพื่อใช้คำแนะนำ SIMD เหล่านี้โดยใช้ vectorization ซึ่งคล้ายกับการทำให้โค้ดของเราทำงานแบบขนานเพื่อให้ทำงานบนหลายคอร์ที่มีอยู่ในโปรเซสเซอร์ที่ทันสมัย
ฉันอยากจะออกไปพร้อมกับกล่าวถึง OpenMP ซึ่งจะช่วยให้คุณปรับเวกเตอร์โค้ดด้วย pragmas ได้ ฉันคิดว่ามันเป็นจุดเริ่มต้นที่ดี เดียวกันสามารถพูดได้สำหรับ OpenACC
โดยคน Intel ฉันคิดว่าเข้าใจง่าย
Vectorization เป็นกระบวนการของการแปลงอัลกอริทึมจากการดำเนินการกับค่าเดียวในแต่ละครั้งเพื่อดำเนินการกับชุดของค่าในครั้งเดียว CPU สมัยใหม่ให้การสนับสนุนโดยตรงสำหรับการทำงานของเวกเตอร์ที่มีการใช้คำสั่งเดียวกับหลายข้อมูล (SIMD)
ตัวอย่างเช่น CPU ที่มีการลงทะเบียน 512 บิตสามารถถือ 16 32- บิตความแม่นยำเดี่ยวคู่และทำการคำนวณเดียว
เร็วกว่าการรันคำสั่งครั้งละ 16 เท่า รวมสิ่งนี้เข้ากับเธรดและซีพียูแบบมัลติคอร์นำไปสู่คำสั่งของประสิทธิภาพที่เพิ่มขึ้น
ใน Java มีตัวเลือกสำหรับสิ่งนี้รวมอยู่ใน Jdk 15 ปี 2020 หรือล่าช้าที่ JDK 16 ที่ 2021
ดูคำตอบสองข้อด้านบน ฉันแค่อยากจะเพิ่มว่าเหตุผลที่ต้องการทำ vectorization คือการดำเนินการเหล่านี้สามารถทำได้อย่างง่ายดายในพาราเซลโดยซุปเปอร์คอมพิวเตอร์และโปรเซสเซอร์หลายตัวทำให้ได้รับประสิทธิภาพที่ยิ่งใหญ่ ในคอมพิวเตอร์ตัวประมวลผลเดียวจะไม่มีประสิทธิภาพเพิ่มขึ้น