3
是否有一個內部允許添加通道中的所有元素?我使用氖將8個數字相乘,我需要對結果進行求和。下面是一些意譯代碼來顯示目前我在做什麼(這也許可以被優化):添加通道中的所有元素
int16_t p[8], q[8], r[8];
int32_t sum;
int16x8_t pneon, qneon, result;
p[0] = some_number;
p[1] = some_other_number;
//etc etc
pneon = vld1q_s16(p);
q[0] = some_other_other_number;
q[1] = some_other_other_other_number;
//etc etc
qneon = vld1q_s16(q);
result = vmulq_s16(p,q);
vst1q_s16(r,result);
sum = ((int32_t) r[0] + (int32_t) r[1] + ... //etc);
是否有「更好」的方式來做到這一點?
'const int32x2_t eightpartsum = vpadd_s32(fourpartsum)'不起作用。我認爲它應該是'const int64x1 eightpartsum = vpaddl_s32(fourpartsum)'。儘管如此,我改變它,它編譯,但它實際上比我以前的方法慢得多.... – NOP
我不認爲你會看到很多改善,除非這是一個嚴密的循環。我已經測試過這個,並且在100000的循環中,我總體上獲得了大約40%的改進。使用霓虹內在函數也很重要,使用最近的編譯器非常重要。我用過gcc 4.7.1。 – auselen
vpadd_s32(fourpartsum)應該是vpadd_s32(四partsum,fourpartsum)。我編輯了這個帖子來修復它。 –