อัลกอริธึมในการเขียนโปรแกรมส่วนใดที่เป็นปัญหาสำคัญจริง ๆ


15

บางครั้งฉันได้ยินคนพูดว่าเนื่องจากความเร็วของโปรเซสเซอร์และจำนวนหน่วยความจำที่มีอยู่ประสิทธิภาพของอัลกอริทึมและรันไทม์ไม่ได้เป็นประเด็นหลัก

แต่ฉันคิดว่ายังมีหลายพื้นที่ที่การพิจารณาดังกล่าวยังคงมีความสำคัญยิ่ง สองสิ่งที่อยู่ในใจคือการซื้อขายอัลกอริธึมโดยที่ธุรกรรมหลายพันรายการจะต้องดำเนินการในเสี้ยววินาทีและการเขียนโปรแกรมระบบฝังตัวซึ่งหน่วยความจำและพลังงานมักจะหายาก ฉันพูดถูกเกี่ยวกับตัวอย่างเหล่านี้ใช่ไหม และพื้นที่อื่น ๆ จะเป็นตัวอย่างได้อย่างไร


1
ผู้ทำลาย LMAX อาจสนใจคุณ: infoq.com/presentations/LMAX

"การค้าอัลกอริทึม" เป็นตัวอย่างที่ไม่ดี อัลกอริทึมมักจะไม่ค่อยสำคัญ ประสิทธิภาพความหน่วงแฝงต่ำโดยรวมนั้นเป็นเรื่องของทรัพยากรเฉพาะมากกว่าการออกแบบอัลกอริทึมที่ชาญฉลาด
S.Lott

6
ความซับซ้อนสำคัญกว่าทรัพยากรฮาร์ดแวร์เสมอขนาดของข้อมูลเพิ่มขึ้น O(n*log(n))อัลกอริทึมจะเสร็จสิ้นได้เร็วขึ้นในคอมพิวเตอร์เครื่องเก่า 30 ปีกว่าO(n!)หรือO(n*n)บนฮาร์ดแวร์ราคาแพงที่สุดของวันนี้ถ้าnเป็นขนาดใหญ่พอ
vsz

1
คุณสามารถคิดได้ว่าO(c * f(n))ที่ไหนที่ค่าคงที่cจะขึ้นอยู่กับความไม่มีประสิทธิภาพของฮาร์ดแวร์ คุณสามารถมีระบบที่เร็วกว่า 1,000 เท่าเช่นเดียวnกับอินฟินิตี้มันจะมีความสำคัญน้อยลงเรื่อย ๆ ฉันจะเลือกO(10000 * log(n))แทนO(n)วันใดวันหนึ่งหากฉันสงสัยว่าnอาจมีขนาดใหญ่
vsz

คุณอาจสนใจทำไม Why Performance Matters
Theraot

คำตอบ:


14

ความเร็วเป็นที่ต้องการเสมอ ฉันเดาว่าคุณถูกต้อง นี่คือตัวอย่างบางส่วนที่อัลกอริธึมเป็นที่ต้องการ:

  1. การอ่านรหัส

  2. กำลังค้นหาฐานข้อมูลขนาดใหญ่

  3. การเรียงลำดับและการรวม

  4. การค้นหาข้อความ (ไม่ได้จัดทำดัชนี) รวมถึงอักขระตัวแทน

  5. ปัญหาทางคณิตศาสตร์กับการคำนวณอย่างเข้มข้น

  6. การจำลอง

  7. การประยุกต์ใช้การขุดข้อมูล

  8. นิเมชั่น

  9. AI

  10. วิสัยทัศน์คอมพิวเตอร์


2
ฉันต้องการจะเพิ่มแอปพลิเคชัน "สำคัญยิ่งต่อชีวิต" เช่นอุปกรณ์การแพทย์
stuartmclark

@ Stuartmclark คุณค่อนข้างถูกต้อง ฉันลืมพูดถึงระบบควบคุมอัตโนมัติและระบบนำทางด้วย!
NoChance

2
ความเร็วนั้นไม่เกี่ยวข้องอย่างมากใน crypto เว้นแต่ว่าคุณกำลังพยายามถอดรหัสรหัสผ่าน ฉันจะใส่ "ฐานข้อมูลขนาดใหญ่" ก่อน ปริมาณข้อมูลที่มีอยู่บนอินเทอร์เน็ตกำลังส่าย อัลกอริทึมข้อมูลขนาดใหญ่โง่สามารถฆ่าความคิดที่ดีโดยทำให้ดูเหมือนเป็นไปไม่ได้
S.Lott

4
@ S.Lott ความเร็วมีความเกี่ยวข้องอย่างยิ่ง เว็บไซต์ที่ให้บริการการร้องขอ SSL หลายพันรายการต่อวินาทีจะทำให้หายใจไม่ออกหากอัลกอริทึมการเข้ารหัสลับไม่ได้รับการปรับให้เหมาะสมเพียงพอ บางคนถึงกับใช้การเร่งด้วยฮาร์ดแวร์
SK-logic

@ SK-logic: แม้ว่าจะเป็นจริง แต่การพิจารณาแบบอัลกอริทึมก็ไม่เหมือนกันกับที่อื่น ๆ การประมวลผล crypto ส่วนใหญ่มีอัลกอริธึมที่ค่อนข้างง่ายพร้อมการเพิ่มประสิทธิภาพที่ชาญฉลาดจำนวนมากเพื่อลด "การคำนวณ" ไปยังการค้นหาตารางและการเล่น bit-fiddling ฉันคิดว่านี่เป็น "อัลกอริทึม" แต่ crypto ดูเหมือนว่าจะมีการเพิ่มประสิทธิภาพที่ชาญฉลาดกว่าการออกแบบอัลกอริทึมเสมอ นั่นเป็นเหตุผลที่ผมขอแนะนำว่ามันไม่ได้เป็นครั้งแรก
S.Lott

7

มีบางกรณีที่เวลาทำงานของอัลกอริทึมอาจไม่ใช่เรื่องใหญ่เพราะเราได้มาถึงจุดที่คุณสามารถเจาะอัลกอริทึมที่ใช้งานได้นานกว่าด้วยฮาร์ดแวร์ที่มีประสิทธิภาพยิ่งขึ้น แต่มีบางสถานที่ที่จำเป็นต้องเร่งความเร็ว

โดยทั่วไปการพูดอะไรก็ตามที่ใช้ชุดข้อมูลขนาดใหญ่จะเป็นปัญหา เมื่อคุณมีบางสิ่งบางอย่างที่ไม่ดีกับ n และจากนั้นคุณทำนาจำนวนมากจริง ๆ คุณมีปัญหา ฉันสงสัยว่าถ้าคุณไปที่ไซต์เบต้าการคำนวณทางวิทยาศาสตร์และโผล่ไปรอบ ๆ สักเล็กน้อยคุณจะพบปัญหามากมายที่ต้องการอัลกอริทึมที่ดีกว่าและเร็วกว่า บางพื้นที่ที่ฉันพบ:

  • การวิเคราะห์ทางสถิติที่ซับซ้อนโดยเฉพาะอย่างยิ่ง การรวมกันของอัลกอริทึมที่ไม่มีประสิทธิภาพและชุดข้อมูลขนาดใหญ่อาจหมายถึงการชะลอตัวครั้งใหญ่ สำหรับการศึกษาบางอย่างสิ่งนี้อาจไม่สำคัญ แต่ถ้าคุณพยายามทำบางสิ่งด้วยการหมุนอย่างรวดเร็ว "มันจะหลุดจากเซิร์ฟเวอร์ภายในหนึ่งเดือน" อาจเป็นสิ่งที่ไม่ดีเมื่อคุณใช้ระบบเฝ้าระวังสารเคมี / นิวเคลียร์ / ชีวภาพ
  • การขุดข้อมูลบนชุดข้อมูลขนาดใหญ่
  • แบบจำลองที่เกี่ยวข้องกับตัวแปรมากมาย

โดยทั่วไปการคำนวณทางวิทยาศาสตร์โดยทั่วไปดูเหมือนจะเป็นพื้นที่ที่ความซับซ้อนของสิ่งที่โปรแกรมถูกสร้างขึ้นสำหรับโอกาสในการชะลอตัวลงอย่างรุนแรงหากอัลกอริทึมของคุณจะซบเซา และอย่างที่คุณพูดมีแอพพลิเคชั่นทางการเงิน เมื่อมิลลิวินาทีสามารถกำหนดได้ว่าคุณทำหรือสูญเสียเงินในการค้าอัลกอริทึม "ดีพอ" จะไม่ลดลงหากมีสิ่งที่ดีกว่าที่สามารถทำได้


4

บางครั้งฉันได้ยินคนพูดว่าเนื่องจากความเร็วของโปรเซสเซอร์และจำนวนหน่วยความจำที่มีอยู่ประสิทธิภาพของอัลกอริทึมและรันไทม์ไม่ได้เป็นประเด็นหลัก

เอาไปด้วยเม็ดเกลือ โดยทั่วไปพลังในการประมวลผลมากขึ้นก็หมายความว่า n ของคุณสามารถมีขนาดใหญ่ขึ้นก่อนที่มันจะช้าลงอย่างมาก สำหรับปัญหาประจำวันส่วนใหญ่ตอนนี้ n มีขนาดใหญ่พอที่คุณไม่จำเป็นต้องดูแล อย่างไรก็ตามคุณยังควรทราบความซับซ้อนของอัลกอริทึมของคุณ

ด้วยทรัพยากรที่มีอยู่มากขึ้นมันอาจจะต้องการข้อมูลเพิ่มเติมในภายหลัง วันนี้คุณต้องวิเคราะห์ไฟล์บันทึก 10MB ด้วย 100,000 บรรทัด ในหนึ่งปีคุณอาจมีไฟล์บันทึก 100GB ด้วย 1,000,000,000 บรรทัด หากจำนวนข้อมูลเติบโตเร็วกว่าพลังทรัพยากรคุณพบปัญหาในภายหลัง

ด้วยทรัพยากรที่มีอยู่มากขึ้นเลเยอร์มากขึ้นจะซ้อนกัน OS, กรอบงาน OS, กรอบงานของบุคคลที่สาม, ล่ามภาษาและท้ายที่สุดเป็นเครื่องมือของคุณเอง ความไร้ประสิทธิภาพที่ไม่จำเป็นทั้งหมดในชั้นต่าง ๆ ทั้งหมดทวีคูณขึ้น พรุ่งนี้เครื่องมือของคุณอาจทำงานบนระบบปฏิบัติการใหม่ที่มีระฆังและเสียงนกหวีดมากขึ้นซึ่งกินรอบและหน่วยความจำมากขึ้นทำให้คุณมีน้อยลง

ดังนั้นเพื่อตอบคำถามของคุณคุณยังต้องดูแลว่าจะต้องมีการบีบอัดข้อมูลมากขึ้น (ตัวอย่างที่เพียงพอในคำตอบอื่น ๆ ) และที่คุณไม่ได้ให้เครื่องมือขั้นสุดท้าย แต่เป็นเลเยอร์นามธรรมสำหรับเครื่องมืออื่น


4

ไม่กี่ปีที่ผ่านมาฉันต้องเขียนอัลกอริทึมที่จัดเรียงหลอดทดลองที่จัดเรียงไว้บนnชั้นวางออกเป็นสองพาร์ติชันที่แตกต่าง: เช่นหนึ่งเซ็ตย่อยของหลอดถูก 'เลือก' และที่เหลือเป็น 'ไม่ได้เลือก' และผลลัพธ์สุดท้ายก็คือ จะมีทั้งท่อที่ 'เลือก' และ 'ไม่ได้เลือก' ไว้ในนั้น (มีข้อกำหนดพิเศษบางประการเช่นการบีบอัด) แต่ละชั้นมีสูงสุด 100 หลอด

อัลกอริทึมนี้จะใช้ในการขับเคลื่อนหุ่นยนต์คัดแยกท่อในห้องปฏิบัติการเภสัชกรรม

เมื่อกำหนดสเปคดั้งเดิมให้ฉันฉันได้รับการจัดสรรในภูมิภาคของเวลาการคำนวณ 1 นาทีเพื่อจัดเรียงประมาณ 2,000 หลอดเพราะเราคิดว่าการใช้งานอย่างชาญฉลาดที่ไม่เจ็บปวดเกินไป มีความต้องการก็คือว่าจำนวนของการเคลื่อนไหวจะเป็นน้อยกว่าชุดที่เป็นไปได้ทั้งหมดเป็นหุ่นยนต์ตัวเองได้ช้า

ข้อสันนิษฐานโดยนัยก็คือความซับซ้อนจะเป็นเลขยกกำลังที่มีจำนวนหลอด อย่างไรก็ตามในขณะที่ทำงานกับการออกแบบอัลกอริทึมฉันค้นพบว่ามีO(n)อัลกอริทึมที่รวดเร็วซึ่งnมีจำนวนชั้นวางที่ดำเนินการแบ่งพาร์ทิชันที่เหมาะสมของหลอด ผลที่ได้คือเวลาเรียงลำดับอัลกอริทึมเป็นแบบทันทีดังนั้นการเรียงลำดับการแสดงจะได้รับการอัพเดตแบบเรียลไทม์เมื่อผู้ใช้กำหนดค่าการดำเนินการเรียงลำดับ

สำหรับฉันความแตกต่างระหว่างผู้ใช้ที่นั่งเป็นเวลาหนึ่งนาทีหลังจากการเปลี่ยนแปลงทุกครั้งและการมี GUI ที่ตอบสนองได้ทันทีคือความแตกต่างระหว่างชิ้นส่วนของซอฟต์แวร์ที่ใช้งานได้เพียงพอและชิ้นส่วนของซอฟต์แวร์ที่ยินดีใช้


เป็นตัวอย่างที่ดี! ดูเหมือนว่าคุณจะทำอะไรที่คล้ายกับการจัดเรียงแบบ Radix หรือไม่?
Barry Brown

@BarryBrown - ไม่แน่ใจว่าชื่อของอัลกอริทึมที่ฉันใช้คืออะไรเมื่อฉันสร้างมันขึ้นมาเอง เป็นหลักมันเรียงสองรายการพร้อมกันกับการแข่งขัน ดังนั้นแต่ละชั้นสามารถปรากฏในรายการ "เลือก" หรือ "ไม่เลือก" และค่าใช้จ่ายของมันอยู่ในรายการนั้นคือค่าใช้จ่ายในการลบหลอดทั้งหมดที่ผิดกฎหมาย

3

พื้นที่อื่น ๆ รวมถึงการประมวลผลสัญญาณเรียลไทม์หลายชนิดระบบควบคุมการตอบรับการแยกแยะการสำรวจน้ำมันการบีบอัดวิดีโอการติดตามเรย์และการฉายเฟรมภาพยนตร์ระบบเสมือนจริงเกมที่อัตราเฟรมสูงอาจเป็นข้อได้เปรียบในการแข่งขันที่สำคัญ แอพอุปกรณ์มือถือที่ซีพียูจำนวนมากจะใช้งานแบตเตอรีของผู้ใช้เร็วขึ้น

ฉันค่อนข้างประหลาดใจที่คำถามนี้จะถูกถามเพราะสำหรับซูเปอร์คอมพิวเตอร์ 500 เครื่องแรก ๆ ที่เคยสร้างมามีแนวโน้มที่จะมีรายชื่อนักวิจัยที่รอคอยมากที่สุดและต้องการให้ขนาดคำนวณพลังงานหรือขนาดอัลกอริธึมที่ดีกว่าเพื่อแก้ปัญหาบางอย่าง (พับโปรตีนบางส่วนเพื่อถอดรหัสมะเร็ง ฯลฯ ) ก่อนที่จะเกษียณ


1
ปัญหาอายุการใช้งานแบตเตอรี่ (หรือการใช้พลังงานโดยทั่วไป) มีความสำคัญในวันนี้ (6 ปีหลังจากคำตอบนี้โพสต์) บริษัท ของฉันมีตัวชี้วัดพลังงานเฉพาะที่เราคาดว่าจะเข้าถึงในแอพของเรานอกเหนือจากตัวชี้วัดเวลา ในระหว่างการพัฒนาเรามีแอพที่ทำให้อุปกรณ์ร้อนเกินไปและเข้าสู่โหมดที่ใช้พลังงานต่ำกว่าและช้ากว่า อัลกอริธึมที่ดีกว่ามีประสิทธิภาพมากขึ้นช่วยลดสิ่งนี้!
user1118321

1

ฉันคิดว่าเสิร์ชเอ็นจิ้นเช่นGoogleและBingเป็นหนึ่งในพื้นที่ที่ใหญ่ที่สุดที่ใช้อัลกอริทึมที่ซับซ้อนและพวกเขามีบทบาทสำคัญในการเร่งผลลัพธ์ด้วยความเกี่ยวข้อง (การจัดอันดับหน้า) นำยูทิลิตี้เพิ่มเติมให้กับผู้ใช้


1

ทุกวันนี้ประสิทธิภาพของอัลกอริทึมไม่ได้เป็นปัญหาสำคัญเพราะเราใช้อัลกอริธึมที่มีประสิทธิภาพ ถ้าคุณใช้อัลกอริทึม O (n!) มันจะช้ากับฮาร์ดแวร์ทุกชนิด


นั่นเป็นมุมมองที่น่าสนใจ "มันไม่ใช่ปัญหาเพราะมันควรจะไปโดยไม่บอกว่า" มากกว่า "มันเป็นปัญหา แต่ไม่ใช่สิ่งที่สำคัญ"
leftaroundabout

1

ความซับซ้อนของอัลกอริทึมนั้นมีความสำคัญมากขึ้นเรื่อย ๆ เมื่อปริมาณข้อมูลเพิ่มขึ้น โชคดีที่โซลูชันทั่วไปที่มีประสิทธิภาพสำหรับปัญหาการเขียนโปรแกรมทั่วไป (การค้นหาและการเรียงลำดับส่วนใหญ่) จะรวมอยู่ในไลบรารีมาตรฐานของภาษาโปรแกรมสมัยใหม่ทุกภาษาโดยทั่วไปโปรแกรมเมอร์ไม่ต้องกังวลกับสิ่งเหล่านี้มากนัก ข้อเสียคือโปรแกรมเมอร์หลายคนไม่ทราบว่าเกิดอะไรขึ้นภายใต้ประทุนและสิ่งที่เป็นลักษณะของอัลกอริธึมที่ใช้

สิ่งนี้กลายเป็นปัญหาโดยเฉพาะอย่างยิ่งเนื่องจากแอปพลิเคชันจำนวนมากไม่ได้ทดสอบความเครียดอย่างเหมาะสม: ผู้คนเขียนโค้ดที่ทำงานได้ดีสำหรับชุดข้อมูลการทดสอบขนาดเล็ก แต่เมื่อต้องเผชิญกับข้อมูลเพิ่มเติมอีกสองสามพันครั้ง บางสิ่งที่ทำงานได้ดีสำหรับบันทึกสิบรายการจะระเบิดอย่างรวดเร็วเมื่อชุดข้อมูลเติบโตขึ้น ตัวอย่างในโลกแห่งความจริง: ชิ้นส่วนของรหัสที่ควรจะล้างรายการที่ไม่ได้เชื่อมโยงกับหมวดหมู่ใด ๆ อีกต่อไปใช้วนซ้อนกันสามระดับซึ่งเป็น O (n ^ 3) ด้วยการบันทึกเพียง 10 รายการในฐานข้อมูลการทดสอบนี่หมายถึงการตรวจสอบ 1,000 รายการทำได้อย่างสมบูรณ์แบบและไม่ทำให้เกิดความล่าช้าที่น่าสังเกต อย่างไรก็ตามฐานข้อมูลการผลิตเต็มไปอย่างรวดเร็วด้วยประมาณ 1,000 แถวและทันใดนั้นรหัสตรวจสอบพันล้านครั้ง

ดังนั้น: ไม่คุณไม่จำเป็นต้องรู้รายละเอียดของการใช้อัลกอริธึมทุกประเภทและคุณไม่จำเป็นต้องประดิษฐ์คิดค้นของคุณเอง แต่คุณต้องมีความรู้พื้นฐานเกี่ยวกับอัลกอริทึมทั่วไป จุดแข็งและจุดอ่อนคือเมื่อใดและเมื่อใดที่จะไม่ใช้มันและคุณต้องระวังผลกระทบที่อาจเกิดขึ้นจากความซับซ้อนของอัลกอริทึมเพื่อให้คุณสามารถตัดสินใจได้ว่าระดับความซับซ้อนใดที่ยอมรับได้


0

ไม่ใช่คำถามของโดเมนแอปพลิเคชันที่ไวต่อรันไทม์ โปรแกรมใดก็ได้ทุกที่มีประสิทธิภาพขั้นต่ำด้านล่างซึ่งมันไร้ค่าอย่างมีประสิทธิภาพ จุดที่ซับซ้อนของอัลกอริธึมคือความแตกต่างของขนาดอินพุตที่เพิ่มขึ้น กล่าวอีกนัยหนึ่งพื้นที่ที่ความเร็วมีความสำคัญอย่างยิ่งคือพื้นที่ที่คุณคาดว่าจะต้องขยายขนาดไม่เพียง แต่ขนาดปัญหาปัจจุบันของคุณเท่านั้น แต่ยังมีขนาดของขนาดปัญหาปัจจุบันของคุณ หากคุณดำเนินการยื่นขอภาษีของพลเมืองในประเทศฝรั่งเศสงานอาจมีขนาดใหญ่ แต่ไม่น่าเป็นไปได้ที่ขนาดของประชากรหรือความซับซ้อนของการประมวลผลหนึ่งระเบียนจะเพิ่มขึ้นสิบเท่าหรือหนึ่งร้อยเท่า คุณตอนนี้อาจจะทำงานต่อไป แต่ถ้าคุณพยายามที่จะสร้างบางสิ่งบางอย่างที่จะปิดการใช้งานอินเทอร์เน็ตปริมาณความซับซ้อนของอัลกอริทึมเป็นสิ่งสำคัญ: สิ่งที่ขึ้นอยู่กับมากกว่าเชิงเส้นหรือ log-linearly ขนาดการป้อนข้อมูลจะกลายเป็นราคาแพงมากเร็วมาก ให้ทันกับการเติบโต


0

ในสาขาของฉัน (VFX ซึ่งครอบคลุมสิ่งต่าง ๆ เช่นการติดตามเส้นทางภาพเคลื่อนไหวคอมพิวเตอร์การจำลองอนุภาคพลศาสตร์ของไหลการประมวลผลภาพ ฯลฯ ) ความซับซ้อนของอัลกอริทึมเป็นพื้นฐาน ไม่มีวิธีใดในการทำงานที่เลวร้ายยิ่งกว่าเชิงเส้นตรงเวลาที่หวังว่าจะสามารถทำให้เสร็จสมบูรณ์ในเวลาที่เหมาะสมในปัจจัยการผลิตที่โดยทั่วไปมีจำนวนถึงจุดยอด, รูปหลายเหลี่ยม, รูปหลายเหลี่ยม, voxels, อนุภาค, texels โดยเฉพาะอย่างยิ่ง ข้อเสนอแนะแบบโต้ตอบเรียลไทม์

จากที่กล่าวมานั้นมีไม่มากที่เน้นความซับซ้อนของอัลกอริทึมในการสนทนาโดยทั่วไปในหมู่เพื่อนร่วมงานบางทีอาจเป็นเพราะมันค่อนข้างได้รับอนุญาตและค่อนข้าง "เป็นพื้นฐาน" โดยทั่วไปสันนิษฐานว่าถ้าคุณกำลังเขียนตัวติดตามเส้นทางที่จะทำงานในเวลาลอการิทึมหรือดีกว่าและโครงสร้างข้อมูลเช่นลำดับชั้นของไดรฟ์ข้อมูลที่คุ้นเคยและไม่ค่อยน่าใช้สำหรับผู้อ่าน ฉันยังมีเพื่อนร่วมงานที่มีทักษะซึ่งคอยบอกว่าการทำมัลติเธรดและ SIMD นั้นสำคัญกว่าอัลกอริธึมและฉันไม่คิดว่าเขาหมายความว่าในแง่ที่คุณคาดหวังว่าจะได้รับประโยชน์จากการเรียงลำดับฟอง ฉันคิดว่าเขาพูดแบบนั้นเพราะเขาคิดว่าเราใช้อัลกอริธึมที่สมเหตุสมผล

บ่อยครั้งที่โฟกัสจำนวนมากในวันนี้คือการใช้อัลกอริทึมที่คุ้นเคยเหล่านี้จำนวนมากและทำให้พวกเขาใช้ประโยชน์จากคุณลักษณะพื้นฐานของฮาร์ดแวร์เช่นแคช CPU, การลงทะเบียนและคำแนะนำของ SIMD, GPU และหลายแกน ยกตัวอย่างเช่น Intel มาด้วยวิธีใหม่ในการใช้ BVH เก่าที่คุ้นเคยและเกิดขึ้นกับแนวคิดของ "ray packets" โดยทั่วไปจะทำการทดสอบการเชื่อมโยงของรังสีหลายชนิดพร้อมกันในคราวเดียวด้วย traversal แบบวนซ้ำ (ซึ่งอาจฟังดูเหมือนมัน มาพร้อมกับส่วนแบ่งของความซับซ้อนและค่าใช้จ่ายยกเว้นมันถูกสร้างขึ้นจากความจริงที่ว่าตอนนี้สามารถทดสอบรังสีเหล่านั้นพร้อมกันสำหรับเรย์ / AABB และเรย์ / สามเหลี่ยมแยกผ่านคำสั่ง SIMD และการลงทะเบียน)

สิ่งที่คล้ายกันกับการแบ่ง catmull-clark ซึ่งเป็นสิ่งพื้นฐานมากในคอมพิวเตอร์กราฟิก แต่ทุกวันนี้สิ่งที่มีความสามารถในการแข่งขันและร้อนแรงและมีประสิทธิภาพสูงคือการใช้งาน GPU ซึ่งมีการแบ่ง CC โดยใช้เกรกอรี่แพทช์ซึ่งเป็นที่นิยมของ Charles Loop และนำมาใช้ในภายหลังโดย Pixar การใช้ CPU ที่ตรงไปตรงมามากขึ้นในปัจจุบันค่อนข้างล้าสมัยไม่จำเป็นเพราะมันถูกแทนที่ด้วยความซับซ้อนของอัลกอริทึม แต่เพราะมันถูกแทนที่ด้วยบางสิ่งที่เล่นได้ดีกับ GPU

และนั่นมักจะเป็นความท้าทายมากมายในทุกวันนี้ไม่ได้เกิดขึ้นกับอัลกอริธึมที่ดีที่สุดในแบบที่ค่อนข้างเป็นอิสระจากคุณลักษณะพื้นฐานของฮาร์ดแวร์ จริง ๆ แล้วฉันได้เท้าของฉันในอุตสาหกรรมโดยมาพร้อมกับโครงสร้างการเร่งความเร็วแบบใหม่ที่เร่งการตรวจจับการชนสำหรับตัวละครอนิเมชั่นและซอฟต์ตัวอื่น ๆ ในยุค 90 อย่างมีนัยสำคัญโดยใช้วิธีแบ่งกลุ่มตามลำดับชั้น ข้อเสนองาน แต่วันนี้มันไม่น่าประทับใจอีกต่อไปแล้วตั้งแต่ฉันตีพิมพ์มันนานก่อนที่เราจะมีซีพียูที่น่าประทับใจและหลายคอร์และ GPU ที่ตั้งโปรแกรมได้และสิ่งที่ไม่ได้และในปัจจุบันฉันใช้วิธีที่แตกต่างอย่างสิ้นเชิง ฮาร์ดแวร์พื้นฐาน


0

ฉันเคยพบปัญหาที่อัลกอริทึมมักจะใช้งานใน O (n) แต่ในสถานการณ์ที่หายากและไม่น่าจะเกิดขึ้นมากจะต้องใช้เวลา O (n ^ 3) - สถานการณ์ "Rare" เป็นไดเรกทอรีที่มีไฟล์ที่มีชื่อที่ใช้ได้ ระบบปฏิบัติการหนึ่งระบบ แต่ไม่ได้อยู่ในระบบอื่น

ไม่มีใครเคยพบปัญหา จากนั้นลูกค้ารายหนึ่งใช้กลยุทธ์ในการตั้งชื่อไฟล์ที่จะทำงานอย่างเป็นระบบในกรณี O (n ^ 3) และมีไฟล์เพียงไม่กี่ 100 ไฟล์ที่ระบบมีการหยุดนิ่งเสมือน ผลก็คือต้องมีการเปลี่ยนแปลงอัลกอริทึม


0

อีกสามที่ไม่ได้กล่าวถึง:

1) เกมกลยุทธ์แบบเรียลไทม์จำนวนมาก ดูผู้ที่มีหน่วยที่ไม่สามารถแชร์ตำแหน่งได้ ดูสิ่งที่เกิดขึ้นกับการบอกตำแหน่งเมื่อกลุ่มใหญ่ของหน่วยเคลื่อนที่ผ่านภูมิประเทศที่ถูก จำกัด ฉันยังไม่ได้พบกับเกมที่ไม่มีปัญหามากมายกับเรื่องนี้เพราะมีพลังงาน CPU ไม่เพียงพอ

2) ปัญหาการปรับให้เหมาะสมจำนวนมาก (แก้ไข: เนื่องจากฉันเขียนคำตอบนี้ฉันได้กดหนึ่งวัตถุประสงค์ของฉันคือการตัดเส้นทางซ้ำซ้อนเพื่อให้โหนดทั้งหมดเชื่อมต่อกับน้ำหนักขั้นต่ำของเส้นทางเชื่อมต่อวิธีดั้งเดิมของฉันทำงานได้ดีจนกระทั่งฉันย้ายการตัดแต่ง จากกิจวัตรนั้นฉันก็รู้ว่ามันคือ 2 ^ n ตอนนี้มันคือ n ^ 2 แม้ว่าบางครั้งก็อาจให้ผลลัพธ์ที่ไม่เหมาะสมเล็กน้อย)

3) สิ่งต่าง ๆ ที่ต้องทำงานกับข้อมูลจำนวนมากแบบเรียลไทม์ พิจารณาดีวีดี: โดยปกติคุณจะได้รับวิดีโอ 2 ชั่วโมงใน 4.7GB พิจารณาไฟล์วิดีโอทั่วไปที่ความละเอียดเท่ากัน: โดยทั่วไปวิดีโอ 2 ชั่วโมงเหล่านั้นจะมีขนาดไม่ถึง 1GB เหตุผลก็คือเมื่อวาง spec DVD ลงคุณไม่สามารถสร้างเครื่องเล่น DVD ราคาสมเหตุสมผลที่สามารถถอดรหัสรูปแบบที่ทันสมัยกว่าได้เร็วพอ


0

ดีโปรแกรมใด ๆ ที่เรียกโดยทั่วไปในซูเปอร์คอมพิวเตอร์ ( รายชื่อของเครื่องที่ใหญ่ที่สุด ) มีคุณสมบัติ สิ่งเหล่านี้มีความหลากหลาย แต่คลาสย่อยขนาดใหญ่ของพวกมันคือการจำลองทางฟิสิกส์:

  • การจำลองทางฟิสิกส์:
    • พยากรณ์อากาศ
    • การจำลองสภาพภูมิอากาศ
    • การจำลองการระเบิดของดาว ฯลฯ
    • แบบจำลองการระเบิดของนิวเคลียร์
    • การจำลองอากาศพลศาสตร์ของรถยนต์ / เครื่องบิน / รถไฟ ฯลฯ
    • ...
  • การคำนวณภาพจากข้อมูลกล้องโทรทรรศน์วิทยุ
  • การใช้งานทางชีวภาพ:
    • สิ่งที่มีลำดับ DNA (ฉันไม่ได้อยู่ในนั้นจริงๆ)
    • สารชีวเคมีเช่นโปรตีนพับ
    • การจำลองว่าเซลล์ประสาททำงานร่วมกันเพื่อประมวลผลข้อมูลได้อย่างไร
    • การจำลองการโต้ตอบที่ซับซ้อนอื่น ๆ เช่นระบบนิเวศ
    • ...
  • ...

นี่เป็นเพียงหัวข้อหลักของฉัน แต่เพียงอ่านรายการซูเปอร์คอมพิวเตอร์ที่แตกต่างกันและตระหนักว่าสิ่งเหล่านี้แต่ละอันถูกสร้างขึ้นเพื่อเปิดใช้งานการคำนวณบางประเภทที่ไม่สามารถทำได้หากไม่มีเครื่องจักรขนาดยักษ์ดังกล่าว

และเมื่อคุณเห็นว่าเราจริงต้องเครื่องเหล่านี้ตระหนักดีว่าค่าใช้จ่ายมากจะถูกบันทึกไว้เพียงโดยการเร่งการประยุกต์ใช้เหล่านี้เพิ่มขึ้น 10% การเพิ่มประสิทธิภาพของรหัสเหล่านี้จะเพิ่มจำนวนผลลัพธ์ที่เราสามารถออกจากเครื่องเหล่านี้ได้โดยตรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.