首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇总表SAD (绝对差值之和)执行霓虹灯时出现总线错误

汇总表SAD (绝对差值之和)执行霓虹灯时出现总线错误
EN

Stack Overflow用户
提问于 2012-10-24 23:17:51
回答 1查看 817关注 0票数 3

我正在尝试编写一个霓虹灯版本的16个uint8_t大小输入的绝对差值之和:

代码语言:javascript
复制
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;
}

我写的霓虹灯代码:

代码语言:javascript
复制
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字节对齐的。

问题的根源是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-25 00:12:33

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

代码语言:javascript
复制
int32_t r[4] = { 0, 0, 0, 0 };

至:

代码语言:javascript
复制
int32_t r[4] = { 0, 0, 0, 0 } __attribute__ ((aligned(16)));

但是请注意,这个例程不太可能是有益的,因为它使用了大量的标量和霓虹灯指令,这意味着它的性能很可能与原始标量实现的性能相似。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13052217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档