CPU ทำข้อผิดพลาดในการคำนวณบ่อยแค่ไหน?


22

ในหมายเหตุของ Dijkstra เกี่ยวกับการเขียนโปรแกรมแบบโครงสร้างเขาพูดถึงเรื่องการพิสูจน์ได้ของโปรแกรมคอมพิวเตอร์ในฐานะหน่วยงานที่เป็นนามธรรม ในฐานะที่เป็นข้อพิสูจน์เขากล่าวว่าการทดสอบไม่เพียงพอ เช่นเขาชี้ให้เห็นความจริงที่ว่ามันเป็นไปไม่ได้ที่จะทดสอบฟังก์ชั่นการคูณ f (x, y) = x * y สำหรับค่าใด ๆ ของ x และ y ทั่วทั้งช่วงของ x และ y คำถามของฉันเกี่ยวข้องกับคนอื่น ๆ พูดถึง "ฮาร์ดแวร์หมัด" ฉันรู้ว่าเรียงความที่เขียนขึ้นในปี 1970 เมื่อคอมพิวเตอร์ฮาร์ดแวร์ก็มีความน่าเชื่อถือน้อยลง แต่คอมพิวเตอร์ยังคงไม่สมบูรณ์ดังนั้นพวกเขาจะต้องทำผิดพลาดในการคำนวณบางครั้ง ไม่มีใครรู้ว่าสิ่งนี้เกิดขึ้นบ่อยแค่ไหนหรือหากมีสถิติใด ๆ เกี่ยวกับเรื่องนี้?



นี่คือหน้าวิกิพีเดียในข้อผิดพลาด Pentium FDIV ที่กล่าวถึงโดยทั้งสองคำตอบที่มีอยู่ในปัจจุบัน
Cascabel

เราได้รับโดยไม่ต้องมีการสำรองข้อมูลหรือตรวจสอบข้อผิดพลาดใด ๆ เกี่ยวกับการทำงานของ CPU ขั้นพื้นฐานดังนั้นเราสามารถประมาณขอบเขตบนสำหรับความถี่ของข้อผิดพลาดในการคำนวณแบบชั่วคราว คำสั่ง CPU ส่วนใหญ่เกี่ยวข้องกับคณิตศาสตร์ (ในการคำนวณที่อยู่สำหรับการดำเนินการของหน่วยความจำเช่นเดียวกับการคำนวณ) และ CPU ที่ทันสมัยกำลังทำงานหลายพันล้านต่อวินาทีเรียกว่า> 1e14 การดำเนินงานต่อวัน หาก 1 ใน 10 ข้อผิดพลาดทางคณิตศาสตร์จะมีผลชัดเจนต่อโปรแกรม (อาจเป็นการประเมินที่ต่ำ) และเราไม่เห็นข้อผิดพลาดดังกล่าวทุกวันอัตราความผิดพลาดพื้นฐานสำหรับ ALU จะต้อง <1e-13 และฉัน จะเดา <1e-15
Russell Borogove

@NickC: คุณหมายความว่าไม่มีคำถามเกี่ยวกับคำถามนี้หรือไม่? ดังนั้นคุณคิดว่าคำถามว่าฮาร์ดแวร์ทำงานได้หรือไม่ไม่สำคัญ? สิ่งที่เกี่ยวกับเมื่อมันเป็นเรื่องจริงว่าโปรแกรมทำงานอย่างถูกต้อง (การเขียนโปรแกรมแบบเรียลไทม์ทางทฤษฎีเท่านั้นหรือขั้นสูงเกินไปสำหรับคนในเว็บไซต์นี้?) ฮาร์ดแวร์เกี่ยวกับที่ผู้ใช้รายหนึ่งสามารถขโมยคีย์จากผู้ใช้รายอื่นเนื่องจากการรั่วไหลของข้อมูลผ่านช่องทางด้านข้าง ประณามฉันหวังว่าจะมีปุ่ม downvote สำหรับความคิดเห็น
Longpoke

1
@ Longpoke ฉันด้วย
Nicole

คำตอบ:


14

ข้อผิดพลาดจริง / จริงในการออกแบบของ CPU ฉันคิดว่าคุณกำลังมองหาคำถาม SO: Cosmic Rays ความน่าจะเป็นที่จะมีผลต่อโปรแกรมคืออะไร ฉันไม่สามารถรับราคาจากมันได้เพราะ SO ถูกบล็อกอีกครั้งที่ทำงานที่นี่ ( ถอนหายใจ )

ดูเหมือนว่าฉันจะจำได้ว่ามีข้อผิดพลาดในการคำนวณ FPU บางส่วนใน Pentium ยุคต้นดังนั้นพวกเขาจึงไม่ผิดพลาดแน่นอน

ฉันไม่มีหลักฐานที่ชัดเจนในมือ แต่ไส้ของฉันบอกฉันว่าคุณน่าจะกังวลเกี่ยวกับบิตของ Cache / RAM / Disk ที่เสียหายแล้วการคำนวณนั้นไม่ถูกต้อง


40
ดังนั้นถูกบล็อกในที่ทำงานหรือไม่ มีคนใน บริษัท ของคุณพยายามก่อวินาศกรรมการพัฒนาซอฟต์แวร์หรือไม่?
นิโคล

3
คุณบอกว่าราวกับว่ามันเป็นเพียงหนึ่งคนและพวกเขาได้ไม่ประสบความสำเร็จเลย ... ;)
แดน McGrath

9
ฉันไม่สามารถเข้าใจเหตุผลของการปิดกั้นไซต์ SFW ในระดับองค์กร เนื่องจากเครื่องมือค้นหาเป็นเครื่องมือที่มีค่าอย่างยิ่งคุณควรจะสามารถดูข้อมูลที่ได้รับ
Tim Post

@Dan เลิกบล็อก คุณควรจะสามารถทำ https-tunneling ถึงบ้านได้

4
การถูกดักจับโดยการข้ามระบบเป็นเพียงสาเหตุของการยกเลิก ฉันย้ายไปสหรัฐอเมริกาและได้งานใหม่
Dan McGrath

6

ปัญหาใหญ่ในการตอบคำถามนี้ในวันนี้คือผู้ผลิต CPU ห่อ errata สำหรับชิปใน NDA (ข้อตกลงการไม่เปิดเผยข้อมูล) Intel ทำสิ่งนี้ IIRC

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

มีคำแนะนำที่ไม่ดีในซีพียูมากมายดูรายงานเคอร์เนลของลีนุกซ์ที่พบในการบู๊ตนั้นน่าสนใจพอสมควร

มีความเกี่ยวข้องมากคือกระดาษของ Google เกี่ยวกับข้อผิดพลาดของหน่วยความจำซึ่งเป็นเรื่องปกติมากกว่าที่คุณคิด "ข้อผิดพลาด DRAM ในป่า: การศึกษาภาคสนามขนาดใหญ่" Schoeder, Pinheiro และ Weber เผยแพร่ครั้งแรกใน ACM SIGMETRICS ในปี 2009 พิมพ์ซ้ำใน Communications of ACM ก.พ. 2011

ข้อผิดพลาดของหน่วยความจำเหล่านี้มีความหมายต่อคุณอย่างไรคือหากไม่มีหน่วยความจำ ECC คุณจะได้รับการคำนวณผิด


5

ย้อนกลับไปเมื่อฉันทำงานให้กับผู้จำหน่ายฮาร์ดแวร์มีการอ้างว่าไม่มี CPU ตัวใดที่เคยสร้างมาเป็นบั๊ก และนั่นเป็นเพียงข้อบกพร่องทางตรรกะ โดยปกติแล้วผู้ผลิตจะพบพวกเขาส่วนใหญ่และตอบสนองต่อชิปหรือค้นหาการตั้งค่า BIOS ที่ใช้งานได้ แต่นอกเหนือจากข้อเท็จจริงที่ว่ารังสีคอสมิกบางครั้งก็พลิกในหน่วยความจำ (และหน่วยความจำมักจะมีบิตพาริตี้หรือวงจร SECDED เพื่อบันทึกเบคอนของคุณ) มีโอกาส จำกัด ที่จะอ่านบิตไม่ถูกต้อง โปรดทราบว่าบิตไม่ใช่ศูนย์และตรรกะจริง แต่สิ่งที่มีเสียงดังเช่นแรงดันไฟฟ้าและกระแสและเสียงรบกวนที่ จำกัด ในระบบมีโอกาสที่จะอ่านบิตผิดเสมอ ในสมัยก่อน (ในฐานะโปรแกรมเมอร์แอป) ฉันพบข้อบกพร่อง HW สองสามประการ - ทั้งชนิดตรรกะที่ไม่ดีและหน่วย X ใน CPU Y บางครั้งทำให้ฉันพิมพ์ผลลัพธ์ที่ไม่ดี ถึงเวลาที่จะรับพวก HW มาแทนที่ความหลากหลายของชิป วงจรที่เกิดขึ้นจริงนั้นเบี่ยงเบนไปตามเวลาและการใช้งานและหากคุณพร้อมที่จะล้มเหลวคุณสามารถเริ่มต้นรับข้อผิดพลาดบิตโดยเฉพาะอย่างยิ่งถ้าคุณโอเวอร์คล็อกหรือเกินช่วงปฏิบัติการที่แนะนำ

มันเป็นปัญหาที่แท้จริงสำหรับการประมวลผลแบบซูเปอร์ซึ่งการคำนวณเกี่ยวข้องกับการดำเนินการทศนิยม 1e18 หรือมากกว่านั้น


3

เนื้อหาต่อไปนี้อาจเกี่ยวกับข้อผิดพลาดในการคำนวณใน GPU

ให้เวลาเพียงพอ Intel i7-3610QM และ Nvidia GeForce GTX 660 จะไม่เห็นด้วยกับอีกคนหนึ่งซึ่งได้รับคำแนะนำเดียวกัน (cuda 5.5, compute_20, sm_20)

ดังนั้นหนึ่งเหลือเพื่อสรุปว่าหนึ่งในสองทำให้เกิดข้อผิดพลาด

ในระหว่างการศึกษาความเป็นไปได้ของการจำลองอนุภาคความเป็นไปได้ฉันสังเกตว่าหลังจากการแปลงความแม่นยำสองพันครั้ง (การเปลี่ยนแปลงรวมถึงบาป cos การคูณการหารการบวกและการลบ) ข้อผิดพลาดเริ่มคลานเข้ามา

ฉันจะให้ข้อความที่ตัดตอนมาเล็กน้อยของคุณเพื่อเปรียบเทียบ (หมายเลขแรกคือ CPU เสมอ, GPU ตัวที่สอง)

-1.4906010142701069
-1.4906010142701074

-161011564.55005690
-161011564.55005693

-0.13829959396003652
-0.13829959396003658

-16925804.720949132
-16925804.720949136

-36.506235247679221
-36.506235247679228

-3.3870884719850887
-3.3870884719850896

(โปรดทราบว่าไม่ใช่ว่าทุกลำดับการแปลงจะทำให้เกิดข้อผิดพลาด)

ในขณะที่ข้อผิดพลาดสูงสุดเกือบเล็กน้อย(0.0000000000000401%)ก็ยังคงมีอยู่และจะนำไปสู่ข้อผิดพลาดสะสม

ตอนนี้ข้อผิดพลาดนี้อาจเกิดจากความแตกต่างในการใช้งานของหนึ่งในห้องสมุดที่แท้จริง ดูเหมือนว่า GPU ชอบที่จะปัดเศษหรือตัดส่วนที่ CPU ปัดขึ้น ด้วยความอยากรู้อยากเห็นสิ่งนี้ดูเหมือนจะเกิดขึ้นกับตัวเลขติดลบเท่านั้น

แต่ประเด็นคือคำแนะนำที่เหมือนกันนั้นไม่ได้รับประกันว่าจะให้ผลลัพธ์ที่เหมือนกันแม้แต่ในเครื่องดิจิตอล

ฉันหวังว่านี่จะช่วยได้

แก้ไขเป็นข้อผิดพลาด: ในกรณีที่มีข้อผิดพลาดทางคณิตศาสตร์ GPU นี้ (ctrl + f "GPU ตัวแรกที่สนับสนุนหน่วยความจำ ECC") อาจเป็นที่สนใจเช่นกันถึงแม้ว่าจะไม่เกี่ยวข้องกับข้อผิดพลาดข้างต้น


การคำนวณจุดลอยตัวอาจแตกต่างกันไปตามสถานที่จัดเก็บ การลงทะเบียน FPU ภายในของ CPU บางตัวนั้นมีความยาวแตกต่างจาก RAM ดังนั้นขึ้นอยู่กับตำแหน่งที่โหลดตัวถูกดำเนินการจากนั้นมันจะได้ผลลัพธ์ที่แตกต่างกัน สำหรับข้อมูลเพิ่มเติมผมขอแนะนำให้floating-point-gui.de อย่างไรก็ตามนี่ไม่ใช่ข้อผิดพลาดในการคำนวณ แต่เป็นการออกแบบวิธีการคำนวณเลขทศนิยมที่ทำงาน
ฟิลิปป์

2
สำหรับผู้ที่ไม่ทราบวิธีการคำนวณทางคณิตศาสตร์ของ FP เพียงชี้แจงคำอธิบายของ Philipp ความแตกต่างเหล่านี้อาจแก้ไขได้อย่างดี (เนื่องจากความแตกต่างไม่ใช่จากข้อบกพร่องของซอฟต์แวร์ ความแตกต่างมีแนวโน้มที่จะเกิดจากการใช้งานซอฟต์แวร์หรือการใช้งานฮาร์ดแวร์ เราต้องใช้ความคิดของ epsilon เครื่องจักรคงที่เพื่อตรวจสอบว่าสิ่งเหล่านี้เป็นรถ: en.wikipedia.org/wiki/Machine_epsilon (ส่วนใหญ่ค่าคงที่นี้จะอธิบายถึงความแม่นยำของการทำงาน FP เดียว)
Thomas Eding

1

ในแง่ของสิ่งที่คุณพิจารณา "CPU" จริง (หน่วยการดำเนินการไปป์. .. ) มันค่อนข้างไม่เคยเกิดขึ้น มีปัญหาที่ทราบกันแล้วว่ามี Pentium รสชาติหนึ่งอยู่พักหนึ่ง แต่นั่นเป็นสิ่งเดียวที่ฉันเคยได้ยิน ตอนนี้ถ้าคุณพิจารณาชุดชิปที่สร้างไว้ในโปรเซสเซอร์หรืออย่างน้อยบรรจุภัณฑ์เดียวกันเช่นคอนโทรลเลอร์ USB, TSEC, คอนโทรลเลอร์ DMA หรือคอนโทรลเลอร์หน่วยความจำก็มีความผิดพลาดอยู่มากมาย ฉันสงสัยว่ามีข้อมูลสถิติใด ๆ เกี่ยวกับเรื่องนั้น


0

อีกประเด็น "ฮาร์ดแวร์หมัด" ที่จะต้องพิจารณาในบริบทนี้คือฮาร์ดแวร์จุดลอยตัวเป็น "สูญเสีย" โดยธรรมชาติ: มันมีความแม่นยำ จำกัด และมีจำนวนมากพอ (อ้างอิงกลับไปที่ข้อความอ้างอิง Dijkstra ดั้งเดิม) คุณจะไม่สามารถแยกแยะระหว่างxและหรือแม้กระทั่งx + 1 x + 1000000คุณสามารถรับไลบรารี่ของทศนิยมที่ไม่มีที่สิ้นสุดได้ แต่จะช้าและในที่สุดก็ยังถูก จำกัด โดยหน่วยความจำที่มีอยู่

ในระยะสั้น Dijkstra ทำงานในขอบเขตของทฤษฎีและฮาร์ดแวร์ / ซอฟต์แวร์จริงไม่ตรงกับอุดมคติทางทฤษฎีได้เป็นอย่างดี (โปรดจำไว้ว่า "เครื่องทัวริง" ดั้งเดิมระบุเทปกระดาษที่ไม่มีขีด จำกัด )


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

(1 - .7) * 100 ควรเป็น 30 ถึงแม้ว่า JavaScript จะกลับมา30.000000000000004ซึ่งเป็นข้อผิดพลาด ไม่ว่าจะเป็นฮาร์ดแวร์หรือซอฟต์แวร์ฉันไม่แน่ใจเป็นการส่วนตัว
จอห์น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.