【问题标题】:ARM Neon: conditional store suggestionARM Neon:有条件的商店建议
【发布时间】:2013-08-21 04:35:59
【问题描述】:

我试图弄清楚如何在 ARM neon 中生成条件存储。我想做的是相当于这条 SSE 指令:

void _mm_maskmoveu_si128(__m128i d, __m128i n, char *p);

它有条件地将d的字节元素存储到地址p。选择器n中每个字节的高位决定是否存储d中对应的字节。

关于如何使用 NEON 内在函数的任何建议? 谢谢

这就是我所做的:

int8x16_t store_mask = {0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

int8x16_t tmp_dest = vld1q_u8((int8_t*)p_dest);
vbslq_u8(source,tmp_dest,store_mask);
vst1q_u8((int8_t*)p_dest,tmp_dest);

【问题讨论】:

  • 您需要分三步完成:首先加载矢量,使用掩码仅修改所需元素,然后将修改后的矢量存储回其原始位置。
  • 抱歉,我还不清楚。我想做的是:使用这样的向量:mask={0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80} ;这是 _mm_maskmoveu_si128(__m128i d, __m128i n, char *p) 中的“n”参数;案子。你说的面具应该如何结构化?我应该做什么操作?谢谢(我以前从未使用过 Neon,所以我有点困惑)。
  • 好的 - 因为它变得越来越复杂,我在下面以答案的形式给出了更详细的解释。

标签: arm store sse neon intrinsics


【解决方案1】:

假设向量包含 16 x 1 字节元素,您将设置一个掩码向量,其中每个元素要么全为 0 (0x00),要么全为 1 (0xff),以确定是否应存储该元素。然后你需要执行以下操作(伪代码):

 init mask vector = 0x00/0xff in each element
 init source vector = data to be selectively stored
 load dest vector from dest location
 apply `vbslq_u8` (`vbit` instruction) with dest vector, source vector and mask vector
 store dest vector back to dest location

【讨论】:

  • 谢谢!我会按照你的解释尝试实现它。
  • 我按照您的伪代码实现了它(请参阅编辑后的问题)。它是否正确?我还有一个疑问。原始代码中的掩码(带有一些我试图转换为 ARM Neon 的 SSE 指令)是:{0,0,0,0,0,0,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80};.为什么可以使用 0x80 而不是 0xff 有什么原因吗?谢谢
  • 这只是一个不同的指令集,所以你必须使用可用的东西。如果需要(一条指令),很容易在 0x80 和 0xff 之间转换掩码 - 或者您可以更改生成掩码的代码,这样就没有必要了。
  • 好的,如果我理解正确,我不能使用与 SSE 指令相同的掩码吗?要在 ARM neon 中获得相应的,我只需将 0x80 替换为 0xff?
  • 是的,这是正确的 - 掩码的最一般形式是全 1/全 0。您只需要将 0x80 元素转换为 0xff,如果需要,可以在一条指令中完成(算术右移 7 位)。
猜你喜欢
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多