簡體   English   中英

類似於SIMD指令的宏

[英]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);

同樣不要忘記將desta括在__M128_MM_MOVA_PS

PS最好在宏定義中使用do { ... } while(0)代替{ ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM