2013-07-18 5 views
4

sysctlbyname("hw.cpusubtype", ...)을 쿼리하여 iOS 장치가 어떤 종류의 CPU를 실행하는지 알아내는 것은 상당히 쉽지만 CPU가 실제로 가지고있는 기능을 파악할 수있는 확실한 방법이없는 것 같습니다 (VFP, NEON, Thumb 등) . 누군가 이렇게 할 수있는 방법을 생각할 수 있습니까?런타임시 iOS에서 VFP/NEON/Thumb/...을 감지하는 방법이 있습니까?

기본적으로 필요한 것은 Linux/Android의 getauxval(AT_HWCAP)과 유사합니다.이 마스크는 CPU에서 지원하는 기능의 비트 마스크를 반환합니다. 주의 할

몇 가지 :

  1. 정보 운영 체제에서 실행시 검색해야합니다. 전처리 기가 정의되지 않습니다.
  2. 뚱뚱한 바이너리는 해결책이 아닙니다. 나는 정말로 을 수행한다.은 ARM v6 바이너리에서이 내용을 알아야 할 필요가있다.

미리 감사드립니다.

+0

나는'man sysctl'을 보았지만 나 자신을 발견하지 못했습니다. 팻 바이너리가 해결책이되지 못하는 이유는 (a) 크기가 크게 증가했기 때문입니다. (b) 앱에서 사용할 아키텍처 버전이 실제로는 아니지만 고객이 결정한 것입니다. 따라서 ARM v6 바이너리를 선택하면 해당 바이너리가 v7 및 v7에서 작동해야합니다. 마찬가지로 ARM v6 및 v7s 코드가 포함 된 뚱뚱한 바이너리도 v7에서 작동해야합니다. –

+0

합리적인 수의 iOS 장치를 감안할 때, 각각의 사용 가능한 CPU 기능을 문서화하고 나열하고, 런타임에 UIDevice 클래스를 사용하여 어떤 장치를 검색 하는지를 간단하게 파악할 수 있습니다 사용 가능한 기능 목록을 검색합니다. – mbrenon

답변

1

accelerate.framework를 통해 행렬 플로트 곱셈을 수행하고 실행 시간을 측정합니다. 차이는 네온과 VFP 기반 수학 사이에서 충분히 커질 것입니다.

Thumb은 항상 있으며 NEON은 armv7 = Thumb2를 의미합니다.

2

sysctlbyname에는 "hw.optional.neon"이 있습니다. "hw.optional.vfp_shortvector"를 제외하고 VFP의 이름이 표시되지 않습니다.이 기능은 사용되지 않는 기능입니다.

0

먼저 iOS 용 armv6 바이너리를 지원해야하는지 여부를 신중하게 고려하십시오. 게시 된 버전 공유 통계에 따르면 98.5 %의 iOS 기기가 iOS 5.0 이상을 실행 중이며 이는 armv6 기기를 지원하지 않습니다 (armv6 바이너리는 현재 iOS 버전에서 계속 실행되지만 분명히 모든 새로운 앱은 armv7을 타겟팅해야합니다. 고객이 오늘 iOS 용 armv6 바이너리를 출하하지 않는 이유는 거의 없습니다.)

마찬가지로 코드 크기에 대한 우려는 잘못 배치됩니다. fat 라이브러리를 제공하고 고객이 armv6 바이너리를 빌드하면 라이브러리의 armv6 비트 만 응용 프로그램에 빌드됩니다. 게다가, 코드 크기는 대개 응용 프로그램 번들 크기의 거의 사소한 부분입니다. 대부분의 응용 프로그램 크기는 다른 자원에서 비롯됩니다.

확인. 모든 것을 제외하고, 당신이 정말로 이것을 추구하고 싶다면 VFP와 엄지가 모든 iOS 장치에서 지원되므로 지원을 확인할 필요가 없습니다. Eric Postpischil이 제안한 방법을 사용하여 NEON 및 thumb-2를 확인할 수 있습니다 (모든 armv7 iOS 장치에는 NEON이 지원되므로 NEON의 가용성은 엄지 2의 가용성과 정확히 일치 함).