2012-03-15 5 views
3

Neon 명령어를 사용하여 ARM 어셈블러로 작성된 코드 조각의 성능을 높이려고합니다. (?) http://pulsar.webshaker.net/ccc/sample-706454b3ARM Neon 어셈블러 - 이상한 파이프 라인 문제

내가 라인 "n.34-0 1C의 N0"갑자기 NEON 장치는 10주기를 기다려야 할 것 같다 것으로 나타났습니다 :

테스트를 위해 내가 계산이 계산기를 사용합니다. 그 이유가 무엇일까? 아니면 계산기의 버그 일 뿐인가?

또한 ARM/Neon 어셈블러의 성능을 향상시키는 방법에 대한 일반적인 정보가 필요합니다.

대상은 ARM Cortex-A9입니다. 컴파일을 위해 인라인 어셈블러와 함께 최신 android-ndk를 사용합니다. 고맙습니다.

답변

2

, 다음은 모든 NEON이 될하기위한 것입니다 여부를 평가 액세스에 32 비트 전용 메모리 먼저 C에 코드를 다시 작성하는 것이 좋습니다. BitBank가 맞습니다. NEON은 D4를 기다려야합니다.

네온에는로드/저장 대기열이 있기 때문에 10 사이클을 기다려야합니다. 그리고 큐는 사용자가 D4를 필요로 할 때 그래서, 당신이 명령 의 실행을 위해 대기해야하지만 이전의 모든로드/스토어 명령이 밀려 실행해야이 명령을 실행하려면

vld1.64 d4, [r7, :64] 

전에 다른 명령으로 가득 NEON로드/저장 대기열에 저장합니다.

3

NEON 장치는 이전 NEON 명령 (n.33-0 1c n0)에서로드 된 레지스터 (D4)를 참조하기 때문에 해당 명령을 기다려야합니다. 로드는 순간적이지 않고 파이프 라이닝으로 인해 캐시에서 오는 경우에도 데이터 가용성에 지연이 있습니다. 레지스터를로드 한 직후 레지스터를 사용하지 않으려면 ARM 및 NEON 명령어를 모두 다시 정렬해야합니다. 그렇지 않으면 낭비되는 사이클 (파이프 라인 스톨)으로 끝납니다.

+1

캐시가 손상되면 위험이 단지 1 ~ 2 사이클입니다. 이 경우에는 다른 것입니다. –

1

NEON이 작업을 수행하는 동안 ARM을 통해 메모리에 액세스하면 안됩니다. NEON에서 전체 브레이크가 발생합니다.

분명히, 당신은 위의 이유로 치명적인 어떤 종류의 병렬 처리를 시도하고 있습니다.

게다가, 너무 많은 ldrb가 있습니다. ARM에 대한 바이트 액세스 역시 거의 죄악입니다.

나는 완전히이 조금 더 complexe 인 사실

+0

코멘트 주셔서 감사합니다. 하나의 Byte 만 필요하므로 한번에 32Bit을 읽으면 모든 것을 Shift/AND로 다시해야하는데 이것은 느려질 것입니다. 코드는 C & ARM 어셈블러로 이미 있으며 Neon 명령어로 속도를 향상시킬 수 있는지 확인해야합니다. 이론적으로 30 ~ 40 % 빨라야합니다. 어떤 작업을 병렬로 수행 할 수 있습니다. ARM 산술 및 Neon로드/저장 (네온 산술 및 ARM로드/저장이 아닙니까?) – HectorLector

+0

당신은 이것을 믿지 않을 것입니다 : 32 비트 읽기 + 마스킹은 바이트 읽기보다 훨씬 빠릅니다. –

+0

병렬 처리는 잊어 버리십시오. Neon에서 ARM으로 값을 이동하면 파이프 라인이 11 사이클을 낭비하게됩니다. ARM은 Neon이 전체 작업을 수행하는 동안 제어 장치 역할 만합니다. –