2014-02-18 5 views
0

복잡한 숫자 (대개 두 개의 float로 구성된 구조체가 포함 된 배열을 포함하는 배열이며 아래 참조)를 사용하여 NEON C 내장 함수를 사용하여 속도를 높이고 싶습니다. "복잡한 숫자가 포함 된 네온 내장 함수

typedef struct { 
    Int16 re; 
    Int16 im; 
} Complex; 

이미 12 장을 읽어 :

for(n = 0;n < 1024;n++,p++,ptemp++){ // get cir_abs, also find the biggest point (value and location). 
    abs_squared = (Uns32)(((Int32)(p->re)) * ((Int32)(p->re)) 
        + ((Int32)(p->im)) * ((Int32)(p->im))); 
    // ... 
} 

p는 이런 종류의 배열입니다 : 당신이 나에게 이런 일을 빠르게하는 방법의 예를 줄 수 있다면 좋지 않을까 ARM C 언어 확장 "이지만 여전히 계산을 수행하기 위해 여기에 제 종류의 구조를로드하고 저장하는 방법을 이해하는 데 문제가 있습니다.

+1

를 생성합니다. –

+0

이렇게 : https://codereview.stackexchange.com/questions/42051/neon-intrinsics-with-complex-numberbers – marcel

답변

4

내장재를 사용하여로드 할 때 reim을 다른 레지스터로 분할 한 다음 개별적으로 처리합니다 (예 : vld2*). 위의 코드 연타 3.3

Complex array[16]; 

const int16x8x2_t vec_complex = vld2q_s16((const int16_t*)array); 
const int16x8_t vec_re = vec_complex.val[0]; 
const int16x8_t vec_im = vec_complex.val[1]; 
const int16x8_t vec_abssq = vmlaq_s16(vmulq_s16(vec_re, vec_re), vec_im, vec_im); 

내가 그것을 예를 들어`코드 Review`처럼, 다른 StackExchange 사이트에 게시하는 것이 더 적합하다고 생각

vld2.16 {d18, d19, d20, d21}, [r0] 
vmul.i16 q8, q10, q10 
vmla.i16 q8, q9, q9 
+0

감사합니다, 내가 찾고 있었던 것 같습니다. 그러나 나는 그것으로 오버 플로우를 생산 하겠지? 따라서 int32x4 형식으로 모든 작업을 수행 할 것입니다. – marcel

+0

'int16x8_t'의'int16x4_t' 부분에 유사하게 액세스 할 수 있고'vaddl_s16' /'vmull_s16' /'vmlal_s16'을 사용하여 4 개의 32 비트 결과'int32x4_t'를 생성 할 수 있습니다 (이 연산은 64 비트 SIMD 레지스터를 입력하고 128 비트 SIMD 레지스터). –

+0

예. 'const int32x4_t vec_abssq_lo = vmlal_s16 (vmull_s16 (vget_low_s16 (vec_re), vget_low_s16 (vec_re)), vget_low_s16 (vec_im), vget_low_s16 (vec_im)), ' –

관련 문제