测试NEON SIMD寄存器是否在所有通道上均衡

时间:2016-12-06 21:31:31

标签: arm simd intrinsics neon

我正在使用Neon Instrinics与clang。

我想在所有通道上测试两个$(document).ready(function() { $("#contact-form").on("submit", function(e) { e.preventDefault(); var sendData = $(this).serialize(); $.ajax({ type: "POST", url: "orderform.php", data: sendData + "&select_param1=" + $("#qty option:selected").text() + "&select_param2=" + $("#qty1 option:selected").text(), success: function(data) { $(".response_msg").text(data); $(".response_msg").slideDown(); } }); }); }); SIMD值是否相等。 所以不是4个测试结果,而是一个结果告诉我A和B是否对所有车道都相同。

在英特尔AVX上,我会使用类似的东西:

uint32x4_t

对NEON SIMD执行全通道相等测试的好方法是什么?

我假设我需要跨越车道运行的内在函数。 ARM Neon有这些功能吗?

2 个答案:

答案 0 :(得分:3)

试试这个:

uint16x4_t t = vqmovn_u32(veorq_u32(a, b));
vget_lane_u64(vreinterpret_u64_u16(t), 0) == 0

我希望编译器在实现该测试时能够找到特定于目标的优化。

我刚刚意识到了一些方便的东西......

如果您想测试所有通道是否小于2的幂,您可以将vqmovn_u32()替换为vqshrn_n_u32()来执行此操作;对于使用vqrshrn_n_s32()的签名类型,我相信这可以扩展到+/- 2的幂(包括下限,不包括上限)。例如,您应该能够使用vqrshrn_n_s32(x, 1)在单个测试中接受-1和0。

答案 1 :(得分:1)

如果您只是想知道两个向量是否相等,请尝试以下代码:

result = vceqq_u32(a, b);
if (vminvq_u32(result ) != 0xffffffff) {
     // not equal
} else {
     // equal
}

请参阅ARM手册:CMEQUMINV