gpt4 book ai didi

loops - 这个基准测试结果的原因是什么?

转载 作者:行者123 更新时间:2023-12-04 02:09:46 24 4
gpt4 key购买 nike

将 rgb 图像转换为灰度图像的两个函数:

function rgb2gray_loop{T<:FloatingPoint}(A::Array{T,3})
r,c = size(A)
gray = similar(A,r,c)
for i = 1:r
for j = 1:c
@inbounds gray[i,j] = 0.299*A[i,j,1] + 0.587*A[i,j,2] + 0.114 *A[i,j,3]
end
end
return gray
end

和:
function rgb2gray_vec{T<:FloatingPoint}(A::Array{T,3})
gray = similar(A,size(A)[1:2]...)
gray = 0.299*A[:,:,1] + 0.587*A[:,:,2] + 0.114 *A[:,:,3]
return gray
end

第一个使用循环,而第二个使用矢量化。

在对它们进行基准测试时(使用 Benchmark 包),我得到以下不同尺寸输入图像的结果( f1 是循环版本, f2 是矢量化版本):
A = rand(50,50,3) :
| Row | Function | Average     | Relative | Replications |
|-----|----------|-------------|----------|--------------|
| 1 | "f1" | 3.23746e-5 | 1.0 | 1000 |
| 2 | "f2" | 0.000160214 | 4.94875 | 1000 |
A = rand(500,500,3) :
| Row | Function | Average    | Relative | Replications |
|-----|----------|------------|----------|--------------|
| 1 | "f1" | 0.00783007 | 1.0 | 100 |
| 2 | "f2" | 0.0153099 | 1.95527 | 100 |
A = rand(5000,5000,3) :
| Row | Function | Average  | Relative | Replications |
|-----|----------|----------|----------|--------------|
| 1 | "f1" | 1.60534 | 2.56553 | 10 |
| 2 | "f2" | 0.625734 | 1.0 | 10 |

我希望一个函数比另一个更快(可能是 f1,因为 inbounds 宏)。

但我无法解释,为什么矢量化版本对于更大的图像会变得更快。
这是为什么?

最佳答案

结果的答案是 Julia 中的多维数组以列优先顺序存储。见 Julias Memory Order .

固定循环版本,关于列主序(内部和外部循环变量交换):

function rgb2gray_loop{T<:FloatingPoint}(A::Array{T,3})
r,c = size(A)
gray = similar(A,r,c)
for j = 1:c
for i = 1:r
@inbounds gray[i,j] = 0.299*A[i,j,1] + 0.587*A[i,j,2] + 0.114 *A[i,j,3]
end
end
return gray
end
A = rand(5000,5000,3) 的新结果:
| Row | Function | Average  | Relative | Replications |
|-----|----------|----------|----------|--------------|
| 1 | "f1" | 0.107275 | 1.0 | 10 |
| 2 | "f2" | 0.646872 | 6.03004 | 10 |

较小数组的结果:
A = rand(500,500,3) :
| Row | Function | Average    | Relative | Replications |
|-----|----------|------------|----------|--------------|
| 1 | "f1" | 0.00236405 | 1.0 | 100 |
| 2 | "f2" | 0.0207249 | 8.76671 | 100 |
A = rand(50,50,3) :
| Row | Function | Average     | Relative | Replications |
|-----|----------|-------------|----------|--------------|
| 1 | "f1" | 4.29321e-5 | 1.0 | 1000 |
| 2 | "f2" | 0.000224518 | 5.22961 | 1000 |

关于loops - 这个基准测试结果的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29742768/

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