2013-09-28 2 views
2

두 파트로 구성된 어셈블리 ARM NEON 코드에서 작업하고 있습니다. 첫 번째 부분은 일부 계산 된 값에 추가 된 기본 주소에서 시작하는 다양한 주소 (메모리)를 계산합니다 (결과는 매우 먼 메모리 주소입니다). 두 번째 부분은 첫 번째 부분에서 계산 된 주소에서 데이터를로드하고 사용해야합니다. 첫 번째와 두 번째 부분은 모두 병렬 처리가 가능하며 NEON 병렬 처리 만 사용합니다.ARM NEON : NEON 레지스터 (Q/D 레지스터)에 포함 된 주소에서 데이터로드

내가 필요한 것은 두 부분을 결합하는 가장 좋은 방법을 찾는 것입니다. 첫 번째 단계에서 출력 된 주소를 사용하여 데이터를로드하십시오.

내가 노력하고 간단한 솔루션입니다 작동하는 것 같다했습니다 무엇

:

//q8 & q9 have 8 computed addresses 
VMOV.32 r0, d16[0] //move addresses to standard registers 
VMOV.32 r1, d16[1] 
VMOV.32 r2, d17[0] 
VMOV.32 r3, d17[1] 
VLD1.8 d28[0], [r0] //load uchar (deinterleaving in d28 and d29) 
VLD1.8 d29[0], [r1] //otherwise do not interleave and use VUZP 
VLD1.8 d28[1], [r2] 
VLD1.8 d29[1], [r3] 
VMOV.32 r0, d18[0] 
VMOV.32 r1, d18[1] 
VMOV.32 r2, d19[0] 
VMOV.32 r3, d19[1] 
VLD1.8 d28[2], [r0] 
VLD1.8 d29[2], [r1] 
VLD1.8 d28[3], [r2] 
VLD1.8 d29[3], [r3] 
... 
//data loaded in d28 and d29 

내가 네 R 레지스터를 사용했습니다이 예에서이 (작거나 더 사용할 수 있습니다), 나는 디 인터리브 해요 배열에서 작업하는 표준 VLD2.8을 시뮬레이트하는 d28 및 d29의 데이터

이 문제 (NEON의 주소 계산 및 해당 주소에서로드)가 자주 발생하므로 더 좋은 방법이 있습니까? 감사합니다.

+0

로드 주소를 계산하는 알고리즘은 무엇입니까? v6 simd 명령어를 사용할 수 있습니까? – auselen

답변

1

당신이 한 것은 효과가 있었지만 그렇게해서는 안됩니다.

ARM-> NEON 전송은 민첩하지만 NEON-> ARM 전송은 쉽지 않습니다. 그들은 매회 약 14 사이클을 낭비하는 파이프 라인 노점을 일으킨다.

귀하의 경우 28 사이클이 낭비됩니다. 그리고 ARM을 사용하여 수학을 수행하는 것이 훨씬 적을 것이라고 확신합니다.

ARM에 고정하십시오. 주소와 같은 다중 32 비트 데이터를 처리 할 때 ARMv7은 듀얼 (트리플) 발행 기능을 많이 사용합니다. (곱셈 제외)