Dalam Dijkstra's Notes on Structured Programming, dia banyak berbicara tentang kemampuan program komputer sebagai entitas abstrak. Sebagai akibat wajar, ia menyatakan bahwa pengujian tidak cukup. Misalnya, ia menunjukkan fakta bahwa tidak mungkin untuk menguji fungsi perkalian f (x, y) = x * y untuk setiap nilai besar x dan y di seluruh rentang x dan y. Pertanyaan saya menyangkut misc-nya. komentar pada "hardware buruk". Saya tahu esai ini ditulis pada tahun 1970-an ketika perangkat keras komputer kurang dapat diandalkan, tetapi komputer masih belum sempurna, sehingga mereka terkadang harus melakukan kesalahan perhitungan . Adakah yang tahu seberapa sering hal ini terjadi atau jika ada statistik tentang ini?
22
Jawaban:
Kesalahan nyata / aktual di samping desain CPU, saya pikir Anda mencari SO ini Pertanyaan: Sinar Kosmik. Berapa probabilitas mereka akan memengaruhi suatu program . Saya tidak dapat memperoleh kutipan darinya karena SO diblokir lagi di kantor ( desahan ).
Mengabaikan hal di atas, saya ingat ada beberapa bug perhitungan FPU di Pentium awal, jadi mereka tentu saja tidak salah.
Saya tidak punya bukti kuat, tetapi usus saya mengatakan Anda mungkin harus lebih khawatir tentang bit Cache / RAM / Disk yang korup maka perhitungan menjadi salah.
sumber
Masalah besar dalam menjawab pertanyaan ini hari ini adalah bahwa produsen CPU membungkus errata untuk chip dalam NDA (NonDisclosure Agreement). Intel melakukan ini, IIRC.
Banyak produsen yang tidak terlalu rahasia mengeluarkan koreksi pada lembar data, tetapi tidak memberi tahu Anda apa yang berubah, jadi kecuali Anda lebih suka membandingkan ke-300 halaman, Anda akan kesulitan mengatakannya.
Ada banyak instruksi buruk di CPU, menonton laporan kernel Linux yang ditemukan pada saat boot cukup menarik.
Sangat terkait adalah kertas Google tentang kesalahan memori, mereka lebih umum daripada yang Anda pikirkan. "Kesalahan DRAM di Alam Liar: Studi Lapangan Skala Besar" Schoeder, Pinheiro dan Weber Awalnya diterbitkan di ACM SIGMETRICS pada tahun 2009. Diterbitkan ulang dalam Komunikasi ACM Feb 2011
Apa semua kesalahan memori ini berarti untuk pertanyaan Anda, adalah bahwa tanpa memori ECC, Anda tetap akan mendapatkan perhitungan yang salah.
sumber
Kembali ketika saya bekerja untuk vendor perangkat keras, diklaim bahwa tidak ada CPU yang pernah dibangun adalah bugfree. Dan itu hanya bug logika. Biasanya pabrikan menemukan sebagian besar dari mereka dan menghargai chip, atau menemukan pengaturan BIOS yang bekerja di sekitar mereka. Tetapi selain fakta hal-hal seperti sinar kosmik kadang-kadang membalik sedikit dalam memori (dan memori biasanya memiliki bit paritas atau sirkuit SECDED untuk menghemat daging Anda), selalu ada peluang terbatas bahwa sedikit akan dibaca dengan salah. Perhatikan bahwa bit bukan angka nol dan satu yang logis, tetapi hal-hal yang berisik seperti voltase dan arus, dan diberi noise hingga dalam sistem, selalu ada kemungkinan bit yang salah akan terbaca. Di masa lalu (sebagai programmer aplikasi), saya menemukan beberapa bug HW - baik dari jenis logika yang buruk, dan dari unit X di CPU Y kadang-kadang memberi saya jenis hasil yang buruk, saatnya untuk mendapatkan HW guys untuk mengganti berbagai chip. Sirkuit aktual melayang dengan waktu dan penggunaan, dan jika Anda siap untuk gagal, Anda bisa mulai mengambil kesalahan bit, terutama jika Anda overclocking, atau melebihi rentang operasi yang direkomendasikan.
Ini adalah masalah nyata untuk superkomputer, di mana perhitungan melibatkan 1e18 atau lebih operasi floating point direnungkan.
sumber
Konten berikut mungkin tentang kesalahan perhitungan dalam GPU.
Diberi waktu yang cukup, Intel i7-3610QM dan Nvidia GeForce GTX 660 akan tidak setuju satu sama lain mengingat instruksi yang sama. (cuda 5.5, compute_20, sm_20)
Jadi, satu yang tersisa untuk menyimpulkan bahwa salah satu dari keduanya membuat kesalahan.
Selama benchmark studi kelayakan simulasi partikel saya perhatikan bahwa setelah seribu atau lebih transformasi presisi ganda (transformasi termasuk dosa, cos, perkalian, pembagian, penambahan dan pengurangan) kesalahan mulai muncul.
Saya akan memberikan Anda sedikit kutipan angka untuk dibandingkan (angka pertama selalu CPU, GPU kedua)
(perhatikan bahwa tidak setiap urutan transformasi menghasilkan kesalahan)
Sementara kesalahan maksimum hampir dapat diabaikan
(0.0000000000000401%)
itu masih ada, dan berkontribusi terhadap kesalahan kumulatif.Sekarang kesalahan ini mungkin disebabkan oleh perbedaan dalam implementasi salah satu pustaka intrinsik. Memang, sepertinya GPU lebih suka membulatkan atau memotong di mana CPU dibulatkan. Anehnya, ini hanya terjadi pada angka negatif.
Tetapi intinya adalah bahwa instruksi yang sama tidak selalu dijamin untuk memberikan hasil yang sama, bahkan pada mesin digital.
Saya harap ini berkontribusi.
EDIT sebagai sidenote: Dalam hal kesalahan aritmatika GPU, ini (ctrl + f "GPU Pertama dengan Dukungan Memori ECC") juga dapat menarik, meskipun tidak selalu relevan dengan kesalahan di atas.
sumber
Dalam hal apa yang Anda anggap "CPU" yang sebenarnya (unit eksekusi, pipa .. dll) itu hampir tidak pernah terjadi. Ada masalah yang diketahui dengan salah satu rasa Pentium beberapa waktu lalu, tapi itu adalah satu-satunya yang pernah saya dengar. Sekarang, jika Anda mempertimbangkan set chip yang dibangun ke dalam prosesor atau setidaknya kemasan yang sama seperti pengontrol USB, TSEC, pengontrol DMA atau pengontrol memori, maka ada banyak errata di luar sana. Saya ragu ada semacam data statistik tentang itu.
sumber
Masalah "perangkat keras buruk" lainnya yang perlu dipertimbangkan dalam konteks ini adalah bahwa perangkat keras floating point secara inheren "lossy": ia memiliki presisi terbatas, dan dengan jumlah yang cukup besar (merujuk kembali ke kutipan Dijkstra asli) Anda tidak akan dapat membedakan antara
x
danx + 1
, atau bahkanx + 1000000
. Anda bisa mendapatkan pustaka floating point presisi "tak terbatas", tetapi mereka lambat dan akhirnya masih dibatasi oleh memori yang tersedia.Singkatnya, Dijkstra bekerja di bidang teori, dan perangkat keras / lunak nyata tidak cocok dengan cita-cita teoretis dengan sangat baik. (Ingat, "mesin Turing" asli menentukan pita kertas tanpa batas.)
sumber
(1 - .7) * 100
harus 30 meskipun JavaScript akan kembali30.000000000000004
yang merupakan kesalahan. Apakah itu perangkat keras atau perangkat lunak, saya pribadi tidak yakin.