Вот мой код для добавления всех int16x4 элемента в полосе:Как добавить все int32 элемента в полосе с использованием неона присущей
#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 для ее компиляции.
Я видел подобный вопрос (Add all elements in a lane) на stackoverflow, но встроенный addv
не работает на моем хосте.
Почему вы чувствуете, что ваш код выглядит неэффективным? Я не вижу сложного цикла или ветвления. Просто последовательный. И есть ли проблема, кроме эффективности, которую вы пытаетесь решить? т. е. делает ли код то, что он должен делать? – ryyker
Поскольку код сборки LLVM усложняется после компиляции, поэтому я хотел бы знать, есть ли более простой способ сделать это, например, неоновый внутренний. – Shun
Проблема для моей цели - автоматически генерировать LLVM-IR через проход, мне сложно, если код LLVM-IR сложный. – Shun