gpt4 book ai didi

arm - neon 实现汇总 SAD(绝对差值之和)时出现总线错误

转载 作者:行者123 更新时间:2023-12-02 11:12:22 28 4
gpt4 key购买 nike

我正在尝试编写 16 个 uint8_t 大小输入的绝对差和的 NEON 版本:

inline static int f_sad_16(const uint8_t* a, const uint8_t* b)
{
int sad = 0;
for (int i = 0; i < 16; i++) {
sad += abs(static_cast<int>(a[i]) - static_cast<int>(b[i]));
}
return sad;
}

我写的 NEON 代码:

inline static int f_sad_16_neon(const uint8_t* a, const uint8_t* b)
{
int32_t r[4] = { 0, 0, 0, 0 };
uint8x16_t va, vb, vr;

va = vld1q_u8(a);
vb = vld1q_u8(b);

vr = vabdq_u8(va, vb);

uint16x8_t vr1 = vpaddlq_u8 (vr );
uint32x4_t vr2 = vpaddlq_u16(vr1);
uint64x2_t vr3 = vpaddlq_u32(vr2);

vst1q_u64 (reinterpret_cast<uint64_t*>(r), vr3);

return r[0] + r[2];
}

由于某种原因,我收到总线错误。我的测试程序对两个输入使用 __attribute__ ((aligned (16))) gcc 指令,我可以通过分配给它们的内存地址看到输入是 16 字节对齐的。

问题的根源是什么?

最佳答案

您需要确保 r 正确对齐 - 更改:

int32_t r[4] = { 0, 0, 0, 0 };

至:

int32_t r[4] = { 0, 0, 0, 0 } __attribute__ ((aligned(16)));

但请注意,此例程不太可能有用,因为它使用大量标量和 NEON 指令,这意味着它很可能具有与原始标量实现类似的性能。

关于arm - neon 实现汇总 SAD(绝对差值之和)时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052217/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com