크로스 플랫폼을 제공하면서 모든 단일 CPU 코어, SIMD 내장 함수, GPU, GPGPU 등을 사용하는 멀티 스레드 차세대 AAA 게임 엔진과 같이 하드웨어의 모든 1 인치를 커버하는 영역에서이 문제를 강력하게 이해할 수있었습니다. 생성물.
이 경우 최악의 악몽은 종종 테스트 (단위 및 통합)가 테스트 된 첫 번째 5,000 개의 이기종 기계 / 플랫폼에 대해 통과하지만 모호한 GPU 모델의 드라이버 버그로 인해 5,001 번째에는 실패하는 경우입니다. 이것에 대해 나에게 떨림을 줄 수 있습니다. 미리 미리 테스트하거나 예측할 수는 없습니다.
특히 GPU 셰이더를 작성하는 경우 관련된 모든 GPU 모델 / 드라이버에 의해 시행되는 이식 가능한 표준 보증이 거의 없기 때문에 작성하는 코드의 절반이 정의되지 않은 동작을 호출하는 역 복권을 재생할 수 있습니다. 요즘에는 지뢰 찾기와 같이 점점 더 작아지고 있지만 사람들에게 몇 가지 아이디어를 제공해야합니다 : http://theorangeduck.com/page/writing-portable-opengl . 90 년대 후반과 2000 년대 초반에 이것을 시도하는 것은 정말로 끔찍했고, 그것은 지뢰 찾기였습니다.
이러한 종류의 경우 제품을 안정적으로 출시하고 안정적인 출시 전에 확신을 갖기 위해 광범위한 하드웨어 및 운영 체제를 갖춘 10,000 명 이상의 테스터 팀이 종종 필요합니다 . 모든 기업들은 다양한 테스트 기반을 가지고 여유가 있고, 모든 것이 잘 (모든 널리 눈에 띄는 문제가 해결되어야 할 분야가 이전에 그렇지 않으면 일부 내부 전 알파 / 알파 단계 또는에서 많은 테스터 데 중복 보고서가 넘치면 개발자가 패치 및기도 패닉에 빠질 수 있습니다).
이 경우에 권장하는 것은 다른 사람들이 제안한 것입니다. 분산 통합 테스트 세트에 중점을 둡니다. 설치 프로그램과 함께 번들로 제공 할 수 있으므로, 사용자가 설치에 실패한 이유를 개발자에게 전달하는 데 대한 세부 정보를 제공하는 데주의를 기울여 기본 진단 검사를 통과해야합니다.
또 다른 것은 (보스를 설득 할 수있는 경우) 연속 통합을 수행 할 수있는 광범위한 하드웨어를 보유하는 것입니다. 더 다양한 하드웨어 / OS 콤보, 장점. CI 서버의 최소 하드웨어 요구 사항을 모델링하는 다양한 불량 하드웨어도 원합니다.
그러나 내가 제안 할 것이 하나 더 있습니다.
벌채 반출
위에서 설명한 시나리오와 같은 것을 다루는 경우 가장 문제가 많은 경향이있는 것들을 테스트 할 수없는 경우가 종종 있습니다 (가장 최악의 시간에 나타나고 심지어는 특정 하드웨어 / OS 콤보로 제한되는 문제이므로 가장 철저한 테스트 스위트).
그러나 불명확 한 하드웨어 비 호환성 또는 명백한 드라이버 결함 또는 잘못된 dylib에 대한 링크 (실제로는 이러한 문제에 직면 한 적이 없음)와 같은 대부분의 문제는 소프트웨어를 시작하는 데 크게 도움이되지 않습니다. 일반적으로 조만간 충돌하고 타 버릴 것입니다.
나는 건강을 위해 피할 수없는 것을 포용하는 것이 좋습니다. 종합적으로 테스트 할 수없는 이러한 작업에 대해서는 아무것도 할 수 없습니다. 허리케인을 막으려 고 노력하지 말고 (불가능) 그 창문을 세우십시오.
일반적으로 여기서 할 수있는 최선의 방법은 가능한 한 빨리 문제를 찾아 내서 가능한 한 상세하게 (의심 목록을 좁히기 위해)보고하고 문제가보고 된 후 최대한 빨리 수정하는 것입니다.
이 경우 로깅은 생명의 은인이 될 수 있습니다. 이러한 종류의 필드에 대해서는 아무도 읽지 못한 스팸 기술 로그를 만들 수 있습니다. 드라이버 결함으로 인해 충돌이 발생하기 전에 로그에 기록 된 마지막 행과 관련이있는 경우가 종종 있습니다. 예를 들어 충돌을 모니터링 한 다음 사용자가 복사 할 수있는 로그의 마지막 행을 표시하는 외부 프로세스 또는 후크를 작성할 수 있습니다. 예를 들어 크래시 덤프 외에 붙여 넣습니다.
여기에는 종종 세분화 된 정보가 필요하고 이러한 하드웨어 / 플랫폼 / 드라이버 문제와 관련하여 코드에서 가장 민감한 영역이 많으므로 성능이 매우 중요하므로 로깅이 빈번한 속도로 발생하여 실제로 느려질 수있는 어색한 문제가 있습니다 소프트웨어 다운.
이 경우 유용한 트릭은 한 번 실행 된 항목이 두 번째, 세 번째 등 성공적으로 실행된다는 가정에 의존하는 것입니다. 이는 가장 건전한 가정은 아니지만 종종 "충분히 좋은"것입니다. . 이를 통해 약간의 외부 상태를 사용하여 무언가가 이미 기록 된 시점을 추적하고 루프에서 반복적으로 코드가 호출되는 매우 세부적인 경우에 대한 후속 시도를 건너 뛸 수 있습니다.
어쨌든, 이것이 도움이되기를 바랍니다. 나는 과거에 이런 종류의 유혹을 겪었고 나와 자신과 팀 간의 과거 경험의 결과로 GPU 코딩 (GPGPU와 쉐이더)을 둘러싼 약간의 편집증이 있습니다 (때로는 다른 팀 구성원이 실제로 이러한 문제를 처리하는 것을 보았습니다) 늦게 출시 된 후 릴리스는 앤티 앨리어싱 된 라인을 렌더링 할 때 충돌이 발생하는 특정 Radeon 모델의 일부 ATI 결함과 같은 크립을 제공했으며 나중에 사용 가능한 해결 방법 솔루션으로 알려진 문제로보고되었습니다.
로깅은 우리의 꽁초를 저장 한 것인데, 우리가 들어 본 적이없는 온보드 GPU가있는 10,001 번째 모호한 프로토 타입 머신의 문제를 자주 볼 수있게했으며, 마지막 코드 줄을 통해 오류가 발생한 위치를 정확히 2 개 확인할 수있었습니다. 또는 세 줄의 코드가 의심되는 경우, 예를 들어 정교한 쉐이더 안에있는 경우 GPU 쉐이더 내부에서 로깅을 수행 할 수 없기 때문에 일종의 SOL입니다. 그러나 최소한 로깅을 사용하여 어떤 쉐이더에 문제가 있는지 즉시 확인할 수 있습니다 조사를 시작합니다.