2
我试图创建一些类似于SIMD内在函数的宏。我想创建这些宏的原因是我正在使用不支持SIMD的名为“Gem5”的模拟器。类似于SIMD指令的宏
那么,首先,我创建定义为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; \
}
和另一个宏,用于存储在一个浮阵列的结果:
#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;
任何人都可以有一个想法吗?
除Storing宏外,所有错误都消失了,它向我显示以下消息:** error:下标值既不是数组也不是指针,也不是向量dest [0] = a.vec1 **,它指向dest [0 ]。 –
@ A.nechi您是否在'dest'周围添加了大括号?没有它们,它会扩展到'&x [n2] [0]',这肯定不是你想要的。 – Sergio
你真是太棒了:) –