저는 유체 역학 Navier-Stokes 솔버를 실시간으로 실행해야합니다. 따라서 성능이 중요합니다.고정 소수점 산술로 인해 문제가 발생할 수 있습니까?
지금 당장은 각 실행 시간의 상당 부분을 차지하는 긴밀한 루프를 살펴 보았습니다. 단일 병목 현상이 없습니다. 이러한 루프의 대부분은 부동 소수점 연산을 수행하지만 그 사이에 많은 분기가 있습니다.
부동 소수점 연산은 대부분 더하기, 빼기, 곱셈, 나누기 및 비교로 제한됩니다. 이 모든 작업은 32 비트 부동 소수점을 사용하여 수행됩니다. 내 대상 플랫폼은 최소한 SSE1 지침이있는 x86입니다. 컴파일러가 실제로 SSE 명령어를 생성한다는 것을 어셈블러 출력에서 확인했습니다.
제가 작업하고있는 부동 소수점 값의 대부분은 합리적으로 작은 상한을 가지며 거의 제로 값에 대한 정밀도는 isn이 아닙니다. 매우 중요합니다. 그래서 내 생각이 들었습니다 : 고정 소수점 연산으로 전환하면 일이 빨라질 수 있습니까? 나는 그것을 측정 할 수있는 유일한 방법이 있다는 것을 안다. 그것은 며칠이 걸릴 수도 있기 때문에 미리 성공 확률을 알고 싶다.
둠 (Doom) 시대의 고정 관념은 모두 분노했습니다.하지만 2010 년이 어디서 나올지 확신 할 수 없습니다. 요즘에는 부동 소수점 성능으로 얼마나 많은 실리콘이 펌핑되고 있는지를 고려할 때, 포인트 산술은 여전히 상당한 속도 향상을 줄 것인가? 내 상황에 적용될 수있는 실제 경험이있는 사람이 있습니까?
브랜칭은 아마도 가장 큰 성능 킬러 일 것입니다. 가능한 한 많이 줄여보십시오. 그리고 아니오, 고정 소수점을하지 마십시오. – phkahler
나는 그 반대를 발견했다. 어떤 경우에는 더 많은 부동 소수점 산술을 사용하여 분기를 대체 할 수 있었지만 속도가 느려졌습니다. – Thomas
돌아 오는 길에, 나는 과거에 전문화 된 고정 소수점 SIMD 하드웨어를 사용했고, 목에 커다란 고통이되었습니다! 나는 고정 소수점 산술에 대해 두 번 다시 생각할 것입니다. 고정 소수점 연산의 복잡성을 다루거나 더 큰 문제를 해결하는 데 대부분의 시간을 보내고 싶습니까? 오늘날의 CPU는 더 많은 전력을 소비하고 FPU를 포함하고 있습니다. 부동 소수점 솔루션을 원합니다. 고정 소수점 산술을 생각하는 것보다 파이프 라인을 가득 채우는 데 시간을 할애해야합니다. – Tilo