类似于SIMD指令的宏

时间:2016-08-11 11:36:58

标签: c macros

我试图创建一些与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; \
  }

和另一个用于将结果存储在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;

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:4)

您的所有宏都可以使用指向[1,2,3,4].arraySum()的指针,但只传递__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的大括号中。

P.S。最好在宏定义中使用__M128_MM_MOVA_PS而不是do { ... } while(0)