gpt4 book ai didi

performance - Matlab 性能 : comparison slower than arithmetic

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:28 25 4
gpt4 key购买 nike

不久前,我提供了一个关于 this question 的答案.

目标:计算此矩阵中 [3 6] 中的值的数量范围:

A = [2 3 4 5 6 7;
7 6 5 4 3 2]

我想出了 12 种不同的方法:

count = numel(A( A(:)>3 & A(:)<6 ))      %# (1)
count = length(A( A(:)>3 & A(:)<6 )) %# (2)
count = nnz( A(:)>3 & A(:)<6 ) %# (3)
count = sum( A(:)>3 & A(:)<6 ) %# (4)

Ac = A(:);
count = numel(A( Ac>3 & Ac<6 )) %# (5,6,7,8)
%# prevents double expansion
%# similar for length(), nnz(), sum(),
%# in the same order as (1)-(4)

count = numel(A( abs(A-(6+3)/2)<3/2 )) %# (9,10,11,12)
%# prevents double comparison and &
%# similar for length(), nnz(), sum()
%# in the same order as (1)-(4)

所以,我决定找出哪个最快。测试代码:

A = randi(10, 50);
tic
for ii = 1:1e5

%# method is inserted here

end
toc

结果(5 次中最好的一次,全部在几秒钟内):

%# ( 1): 2.981446
%# ( 2): 3.006602
%# ( 3): 3.077083
%# ( 4): 2.619057
%# ( 5): 3.011029
%# ( 6): 2.868021
%# ( 7): 3.149641
%# ( 8): 2.457988
%# ( 9): 1.675575
%# (10): 1.675384
%# (11): 2.442607
%# (12): 1.222510

看来 count = sum(( abs(A(:)-(6+3)/2) < (3/2) ));是到这里最快的方法...

我交易一个 <有两个部门,一个加法和一个abs ,而且执行时间不到一半!有没有人解释这是为什么?

JIT 编译器可能会用内存中的单个值替换除法/加法,但仍然存在 abs ...那么分支预测错误?对于像这样简单的事情似乎很愚蠢......

最佳答案

A(:)>3 & A(:)<6表达式需要评估两个条件,而 abs(A(:)-(6+3)/2) < 3/2)只评估一个。

对于非常紧凑的计算密集型循环,这会产生很大的不同。即使没有分支预测失误,分支本身的成本也相对较高。这就是为什么,例如,loop unrolling作为一种优化技术。

关于performance - Matlab 性能 : comparison slower than arithmetic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12137233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com