C/C++에서 특정 알고리즘을 구현하여 해결해야하는 대부분의 과학적 컴퓨팅 문제는 배정도보다 훨씬 낮은 정확도를 요구합니다. 예를 들어, 1e-6
, 1e-7
의 정확도는 ODE 해결사 또는 수치 적분의 경우의 99%
을 포함합니다. 우리가 더 높은 정확도를 필요로하는 드문 경우에도, 일반적으로 수치 방법 자체가 실패하여 배 정밀도에 가까운 정확도에 도달 할 것을 꿈꿉니다. 예 : 둥근 오차 때문에 표준 노 스미스 상미 분 방정식을 풀 때조차도 단순한 Runge-Kutta 방법으로 1e-16의 정확도를 기대할 수 없습니다. 이 경우 배정 밀도 요구 사항은 잘못된 대답에 대해 더 나은 근사를 요구하는 것과 유사합니다.부동 소수점 최적화 - 지침
그런 다음 공격적인 부동 소수점 최적화는 코드를 더 빨리 (훨씬 더 빠르게!) 만들 수 있으므로 대부분의 경우 윈 - 윈 (win-win) 상황 인 것으로 보이며 특정 문제의 대상 정확도에 영향을주지 않습니다. 즉, 특정 구현/코드가 fp 최적화에 대해 안정적인지 확인하는 것이 현저합니다. 고전적이며 (다소 불안한) 예 : GNU 과학 도서관 인 GSL은 시장의 표준 수치 라이브러리 일뿐만 아니라 매우 잘 쓰여진 라이브러리입니다 (더 나은 일을한다고 상상할 수는 없습니다). 그러나 GSL은 fp 최적화에 안정적이지 않습니다. 사실, 인텔 컴파일러로 GSL을 컴파일하면, 예를 들어 -fp-model strict
플래그를 켜고 fp 최적화를 해제하지 않으면 내부 테스트가 실패합니다.
따라서 제 질문은 적극적인 부동 소수점 최적화에 안정적인 코드를 작성하기위한 일반적인 지침이 있는지입니다. 이 지침은 언어 (컴파일러)에 따라 다릅니다. 그렇다면 C/C++ (gcc/icc) 모범 사례는 무엇입니까?
참고 1 :이 질문은 gcc/icc에서 fp 최적화 플래그가 무엇인지 묻지 않습니다.
참고 2 :이 질문은 C/C++ 최적화에 대한 일반적인 지침 (많은 기능을하는 작은 함수에는 가상 함수를 사용하지 않는 것과 같은)을 요구하지 않습니다.
참고 3 :이 질문은 x/x -> 1과 같은 대부분의 표준 fp 최적화 목록을 묻지 않습니다.
참고 4 : 나는 이것이 고전적인 "The Coolest Server Names"와 비슷한 주관적/주제 외 질문이 아닐 것이라고 강력히 믿습니다. 의견이 일치하지 않으면 (구체적인 예/코드/문제를 제공하지 않기 때문에) 커뮤니티 위키로 신고하십시오. 나는 몇 가지 상태 점수를 얻는 것보다 대답에 훨씬 더 관심이 있습니다 (중요하지는 않습니다 - 당신은 요점을 얻습니다!).
오류가 누적됩니다. 모든 계산이 배정도로 수행되는 경우에도 최종 결과는 마지막 비트까지 정확하지 않습니다. float를 어디서나 사용한다면 적절한 오류 분석을 수행하여 답변의 몇 비트가 신뢰할 만한지 계산해야합니다. 물론 두 배로 똑같은 일을해야합니다. –
일반적인 수치 안정성은 종종 유한 정밀 부동 소수점 연산의 비 연관 특성을 극복하기 위해 특별히 고안된 신중하게 선택되고 거의 취약한 중간 단계를 통해 이루어집니다. 적극적인 최적화는 예를 들어 실행 순서를 변경하여 반복적 인 조정이 도움이 될 수 있지만 답을 얻는 데 더 많은 시간이 걸립니다. Pro Tip : 질문을 [Computational Science] (http://scicomp.stackexchange.com/) 사이트에 게시하고 싶을 수 있습니다. –