문제

iPhone 3GS에서 ARM 대 썸 코드 성능에 어려운 숫자가 있는지 궁금합니다. 특히 비 플로이트 포인트 (VFP 또는 네온) 코드의 경우 - 썸 모드의 부동 소수점 성능 문제를 알고 있습니다.

더 큰 암 지침의 추가 코드 크기가 성능 위험이되는 지점이 있습니까? 다시 말해, 실행 가능한 코드가 사용 가능한 메모리에 비해 상대적으로 작은 경우 정확히 잰 THONE THUNG MODE에 성능 차이가 켜져 있습니까?

내가 묻는 이유는 "-marm"옵션을 사용하여 Xcode의 Neon 특정 소스 파일에 대해 ARM을 활성화 할 수 있지만 GCC가 X86을 구축하고 있기 때문에 시뮬레이터 빌드를 중단하기 때문입니다. 나는 "엄지 손가락으로 컴파일"을 끄고 그것을 끝내야하는지 궁금했다.

도움이 되었습니까?

해결책

나는 iPhone에 대해 알지 못하지만 엄지 손가락이 팔보다 느리다고 말한 담요 진술은 전혀 맞지 않습니다. 32 비트 너비의 제로 대기 상태 메모리가 주어지면 엄지는 약간 느리게 5% 또는 10%와 같은 숫자입니다. 이제 다른 스토리 인 Thumb2라면 Thumb2가 더 빨리 실행될 수 있다고합니다. iPhone이 무엇을 가지고 있는지 알지 못합니다.
제로 웨이트 스테이트 32 비트 메모리가 부족하지 않으면 결과가 다릅니다. 한 가지 큰 것은 32 비트 너비의 메모리입니다. Gameboy Advance 제품군과 같은 16 비트 와이드 버스에서 실행 중이며 해당 메모리 또는 ROM에 대기 상태가있는 경우 동일한 작업을 수행하는 데 더 많은 엄지 지침이 필요하더라도 엄지 손가락이 쉽게 실행할 수 있습니다.

코드를 테스트하십시오! 관심있는 결과를 제공하는 테스트를 발명하는 것은 어렵지 않습니다. 엄지 손가락이 팔을 날려 버리는 것처럼 팔이 엄지 손가락을 날려 버리는 것은 쉽습니다. 누가 dhrystone이 무엇인지 걱정하는 사람은 오늘날 중요한 코드를 얼마나 빨리 실행 하는가입니다.

ARM의 코드 성능 테스트에서 수년 동안 발견 한 것은 코드와 컴파일러가 큰 요소라는 것입니다. 따라서 Thumb은 동일한 작업을 수행하기 위해 몇 % 더 많은 지침을 사용하기 때문에 이론에서 몇 % 느리게 이론적입니다. 그러나 좋아하는 컴파일러가 끔찍할 수 있고 간단히 스위치 컴파일러를 사용하면 여러 번 더 빨리 실행할 수 있다는 것을 알고 있습니까 (GCC는 해당 범주로 떨어집니다). 또는 동일한 컴파일러를 사용하고 최적화 옵션을 혼합합니다. 어느 쪽이든 도구를 사용하는 것에 대해 똑똑함으로써 팔 / 엄지 손가락 차이를 섀도 할 수 있습니다. 당신은 아마 이것을 알고 있지만 코드를 컴파일하는 방법을 아는 한 가지 방법이 유일한 방법이며 더 나은 성능을 얻는 유일한 방법은 문제에 더 많은 메모리 나 다른 하드웨어를 던지는 것입니다.

당신이 iPhone에 있다면 나는 그 사람들이 LLVM을 사용하고 있다고 들었습니까? 나는 여러 가지 방법으로 LLVM 개념을 좋아하고 성숙 할 때 매일 드라이버로 사용하기를 간절히 원하지만, 내가하고있는 특정 작업에 대해 10-20% (또는 훨씬 더 많은) 코드를 생성하는 것을 발견했습니다. 나는 팔 모드에 있었고, 엄지 손가락 모드를 시도하지 않았으며, L1과 L2 캐시가 켜졌다. 엄지 손가락을 팔과 비교하기 위해 캐시없이 테스트 한 경우 아마도 엄지 손가락이 몇 % 느리게 보일 것입니다. 그러나 당신이 그것을 생각하면 (당시에는 관심이 없었던) 팔 코드보다 두 배나 많은 엄지 코드를 캐시 할 수 있습니다. 작업에 대해 전체적으로 코드가 몇 % 더 많지만 훨씬 더 많은 코드를 캐싱하고 평균 페치 시간 엄지 손가락을 줄이면 눈에 띄게 더 빠를 수 있음을 의미합니다. 나는 그것을 시도해야 할지도 모른다.

LLVM을 사용하는 경우 최적화를 수행 할 여러 장소의 다른 문제가 있습니다. C에서 바이트 코드로 이동하여 최적화 할 수 있고 바이트 코드 자체를 최적화 한 다음 모든 바이트 코드를 병합하고 전체적으로 바이트 코드에서 어셈블러로 이동하면 최적화 할 수 있습니다. 4 개의 소스 파일 만 가지고 있고 기회 당 최적화 레벨이 2 개만 있다고 가정 한 경우, GCC를 사용하면 최적화를 최적화하거나 최적화하지 않는 사람들은 테스트 할 8 개의 조합을 가질 것이며, 실험 수는 거의 더 높습니다. . 당신이 실제로 달릴 수있는 것보다 수백에서 수천까지. 실행중인 하나의 테스트의 경우 C에서 Bytecode 단계에서 Opimizing을 opimizing하지 않고 바이트 코드를 최적화하지 않고 바이트 코드 파일을 하나의 큰 (GER) 파일로 병합 한 후 최적화했습니다. LLC가 ARM으로가는 길에 최적화하면 최상의 결과를 얻었습니다.

결론 ... 테스트, 테스트, 테스트.

편집하다:

바이트 코드라는 단어를 사용하고 있습니다. 올바른 용어는 LLVM 세계에서 비트 코드라고 생각합니다. .BC 파일의 코드는 내 말입니다 ...

LLVM을 사용하여 C에서 팔로 가면 중간에 비트 코드 (BC)가 있습니다. C에서 BC 단계에서 최적화하기위한 명령 줄 옵션이 있습니다. BC는 BC에서 BC에서 파일 당 최적화 할 수 있습니다. 선택한 경우 둘 이상의 BC 파일을 더 큰 BC 파일로 병합하거나 모든 파일을 하나의 큰 BC 파일로 바꿀 수 있습니다. 이러한 결합 파일 각각도 최적화 할 수 있습니다.

지금까지 그 뒤에 몇 가지 테스트 사례 만있는 내 이론은 전체 프로그램/프로젝트가 하나의 큰 BC 파일에있을 때까지 최적화를 수행하지 않으면 최적화기에 정보가있는 경우 최대 금액을 가지고 있다는 것입니다. 일을하십시오. 따라서 최적화없이 C에서 BC로 이동합니다. 그런 다음 모든 BC 파일을 하나의 큰 BC 파일로 병합하십시오. 모든 것을 하나의 큰 BC 파일로 사용하면 Optimizer가 최적화 단계를 수행하여 정보를 최대화하고 최적화의 품질을 최대화하십시오. 그런 다음 최적화 된 BC 파일에서 ARM 어셈블러로 이동하십시오. LLC의 기본 설정은 최적화를 사용하는 것이므로 대상을 최적화하는 방법을 아는 유일한 단계이므로 해당 최적화를 허용하려고합니다. BC에서 BC 최적화는 일반적이며 대상이 아닌 (AFAIK)입니다.

여전히 테스트, 테스트, 테스트가 필요합니다. 계속해서 단계 사이의 최적화를 실험하고 프로그램이 더 빠르거나 느리게 실행되는지 확인하십시오.

다른 팁

성능/코드 크기/전력 소비 트레이드 오프는 ARM/Thumb 의이 PDF를 참조하십시오.

프로파일 가이드 가이드 암 및 엄지 지침 선택
- Rajiv Gupta의 애리조나 대학교 컴퓨터 과학과

엄지 코드는 본질적으로 항상 동등한 암보다 느리게됩니다. Thumb Code가 큰 성능이 우승 할 수있는 한 가지 경우는 칩 메모리 또는 캐시에 코드를 맞추는 데 차이가있는 경우입니다.

코드가 실제로하는 일에 전적으로 의존하기 때문에 성능 차이에 대한 정확한 숫자를 제공하기는 어렵습니다.

Xcode에서 아키텍처 별 컴파일러 플래그를 설정하여 시뮬레이터 빌드를 중단하지 않습니다. Xcode 빌드 설정 설명서를 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top