该基准结果的原因是什么?

Reschu

将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宏)。

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

Reschu

结果的答案是,Julia中的多维数组以列优先顺序存储。请参阅Julias记忆顺序

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

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         |

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

该代码结果背后的原因是什么?

来自分类Dev

javascript中结果的原因是什么?

来自分类Dev

该代码的“ False”输出背后的原因是什么?

来自分类Dev

导致该crashlytics日志的原因是什么?

来自分类Dev

该错误的原因是什么:错误:EACCES,权限被拒绝

来自分类Dev

使条件条件无结果的原因是什么?

来自分类Dev

RejctedExecutionException的原因是什么?

来自分类Dev

BufferOverflowException的原因是什么?

来自分类Dev

sql结果集无法返回结果集的原因是什么?

来自分类Dev

该代码仅返回数组的第一行的原因是什么?

来自分类Dev

我该如何解决这个错误,它的原因是什么?

来自分类Dev

导致crashlytics日志的原因是什么?

来自分类Dev

此输出的原因是什么?

来自分类Dev

断言失败的原因是什么

来自分类Dev

优化进口的原因是什么?

来自分类Dev

命名工会的原因是什么?

来自分类Dev

此结构对齐的原因是什么?

来自分类Dev

双重否定-(-n)的原因是什么?

来自分类Dev

ConnectionStateError的可能原因是什么?

来自分类Dev

细分错误的原因是什么?

来自分类Dev

系统冻结的可能原因是什么?

来自分类Dev

这种细分错误的原因是什么?

来自分类Dev

根为100%的原因是什么?

来自分类Dev

创建情节提要的原因是什么?

来自分类Dev

mysql意外停止,原因是什么?

来自分类Dev

此输出背后的原因是什么?

来自分类Dev

iOS:webViewDidFinishLoad失败的原因是什么

来自分类Dev

这里发生NPE的原因是什么?

来自分类Dev

双重否定-(-n)的原因是什么?