2010-04-19 2 views
12

저는 유체 역학 Navier-Stokes 솔버를 실시간으로 실행해야합니다. 따라서 성능이 중요합니다.고정 소수점 산술로 인해 문제가 발생할 수 있습니까?

지금 당장은 각 실행 시간의 상당 부분을 차지하는 긴밀한 루프를 살펴 보았습니다. 단일 병목 현상이 없습니다. 이러한 루프의 대부분은 부동 소수점 연산을 수행하지만 그 사이에 많은 분기가 있습니다.

부동 소수점 연산은 대부분 더하기, 빼기, 곱셈, 나누기 및 비교로 제한됩니다. 이 모든 작업은 32 비트 부동 소수점을 사용하여 수행됩니다. 내 대상 플랫폼은 최소한 SSE1 지침이있는 x86입니다. 컴파일러가 실제로 SSE 명령어를 생성한다는 것을 어셈블러 출력에서 ​​확인했습니다.

제가 작업하고있는 부동 소수점 값의 대부분은 합리적으로 작은 상한을 가지며 거의 제로 값에 대한 정밀도는 isn이 아닙니다. 매우 중요합니다. 그래서 내 생각이 들었습니다 : 고정 소수점 연산으로 전환하면 일이 빨라질 수 있습니까? 나는 그것을 측정 할 수있는 유일한 방법이 있다는 것을 안다. 그것은 며칠이 걸릴 수도 있기 때문에 미리 성공 확률을 알고 싶다.

둠 (Doom) 시대의 고정 관념은 모두 분노했습니다.하지만 2010 년이 어디서 나올지 확신 할 수 없습니다. 요즘에는 부동 소수점 성능으로 얼마나 많은 실리콘이 펌핑되고 ​​있는지를 고려할 때, 포인트 산술은 여전히 ​​상당한 속도 향상을 줄 것인가? 내 상황에 적용될 수있는 실제 경험이있는 사람이 있습니까?

+2

브랜칭은 아마도 가장 큰 성능 킬러 일 것입니다. 가능한 한 많이 줄여보십시오. 그리고 아니오, 고정 소수점을하지 마십시오. – phkahler

+1

나는 그 반대를 발견했다. 어떤 경우에는 더 많은 부동 소수점 산술을 사용하여 분기를 대체 할 수 있었지만 속도가 느려졌습니다. – Thomas

+1

돌아 오는 길에, 나는 과거에 전문화 된 고정 소수점 SIMD 하드웨어를 사용했고, 목에 커다란 고통이되었습니다! 나는 고정 소수점 산술에 대해 두 번 다시 생각할 것입니다. 고정 소수점 연산의 복잡성을 다루거나 더 큰 문제를 해결하는 데 대부분의 시간을 보내고 싶습니까? 오늘날의 CPU는 더 많은 전력을 소비하고 FPU를 포함하고 있습니다. 부동 소수점 솔루션을 원합니다. 고정 소수점 산술을 생각하는 것보다 파이프 라인을 가득 채우는 데 시간을 할애해야합니다. – Tilo

답변

3

다른 사람들이 말했듯이, 이미 부동 소수점 SIMD를 사용하고 있다면 고정 소수점을 사용하여 많은 개선 효과를 얻을 수 있을지 의심 스럽습니다.

당신은 컴파일러에서 SSE 명령어를 방출한다고 말했지 만, 사용자가 벡터화 된 SSE 코드를 작성하려고 시도한 것처럼 들리지는 않습니다. 나는 보통 컴파일러가 얼마나 좋은지 모르지만 조사 할 항목이다.보는

다른 두 분야는 다음과 같습니다

  1. 메모리 액세스는 - 모든 계산이 SSE에서 수행하는 경우, 다음 캐시 미스는 실제 수학보다 더 많은 시간을 차지 할 수 있습니다.

    1. 예를 들어 다음과 같이 데이터를 미리 가져올 수 있습니다. _mm_prefetch 또는 __builtin_prefetch (컴파일러/플랫폼에 따라 다름).
    2. 입력과 출력 사이의 앨리어싱을 위해 값 비싼 기능을 확인하십시오. 이것들은 여분의 메모리 읽기/쓰기를 초래할 수있다.
    3. 데이터를 다르게 저장하는 것을 고려하십시오. 유체 해석기가 y 좌표와 독립적으로 x 좌표를 계산하면 다른 배열에 저장하는 것이 더 캐시 친화적 일 수 있습니다. 그들은 서로에 대해 해결하는 경우 (예를 들어 X Y X Y ...)
  2. 을 줄이기 인터리빙 고려 - 당신은 당신의 내부 루프를 줄이기에서 성능 이점을 얻을 수 있어야합니다. 루프 종단 검사 수를 줄이기위한 목표는 아닙니다 (많은 사람들이 생각하는 것처럼). 주 이점은 독립적 인 명령어가 인터리브되도록 허용하고 명령어 대기 시간을 숨기는 것입니다. 거기에 here이라는 제목의 VMX 최적화 : 약간의 도움이 될 수있는 레벨을 작성하십시오. Xbox360의 Altivec 지침에 중점을 둡니다.하지만 일부 언 롤링 조언은 SSE에도 도움이 될 수 있습니다.

다른 사람들이 언급 한 것처럼 프로필, 프로필, 프로필. 그리고 아직도 느린 것을 알려주십시오.

PS - 다른 게시물 here에 Gauss-Seidel 대신 매트릭스 SIR을 사용할 것을 확신했습니다. 이제 그것에 대해 생각해 보았습니다. 삼각 대책을 사용하지 않는 이유가 있습니까?

+0

약간의 SSE 어셈블리에서 제 손을 시험해 보았습니다.하지만 컴파일러가 나보다 훨씬 낫습니다.나는 4 개의 동시 곱셈을 수행하기 전에 올바른 위치에있는 값을 얻기 위해 너무 많은 셔플을해야만했다. 그러나 이것은 내 첫 번째 x86 어셈블리 코드 였으므로 아마도 더 많은 성능이 압축 될 수 있습니다. – Thomas

+0

내 시스템은 L2 캐시에 완전히 들어갈 정도로 작습니다. 모두 400kB 미만. 그 이상의 L1 캐시를 고려하는 것이 여전히 가치가 있습니까? – Thomas

+0

컴파일러는'-O3'에서 루프를 풀지 않습니까? 예측을 분기하지 않으면 어쨌든 문제가되지 않습니까? 나는 항상 루프 언 롤링이 과거의 일이라고 생각했다. Red/Black 방식을 사용하여 SOR 솔버에서 쓰기/읽기 종속성을 제거 할 수있었습니다. 그것은 큰 차이를 만들었습니다. (그 프리젠 테이션에서 이름을 지정하지 않아야하는 언어 기능에 대해 이야기했을 때 나는 "goto는 여기서 무엇을 할 것이고 템플릿을 사용하면 좋을 것"이라고 생각했습니다. 다음 슬라이드 : 템플릿 메타 프로그래밍.) 어쨌든, 저는 "수동"(즉, 템플릿) 시도를 펼치십시오. – Thomas

5

부동 소수점 스틱. 고정 소수점은 실제로 8 비트 또는 16 비트 내에서 작업하고 SIMD (이미지 처리 및 오디오가 이에 대한 일반적인 사용 사례)를 사용할 수있는 경우에만 유용합니다.

최신 CPU는 일반적으로 2 개의 FPU를 가지고 있으며 클럭주기 당 최대 2 개의 FP 명령을 처리 할 수 ​​있습니다. 또한 4 방향 FP SIMD (SSE)를 사용하여 최적화 할 수도 있습니다.

아직 성능이 좋지 않은 경우 인텔의 ICC와 같은 더 나은 컴파일러를 사용해보십시오. 또한 64 비트 인텔 실행 파일은 64 비트 모델의 레지스터 수가 증가하여 32 비트보다 약간 빠른 경향이 있으므로 가능한 경우 64 비트 용으로 빌드하십시오.

그리고 물론 핫스팟이 어디에 있는지 알 수 있도록 코드도 프로파일해야합니다. 어떤 OS를 사용하고 있는지는 알 수 없지만 Windows에서는 VTune, Linux에서는 Zoom, Mac OS X에서는 Shark을 사용하면 성능 병목 현상을 쉽고 빠르게 찾을 수 있습니다.

0

귀하의 기계는 부동 소수점에 꽤 잘 최적화되어 있으므로 고정 소수점 분수로 많이 저장하지 않을 것입니다.

병목 현상이 하나도 없지만 여러 개가있을 수 있다고 말하면, 그 중 하나를 면도하면 남은 시간에 더 많은 비율을 차지하여주의를 끌기 때문에 면도 할 수 있습니다 그들도.

아마도이 작업을 수행했을 것입니다.하지만 시간이 많이 걸리는 기능이 가능한 빠르지 만 필요 이상으로 호출되는 것은 아닙니다.

+0

"... 거기에 가고 싶지 않습니다. ... 고정 소수점 분수로 이동하면 절약하지 못할 것입니다." 이 문제를 뒷받침 할만한 참고 자료 나 직접 경험이 있습니까? – Thomas

+1

@ 토마스 : 개인적인 경험. FP 프로세서가 유비쿼터스 화되기 전에 그래픽에서 고정 소수점 분수를 광범위하게 사용했습니다. 저는 Apollo에서 Instrumentation Lab에 있었을 때, 전체 네비게이션 시스템은 고정 소수점 분수로 수행되었습니다. 이제 정규화, 추가, 곱하기 및 NaN 탐지가 풀 클록 속도의 조합 논리에서 가능한 한 많이 수행되는 온칩 FP 하드웨어를 사용하면 추측하고 있지만 곱셈과 나눗셈이 동일 할 것입니다. 볼 파크, 부동 포인트 대 고정 포인트 + 이동. –

관련 문제