부동 소수점 명령 의 최적화

전환 하 다 http://dev.gameres.com/Program/Other/fudianOp.htm
현재 의 컴 파일 러 는 모두 부동 소수점 명령 에 대해 최적화 할 수 있 지만, 나 는 그래도 당신 이 VC 를 추천 하고 싶 습 니 다. 나 는 VC 의 최적화 가 더욱 좋 고, Pentium 시리즈 프로세서 의 흐름 선 을 더욱 잘 이용 할 수 있다 고 생각 합 니 다.   
·  최적화 개요
·   가능 한 한 당신 의 컴 파일 러 가 부동 소수점 명령 을 처리 하 는 원 리 를 이해 해 야 합 니 다. 한 프로그램 을 완전히 부동 소수점 명령 으로 쓸 수 없고 더 많은 코드 는 고급 언어 를 바탕 으로 한 다 는 것 을 알 아야 합 니 다.
·   프로그램의 관건 을 찾 아 라. 예 를 들 어 순환 등 코드 는 효율 에 진정 으로 영향 을 주 는 곳 이다.
·   관련 코드 를 분리 하 다.
·   메모리 대역 폭 에 대한 수 요 를 주의 하여 해결 하 세 요.
·   비교적 긴 지연 명령 이 자주 사용 되 는 지 확인 하고 가능 한 한 줄인다.
·   필요 하지 않 으 면, 가능 한 한 낮은 정밀 도 를 사용 하 세 요.많은 지령 조작 에서 비교적 낮은 정밀 도 를 사용 하면 비교적 높 은 속 도 를 얻 을 수 있다.이렇게 하면 메모리 도 절약 할 수 있다.
·   당신 의 결 과 를 정밀도 가 허용 하 는 범위 내 에서 변동 시 키 고 정밀도 범 위 를 초과 하 는 연산 은 매우 큰 비용 을 가 져 올 것 입 니 다.
·   fxch 명령 을 잘 사용 하여 유수 선 을 최적화 하 다.
·   필요 할 때 순환 을 펼 치고 명령 의 순 서 를 재 설정 합 니 다.
·   데이터 접근 모드 를 바 꾸 고 접근 할 데 이 터 를 캐 시 에 있 도록 합 니 다.
·  병행 도 를 높이 는 Pentium II 와 Pentium III 는 모두 유수 선 화 된 부동 소수점 단원 만 있 고 합 리 적 인 계산 절 차 는 병행 도 를 높 일 수 있다.이렇게 하면, 너 는 어떤 지령 이 유수 선 화 된 것 인지, 일부 상용 지령 의 지연 이 얼마나 되 는 지 알 아야 한다.아래 문장 을 보십시오. 
        A = B + C + D;
        E = F + G + H;
부동 소수점 명령 을 사용 하여 실현 할 수 있 는 가장 간단 한 알고리즘 1 은: 
        fld B;
        fadd C;
        fadd D;
        fstp A;
        fld F;
        fadd G;
        fadd H;
        fstp E;

위의 알고리즘 에서 거의 모든 명령 은 앞의 명령 의 계산 결과 에 의존 하 는데 이것 은 흐름 선 을 끊 었 다 이 어 질 것 이다.다음 알고리즘 2:
        fld B;
        fadd C;
        fld F;
        fadd G;
        fxch st(1);
        fadd D;
        fld H;
        faddp st(2), st;
        fstp A;
        fstp E;

위의 코드 는 fxch 명령 을 사 용 했 는데 이것 은 부동 소수점 최적화 에서 매우 중요 한 명령 이다.fadd 의 지연 은 세 개의 시계 주기 로 위의 명령 서열 은 거의 모든 지연 을 피 했다. 
쌍 핵의 E2160 1.8G 기기 에서 1 억 번 의 명령 을 테스트 하고 알고리즘 1 의 시간 은 6469 이 며 알고리즘 2 의 시간 은 6750 이다.
·  fxch 명령 은 Pentium II 와 Pentium III 프로세서 에서 fxch 명령 의 실행 에 추가 적 인 시계 주기 소모 가 없습니다.너 는 그것 으로 창고 깊 은 곳 의 요 소 를 방문 할 수 있다. 이것 은 부동 소수점 창고 의 사용 을 더욱 원활 하 게 할 수 있다.   
·  순환 전개 순환 전개 다음 과 같은 장점 이 있 습 니 다.
·   점프 의 빈 도 를 줄 이면 점프 의 대 가 는 그리 뚜렷 하지 않다.
·   인 코딩 을 통일 하여 남 은 레지스터 를 충분히 이용 하여 연산 속 도 를 높 일 수 있다.
·   지령 을 더욱 잘 배정 하고 그 관련 성 을 줄 이 며 유수 선의 설 계 를 최적화 할 수 있 는 공간 을 갖 추고 지령 을 쉽게 배정 하여 디 코딩 과 추출 요구 에 적응 하도록 한다.
   순환 전개 가 몇 가지 명령 만 줄 인 것 이 아니 라 고성능 을 얻 으 려 면 알고리즘 을 재 설계 하고 가능 한 한 많은 자원 을 이용 할 필요 가 있다.   
·  부동 소수점 명령 의 지연 은 많은 부동 소수점 명령 이 한 시계 주기 만 지연 되 는 것 이 아니 지만, Pentium II 와 Pentium III 가 무질서 하 게 실행 하 는 능력 이 있 기 때문에 이러한 지연 이 반드시 뚜렷 한 것 은 아니다.그러나 하나의 지령 이 긴 지연 을 가지 고 있다 면 우 리 는 중점적으로 고려 해 야 한다.다음은 지령 의 지연 과 해결 방법 을 구체 적 으로 논의 하 겠 다.   
·   부동 소수점 저장 지연 부동 소수점 명령 의 저장 작업 은 반드시 추가 적 인 시계 주 기 를 들 여 작업 수 를 기 다 려 야 한다.fld 이후 fst 는 시계 주 기 를 기 다 려 야 합 니 다.fmul, fadd 와 같은 명령 은 보통 세 개의 시계 주기의 지연 이 있 는데, 그 뒤의 fst 작업 은 반드시 부가 적 인 시계 주 기 를 기 다 려 야 한다. 즉, 그것 은 네 개의 시계 주기의 지연 을 견 딜 것 이다.아래 의 예 를 보십시오.
·                      ; Store is dependent on the previous load.
·                      fld meml  ; 1 fld takes 1 clock
·                                ; 2 fst waits, schedule something here
·                      fst mem2  ; 3,4 fst takes 2 clocks
·                      fadd meml ; 1 add takes 3 clocks
·                                ; 2 add, schedule something here
·                                ; 3 add, schedule something here
·                                ; 4 fst waits, schedule something here
·                      fst mem2  ; 5,2 fst takes 2 clocks
·                       
·                      ; Store is not dependent on the previous load:
·                      fld meml  ; 1
·                      fld mem2  ; 2
·                      fxch st(l); 2
·                      fst mem3  ; 3 stores values loaded from meml
·                                ; A register may be used immediately after it has
·                                ; been loaded (with FLD):
·                      fld mem1  ; l
·                      fadd mem2 ; 2,3,4
·   계산 지연 에 자주 사용 되 는 명령, 예 를 들 어 fadd, fsub, fmul 등 은 모두 세 개의 시계 주기의 지연 이 있 습 니 다. 만약 당신 이 그것 의 계산 결 과 를 사용 하려 면 적어도 그 뒤에 두 개의 명령 을 삽입 해 야 합 니 다.fdiv, fsqrt 등 긴 시계 주기 지연 명령 에 대해 서 는 그 뒤에 정수 명령 을 삽입 하 는 것 을 고려 해 야 한다.또한 이러한 명령 의 사용 을 최소 화 하 는 것 도 고려 해 야 한다. 마치 모든 프로세서 에서 부동 소수점 나 누 기 는 시간 이 많이 걸 리 는 것 처럼 AMD 는 심지어 교체 하 는 방법 으로 나 누 기 평화 적 인 방 근 을 계산 해 야 한다. 
·   정수 와 부동 소수점 곱셈 정수 의 곱셈 작업, 예 를 들 어 mul, imul 은 모두 부동 소수점 단원 에서 실 행 된 것 이기 때문에 부동 소수점 명령 과 병행 하여 계산 할 수 없습니다.비록 부동 소수점 곱셈 의 스루풋 은 시계 주기 이지 만 fmul 은 두 개의 시계 주기 마다 한 번 씩 실행 할 수 있 습 니 다. 만약 에 두 개의 fmul 을 함께 쓰 면 시계 주기의 지연 을 무료 로 얻 을 수 있 습 니 다.fmul / fxch / fmul 형식 으로 쓰 면 효과 도 마찬가지 입 니 다.
·   부동 소수점 단원 의 정수 연산 은 정수 파 라 메 터 를 가 진 부동 소수점 명령 을 최대한 피한다. 예 를 들 어 fiadd, fisb.그것들 을 두 단계 로 분해 해서 진행 해 야 한다. 하나의 fild 에 해당 하 는 부동 소수점 명령 을 더 해 야 한다.fiadd 등 명령 은 흐름 선 네 개의 시계 주 기 를 강점 하고 교체 후 에는 두 개의 시계 주 기 를 차지 합 니 다.

좋은 웹페이지 즐겨찾기