[英]Macro similar to SIMD instruction
我試圖創建一些類似於SIMD內部函數的宏。 我之所以要創建這些宏,是因為我使用的是不支持SIMD的模擬器“ Gem5”。
好吧,首先,我創建了一個結構,該結構定義了一個由4個壓縮單精度浮點元素組成的向量,如下所示:
typedef struct
{
float vec1;
float vec2;
float vec3;
float vec4;
} __m128 __attribute__((aligned(16)));
然后創建了ADD宏:
#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; \
}
另一個用於將結果存儲在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);
}
並且我收到這些錯誤消息:
對於ADD宏錯誤:'->'(具有'__m128')的無效類型參數(dest)-> vec4 =(a)-> vec4 +(b)-> vec4;
對於存儲宏錯誤:'->'(具有'__m128')的無效類型參數dest [3] = a-> vec4;
有人對此有想法嗎?
您所有的宏都可以使用指向__m128
指針,但是您只傳遞__m128
而不是__m128 *
。 只需將->
替換為即可.
在宏中或在&
前面加上宏參數:
__M128_MM_ADD_PS(&bfly0_rv, &x_n2_vec, &x_N2_vec);
__M128_MM_MOVA_PS(&x[n2], &bfly0_rv);
同樣不要忘記將dest
和a
括在__M128_MM_MOVA_PS
。
PS最好在宏定義中使用do { ... } while(0)
代替{ ... }
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.