2016-08-11 1 views
2

SIMD 내장 함수와 비슷한 매크로를 만들려고합니다. 그리고이 매크로를 만들고 싶은 이유는 SIMD를 지원하지 않는 "Gem5"라는 시뮬레이터로 작업하고 있기 때문입니다.SIMD 명령어와 비슷한 매크로

#define __M128_MM_ADD_PS(dest, a,b) \ 
    {         \ 
    (dest)->vec1 = (a)->vec1 + (b)->vec1; \ 
    (dest)->vec2 = (a)->vec2 + (b)->vec2; \ 
    (dest)->vec3 = (a)->vec3 + (b)->vec3; \ 
    (dest)->vec4 = (a)->vec4 + (b)->vec4; \ 
    } 
: 그때는 ADD 매크로를 만든

typedef struct 
    { 
    float vec1; 
    float vec2; 
    float vec3; 
    float vec4; 
    } __m128 __attribute__((aligned(16))); 

:

음, 우선, 나는 4의 벡터 그래서 같은 점 요소를 단 정밀도 부동 포장 정의하는 구조를 만들어

및 float 배열의 결과를 저장하기위한 다른 매크로

#define __M128_MM_MOVA_PS(dest, a) \ 
    { \ 
    dest[0] = a->vec1; \ 
    dest[1] = a->vec2; \ 
    dest[2] = a->vec3; \ 
    dest[3] = a->vec4; \ 
    } 

및 행 그들에게 나는 __m128으로 변수와 결과를 저장하는 float 배열, 이런 식으로 (약간의 예) 선언했습니다

void foo(){ 
__m128 bfly0_rv, x_n2_vec, x_N2_vec; 
float *x; 

__M128_MM_ADD_PS(bfly0_rv,x_n2_vec,x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2],bfly0_rv); 
} 

을 나는 오류 메시지의 이러한 종류 받고 있어요 :

을 ADM 매크로 오류 : '->'('__m128'을 (를) 가지고 있음)의 유형 인수가 올바르지 않습니다. (dest) -> vec4 = (a) -> vec4 + (b) -> vec4; 수납 매크로 오류

: 잘못된 형식 인수 '->'('__m128'를 가지고) 최종 도착 [3] = A-> vec4;

누구나 그에 대한 아이디어가 있습니까?

답변

4

모든 매크로는 __m128에 대한 포인터로 작동하지만 __m128이 아닌 __m128 * 만 전달하면됩니다. 그냥 &와 매크로 인수를 . 내부 매크로 ->를 교체하거나 앞에 추가 :

__M128_MM_ADD_PS(&bfly0_rv, &x_n2_vec, &x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2], &bfly0_rv); 

는 또한 __M128_MM_MOVA_PS에 괄호로 desta 동봉하는 것을 잊지 마세요.

P. 매크로 정의에 { ... } 대신 do { ... } while(0)을 사용하는 것이 좋습니다.

+0

저장 매크로를 제외하고 모든 오류가 사라졌습니다. ** 오류 : 첨자 값은 배열도 포인터도 벡터도 아닙니다. dest [0] = a.vec1 ** 그리고 dest [0 ]. –

+0

@ A.nechi'dest '에 중괄호를 추가 했습니까? 그것들이 없으면 그것은 당신이 원하는 것이 아닌'& x [n2] [0]'로 확장됩니다. – Sergio

+0

너 정말 대단해. :) –