두 파트로 구성된 어셈블리 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의 주소 계산 및 해당 주소에서로드)가 자주 발생하므로 더 좋은 방법이 있습니까? 감사합니다.
로드 주소를 계산하는 알고리즘은 무엇입니까? v6 simd 명령어를 사용할 수 있습니까? – auselen