Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARM并行指令ASX和SAX的用途?_Assembly_Parallel Processing_Arm - Fatal编程技术网

Assembly ARM并行指令ASX和SAX的用途?

Assembly ARM并行指令ASX和SAX的用途?,assembly,parallel-processing,arm,Assembly,Parallel Processing,Arm,有人能解释一下什么时候使用这个方法是有益的吗?在什么情况下/算法需要将半字呼出,然后加上和减去上/下半字?以下是每种情况的解释: 澳大利亚证券交易所 交换Rm的半字,然后添加上半字并减去下半字 萨克斯 交换Rm的半字,然后减去上半字并添加下半字 就像Russ Schultz在评论中说的那样,它将是有用的音频编码。它的使用方式如下: ldr r1, [r0] ; R1 = (L-R):(L+R) shasx r1, r1, r1 ; R1 = ((L-R)+(L+R))/2:(

有人能解释一下什么时候使用这个方法是有益的吗?在什么情况下/算法需要将半字呼出,然后加上和减去上/下半字?以下是每种情况的解释:

澳大利亚证券交易所
  • 交换
    Rm
    的半字,然后添加上半字并减去下半字
萨克斯
  • 交换
    Rm
    的半字,然后减去上半字并添加下半字

就像Russ Schultz在评论中说的那样,它将是有用的音频编码。它的使用方式如下:

ldr r1, [r0]      ; R1 = (L-R):(L+R)
shasx r1, r1, r1  ; R1 = ((L-R)+(L+R))/2:((L+R)-(L-R))/2 
                  ;    = (2L/2):(2R/2)
                  ;    = L:R  
ror r1, r1, #16   ; R1 = R:L
str r1, [r0]

第三个操作数的上半字和下半字的交换是必要的,这样两个不同的分量就可以相互加减。如果没有交换,您将得到
((L-R)+(L-R))/2:((L+R)-(L+R))/2=(2(L-R)/2:(0/2)=(L-R):0

请注意,这是一个旧的ARMv6 SIMD指令,而不是NEON(官方的“高级SIMD”,正是为了消除它与旧指令之间的歧义)。我假设它与一些2x2矩阵运算有关,但我不能马上想清楚……对我来说,FFT蝴蝶是什么样子,但我不能确定。音频处理通常在两个通道中有L+R和L-R,我可以看到这条指令对此很有帮助。虽然有一个共同的问题是两个通道颠倒,但并不完全确定交换部分对什么有用。也许还有另一条指令不执行交换,但仍然执行add/sub?您将获得一个向上投票的示例程序集格式!但是更多关于这个主题,如果指令没有进行交换,那么您就不必进行ROR,这不是更有用吗?我的意思是,如果你要设计一条指令来加速这类计算,你会一直这样做吗?@Russchultz如果没有交换指令,这条指令根本不起作用。您将在相同的组件之间进行加法/减法运算。所以你可以得到
(L-R):0
或者
0:(L+R)
。如果您不介意反转该阶段,那么可以使用SHSAX和get-R:-L,而无需使用ROR。