這是我在車道將所有int16x4元素代碼,添加所有INT32元素車道:如何使用NEON內在
#include <arm_neon.h>
...
int16x4_t acc = vdup_n_s16(1);
int32x2_t acc1;
int64x1_t acc2;
int32_t sum;
acc1 = vpaddl_s16(acc);
acc2 = vpaddl_s32(acc1);
sum = (int)vget_lane_s64(acc2, 0);
printf("%d\n", sum);// 4
我嘗試添加所有int32x4元素車道。
,但我的代碼看起來效率低下:
#include <arm_neon.h>
...
int32x4_t accl = vdupq_n_s32(1);
int64x2_t accl_1;
int64_t temp;
int64_t temp2;
int32_t sum1;
accl_1=vpaddlq_s32(accl);
temp = (int)vgetq_lane_s64(accl_1,0);
temp2 = (int)vgetq_lane_s64(accl_1,1);
sum1=temp+temp2;
printf("%d\n", sum);// 4
是否有簡單明瞭的方式來做到這一點?我希望編譯後的LLVM彙編代碼簡單明瞭。我也希望sum
的最終類型是32位。
我用ellcc交叉編譯器基於LLVM編譯器的基礎架構來編譯它。
我在stackoverflow上看到了類似的問題(Add all elements in a lane),但內部的addv
在我的主機上不起作用。
你爲什麼覺得你的代碼看起來效率低下?我沒有看到複雜的循環或分支。只是順序。除了您想要解決的效率之外,還有其他問題嗎?即代碼是做它應該做的事情? – ryyker
由於LLVM彙編代碼在編譯後很複雜,所以我想知道是否有更簡單的方法來完成此操作,如霓虹燈內在。 – Shun
我的目標的問題是通過pass自動生成LLVM-IR,如果LLVM-IR代碼複雜,對我來說很困難。 – Shun