ARM NEON本质:矢量的极限值为0-255

时间:2018-07-24 07:25:40

标签: c arm simd intrinsics neon

说我有一个int16x8_t向量。我想将其值的范围限制为0-255,并将其转换为uint8x8_t向量。将向量读入数组并以传统的非本征方式进行操作,这太慢了。有没有更快的方法?

3 个答案:

答案 0 :(得分:3)

您需要的只是内在函数中的一条指令vqmovun.s16vqmovun_s16

向量饱和(q)无符号变窄

int16x8_t input;
uint8x8_t result;
.
.
.
.
.
.

result = vqmovun_s16(input);

任何负数元素都将替换为0,而所有大于255的数字都将被设置为255,然后缩小为无符号的8位元素,并且所有这些都在一个周期内完全满足您的需求。

还有vqmovn_s16可以对值进行签名(-128〜127)

PS:您是否正在将YUV转换为RGB?那是我需要此指令的一次。

答案 1 :(得分:0)

没关系,我找到了办法。它仍然很慢,但是可以工作:

int16x8_t q_result;
int16x8_t max_value = vdupq_n_s16(255);
int16x8_t min_value = vdupq_n_s16(0);
uint16x8_t max_mask, min_mask;
max_mask = vcgtq_s16(q_result, max_value);
min_mask = vcltq_s16(q_result, min_value);
q_result = vbslq_s16(max_mask, max_value, q_result);
q_result = vbslq_s16(min_mask, min_value, q_result);

答案 2 :(得分:0)

您可以只使用event.returnValue / vmaxq_s16

vminq_s16