Arm 如何在Neon Intrinsic中使用if条件进行并行操作?

Arm 如何在Neon Intrinsic中使用if条件进行并行操作?,arm,simd,neon,intrinsics,Arm,Simd,Neon,Intrinsics,我问了一个关于vclt_s8比较的问题。 但是,如果我们有此类代码: if(a > b + c) { a = b + c; } else if(a < b - c) { a = b - c; } if(a>b+c){ a=b+c; }否则如果(a

我问了一个关于vclt_s8比较的问题。

但是,如果我们有此类代码:

if(a > b + c) {
    a = b + c;
} else if(a < b - c) {
    a = b - c;
}
if(a>b+c){
a=b+c;
}否则如果(a

如何将其转换为霓虹灯本质?在这种情况下,我们似乎无法进行8运算符并行操作。不是吗?

显然,不能用SIMD进行分支,所以必须看看如何使用掩码以无分支的方式实现这种逻辑。我将只给出伪代码,这样您就得到了一般的想法-编码这应该是相当简单的:

bc = b + c       ; get `(b + c)` in a vector register
mask = a > bc    ; use compare instruction to generate mask (-1 = true, 0 = false)
bc = bc & mask   ; use bitwise AND to zero out elements of `(b + c)` which we do not want
a = a & ~mask    ; use bitwise ANDC to zero out elements of `a` which we do not want
a = a | bc       ; combine required elements into `a` using bitwise OR

bc = b - c       ; get `(b - c)` in a vector register
mask = a < bc    ; use compare instruction to generate mask (-1 = true, 0 = false)
bc = bc & mask   ; use bitwise AND to zero out elements of `(b - c)` which we do not want
a = a & ~mask    ; use bitwise ANDC to zero out elements of `a` which we do not want
a = a | bc       ; combine required elements into `a` using bitwise OR

如果这是一个错误的假设,那么您需要执行一些额外的位操作来实现逻辑
else

显然您不能使用SIMD进行分支,因此您必须了解如何使用掩码以无分支的方式实现这种逻辑。我将只给出伪代码,这样您就得到了一般的想法-编码这应该是相当简单的:

bc = b + c       ; get `(b + c)` in a vector register
mask = a > bc    ; use compare instruction to generate mask (-1 = true, 0 = false)
bc = bc & mask   ; use bitwise AND to zero out elements of `(b + c)` which we do not want
a = a & ~mask    ; use bitwise ANDC to zero out elements of `a` which we do not want
a = a | bc       ; combine required elements into `a` using bitwise OR

bc = b - c       ; get `(b - c)` in a vector register
mask = a < bc    ; use compare instruction to generate mask (-1 = true, 0 = false)
bc = bc & mask   ; use bitwise AND to zero out elements of `(b - c)` which we do not want
a = a & ~mask    ; use bitwise ANDC to zero out elements of `a` which we do not want
a = a | bc       ; combine required elements into `a` using bitwise OR

如果这是一个错误的假设,那么您需要执行一些额外的位操作来实现逻辑
else

让a=2,b=2,c=-1。。。你需要妥善处理这件事!(OP使用的是's8'内部函数,所以我猜签名对他们来说很重要)@James:不一定-这取决于用例-从图像/信号处理的上下文来看,我猜
c
总是肯定的-如果不是这样的话,那么添加一些位指令来实现
else
,就很容易了,正如我上面所说,但如果不需要,您不想这样做并牺牲性能。掩码是有符号的还是无符号的?int8x8_t掩模;或uint8x8_t掩模@邦德武:这真的没关系——每个元素都是1表示“真”(可以将其视为255或-1,以你喜欢的为准),所有0表示“假”。在他们使用无符号掩码结果的地方,请查看接受的答案。@BonderWu:如果这有助于您解决问题,请接受答案let a=2,b=2,c=-1。。。你需要妥善处理这件事!(OP使用的是's8'内部函数,所以我猜签名对他们来说很重要)@James:不一定-这取决于用例-从图像/信号处理的上下文来看,我猜
c
总是肯定的-如果不是这样的话,那么添加一些位指令来实现
else
,就很容易了,正如我上面所说,但如果不需要,您不想这样做并牺牲性能。掩码是有符号的还是无符号的?int8x8_t掩模;或uint8x8炦t掩模@邦德武:这真的没关系——每个元素都是1表示“真”(可以将其视为255或-1,以你喜欢的为准),所有0表示“假”。如果他们使用未签名的掩码结果,请查看您的答案。@BonderWu:如果这有助于您解决问题,请接受答案