2010-08-14 5 views
5

(What is the fastest way to convert float to int on x86)에서 설명한 내용 (http://www.stereopsis.com/FPU.html)을 읽었습니다. 느린 간단한 캐스트 (아래의 스 니펫 참조)가 ARM 아키텍처에도 적용되는지 아는 사람이 있습니까?ARM (iPhone 3GS/4)의 부동 소수점 변환 및 부동 소수점

inline int Convert(float x) 
{ 
    int i = (int) x; 
    return i; 
} 

FPU 기사에서 언급 한 몇 가지 트릭을 적용하려면 부동 소수점 연산의 정밀도를 설정해야합니다. ARM에서 어떻게 할 수 있습니까?

ARM 아키텍처에서 가장 빠른 부동 소수점 변환은 무엇입니까?

감사합니다.

+1

실제 코드에서'Convert'와 같은 함수의 이름을 지정하지 마십시오 : P –

+0

@Billy : 당신의 요지를 얻었습니다. 플로어가 더 좋을 것이다 : –

+0

보통 15 일 전의 일에 x86에서 성능 문제가 있었다. 보통 typecasts (int)가 떠돌 때 일어난다. 이것은 fpu 레지스터의 기본 float2int가 플로어 였기 때문이다. 하지의 주위에. 그래서 그 시대의 코드가 빠르기 때문에 특별 어셈블리가 작성되었습니다. 이 시간에서 가져온 모든 코드는 float에서 integer 로의 변환이 floor 연산과 normal round를 사용하기를 기대합니다. 그러나 floor 함수를 사용하여 더블 히트 한 다음 int로 캐스트하거나 int로 캐스트 (가장 가까운 것으로 반올림) 할 수 있습니다. – Medran

답변

10

짧은 버전 "아니요"

그 기사는 고대의 것으로, ARM은 물론, 현대 x86 시스템에도 적용되지 않습니다. VFP/NEON 레지스터에서 범용 레지스터로 데이터를 옮기는 중소 실속이 있지만 ARMv7 (iPhone 3GS/4)에서는 정수로 간단하게 캐스트 할 수 있습니다. 그러나 float 데이터가 VFP/NEON 레지스터에서 수행 된 계산에서 비롯된 것이라면 변환 수행 방법에 상관없이 해당 이동 비용을 지불해야합니다.

이것이 프로그램의 주요 병목임을 보여주는 흔적이 없다면 이것이 최적화를위한 유리한 길이라고 생각하지 않습니다. 그렇다면 가장 빠른 전환은 당신이하지 않는 전환입니다. 프로그램에서 전환을 제거하는 알고리즘 방식을 찾는 것이 더 나을 것입니다.

당신이 할 경우 진정으로는 NEON에서 데이터를 이동하지 않고 두 개 또는 네 개의 정수 의 벡터에 두 개 또는 네 개의 부동 소수점 숫자의 벡터를 변환 vcvt.i32.f32 명령, 조사, 변환을 최적화 할 필요 레지스터 (따라서, 내가 언급 한 실속을 초래하지 않고). 물론 수익성있는 최적화를 위해서는 NEON에서 정수 계산을 수행해야합니다.

질문 : 당신은 무엇을하려고합니까 정말로하려고합니까? 왜 당신은 더 빠른 float-> int 변환이 필요하다고 생각합니까?