Dijkstra의 구조적 프로그래밍에 대한 노트에서 그는 컴퓨터 프로그램의 추상 엔티티로서의 가능성에 대해 많이 이야기합니다. 결과적으로 그는 테스트가 충분하지 않은 방법을 말합니다. 예를 들어, 그는 x와 y의 전체 범위에서 x와 y의 큰 값에 대해 곱셈 함수 f (x, y) = x * y를 테스트하는 것이 불가능하다는 사실을 지적합니다. 내 질문은 그의 기타에 관한 것입니다. “느슨한 하드웨어”에 대한 언급. 나는 컴퓨터 하드웨어가 신뢰성이 떨어지는 때 에세이는 1970 년대에 쓰여진 알고 있지만, 그들은 계산 실수를해야하므로 컴퓨터는 아직 완벽하지 않습니다 때로는 . 이 일이 얼마나 자주 발생하는지 또는 이것에 대한 통계가 있는지 아는 사람이 있습니까?
답변
CPU 디자인의 실제 / 실제 오류는 제쳐두고, 당신은이 SO 질문 : Cosmic Rays를 찾고 있다고 생각합니다 . 확률은 그들이이 프로그램에 영향을 미칠 것입니다 . SO가 직장에서 다시 차단되었으므로 견적을 얻을 수 없습니다 ( sigh ).
위의 내용을 무시하고, 초기 펜티엄에는 FPU 계산 버그가 있었음을 기억하는 것 같습니다.
나는 확실한 증거가 없지만 내 직감에 따르면 캐시 / RAM / 디스크의 비트 가 손상되고 계산이 잘못되었다는 것에 대해 더 걱정해야한다고 말하고 있습니다 .
답변
요즘이 질문에 대답하는 데있어 큰 문제는 CPU 제조업체들이 칩의 정오표를 NDA (Non-Disclosure Agreement)로 포장한다는 것입니다. 인텔, IIRC.
덜 비밀스러운 제조업체는 데이터 시트에 대한 수정 사항을 발행하지만 변경된 내용을 알려주지 않으므로 300 페이지를 모두 비교하지 않으면 말하기가 어렵습니다.
CPU에는 많은 나쁜 지시가 있었으며 부팅시 발견되는 Linux 커널 보고서가 적당히 흥미 롭습니다.
Google의 메모리 오류와 관련이 있습니다. 생각보다 더 일반적입니다. “야생 : 대규모 현장 연구의 DRAM 오류”Schoeder, Pinheiro 및 Weber는 원래 2009 년 ACM SIGMETRICS에 게시되었습니다. 2011 년 2 월 ACM 커뮤니케이션에 재 출판
이러한 모든 메모리 오류의 의미는 ECC 메모리가 없으면 어쨌든 잘못된 계산을 얻을 수 있다는 것입니다.
답변
내가 하드웨어 벤더를 위해 일했을 때, 어떤 CPU도 버그가 없다고 주장했다. 그리고 그것은 단지 논리적 인 버그입니다. 일반적으로 제조업체는 대부분을 찾아 칩을 재 스핀하거나 주변의 BIOS 설정을 찾습니다. 그러나 우주 광선과 같은 것들이 때때로 메모리에서 비트를 뒤집는다는 사실 외에도 (메모리에는 일반적으로 베이컨을 저장하기 위해 패리티 비트 또는 SECDED 회로가 있습니다) 비트가 잘못 읽힐 가능성은 항상 한정되어 있습니다. 비트는 실제 논리 0과 1이 아니지만 전압 및 전류와 같은 잡음이 많은 시스템에 유한 잡음이 주어지면 항상 잘못된 비트를 읽을 가능성이 있습니다. 예전에는 (응용 프로그램 프로그래머로서) 몇 가지 HW 버그가 발견되었습니다-나쁜 논리 종류와 CPU Y의 X 단위가 때때로 나에게 잘못된 결과 유형을 제공합니다. HW 직원들이 다양한 칩을 교체 할 시간입니다. 실제 회로는 시간과 사용에 따라 드리프트되며, 장애가 발생할 경우 특히 오버 클로킹 중이거나 권장 작동 범위를 초과하는 경우 비트 오류를 포착 할 수 있습니다.
1e18 이상의 부동 소수점 연산을 계산하는 계산이 고려되는 수퍼 컴퓨팅의 실제 문제입니다.
답변
다음 내용은 GPU의 계산 오류에 관한 것입니다.
충분한 시간이 주어지면 인텔 i7-3610QM과 Nvidia GeForce GTX 660은 동일한 지침에 따라 서로 동의하지 않습니다. (cuda 5.5, compute_20, sm_20)
따라서 둘 중 하나가 실수를한다는 결론을 내릴 수 있습니다.
파티클 시뮬레이션 타당성 연구 벤치 마크에서 나는 수천 정도의 배정 밀도 변환 (sin, 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 “ECC 메모리 지원하는 최초의 GPU는”) 또한 관심의 위의 오류에 반드시 관련 아니지만이 될 수 있습니다.
답변
실제 “CPU”(실행 단위, 파이프 라인 ..ect)를 고려할 때 거의 발생하지 않습니다. 펜티엄 맛 중 하나와 관련하여 알려진 문제가 있었지만 그것은 내가 들어 본 유일한 것입니다. 이제 프로세서에 내장되어 있거나 USB 컨트롤러, TSEC, DMA 컨트롤러 또는 메모리 컨트롤러와 같은 패키징에 내장 된 칩셋을 고려하면 많은 정오표가 있습니다. 그래도 그것에 대한 통계 데이터가 있는지 의심합니다.
답변
이러한 맥락에서 고려해야 할 또 다른 “형편없는 하드웨어”문제는 부동 소수점 하드웨어를하는 것은 “손실”는 본질적 때문이다 : 그것은 제한된 정밀도를 가지고 있으며, 충분히 많은 수의 (원래 익스트라 견적을 다시 참조)과는 구별 할 수 없습니다 x
및 x + 1
, 또는 x + 1000000
. “무한한”정밀 부동 소수점 라이브러리를 얻을 수 있지만 사용 가능한 메모리로 인해 속도가 느리고 궁극적으로 여전히 제한됩니다.
요컨대 Dijkstra는 이론 영역에서 작업하고 있었고 실제 하드웨어 / 소프트웨어는 이론적 이상과 잘 맞지 않습니다. (원래 “Turing machine”은 무한한 종이 테이프를 지정했음을 기억하십시오.)