朱莉娅中固定大小数组的最佳传递维度

2024-02-20

我想编写一个以矩阵作为输入的函数。这是复杂项目中频繁的低级调用,因此使该函数尽可能快可能会产生严重的性能影响。因为速度对我来说非常重要,所以我使用以下类型FixedSizeArrays据我所知,这将节省内存使用。但我经常知道输入矩阵的某些属性,但我不确定我是否充分利用了它。

这是一个简单的例子。想象一下我想要尽可能快地执行以下操作的函数:

using FixedSizeArrays

function foo( input::Mat )
# NB: Mat is the FixedSizeArrays matrix type
  return 2 * input
end

显然这是一个简单的例子,但这不是重点。关键是我对矩阵的维度有所了解input:它总是只有两列,我总是可以在运行时指定行数。这似乎是可以传递给编译器以使我的代码更快的信息。我可以将它作为定义大小的参数传递吗input不知何故?这是一个不起作用的示例,但应该可以让您了解我正在尝试做什么。

function bar( int::N, thismat::Mat{N,2,Float64} )
  return 2 * thismat
end

我可以做这样的事情吗?如果我可以的话,这会起作用吗?也许固定大小数组已经做了所有能做的事情。谢谢你的想法!


固定大小的数组已经在大小上进行了专门化。这些数组不适合当行数,N根据您的情况,可能会有所不同。您注意到的任何性能问题可能是由于过度专业化.

让我说得更具体一些。

Julia 编译器能够通过对参数类型的积极专业化来实现零成本抽象。因此,一般来说(也就是说,在所有情况下,除了少数特殊化成本太高或被明确禁用的情况),如果使用两个不同的类型签名调用函数,则将编译该函数的两个版本。

由于a的大小Mat是其类型的一部分,这意味着将为每个可能的大小编译一个版本Mat。所以你所寻求的专业已经完成了。

然而,专业化并不是免费的。有两个与之相关的成本:

  • 第一次对特定签名调用函数时,将分配内存并且必须运行编译器。
  • 当无法推断类型的参数传递给函数时,存在“类型不稳定”,需要动态调度。动态调度涉及运行时查找。

因此,如果你的矩阵的大小(2, N), where N变化并且在编译时未知,性能成本动态调度将会产生。这种性能成本可以通过使用函数屏障技术来限制:对于每个类型不稳定的调用,我们只产生一次该成本,因此限制此类调用的数量可以提高性能。

但是,完全避免这种动态调度会进一步提高性能。可以构造一个数组类型,该数组类型仅对类型中的列数进行编码,并在运行时将行数作为字段。也就是说,您的性能问题可能是由于过度专业化造成的,您需要创建类型以减少专业化程度。

找到正确的平衡点对于尽可能提高应用程序的性能至关重要。事实上,专门研究数组的大小很少有用,例如,即使是 C 和 C++ 代码也倾向于将数组大小作为运行时参数传递,而不是专门研究特定的数组大小。这并没有那么贵。在更多情况下并非如此,FixedSizeArrays.jl不会提高性能,反而会损害性能。在某些情况下它肯定会有所帮助,但你的情况可能不是其中之一。


在你的情况下,为了获得最大性能,我怀疑这样的类型是最快的:

immutable TwoColumnMatrix{T, BaseType} <: AbstractArray{T, 2}
    height::Int
    base::BaseType
end

function TwoColumnMatrix(A::Matrix)
    size(A, 2) == 2 || throw(ArgumentError("must be two columns"))
    TwoColumnMatrix{eltype(A), typeof(A)}(size(A, 1), A)
end

Base.@propagate_inbounds function getindex(M::TwoColumnMatrix, n::Int)
    M.base[n]
end

size(M::TwoColumnMatrix) = (M.height, 2)

您可能需要定义其他方法以获得最大性能,并一如既往地进行基准测试。包装器的开销可能不值得编译器了解维度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朱莉娅中固定大小数组的最佳传递维度 的相关文章

  • 如何针对 IE 进行优化?

    我有一个 JS 密集型应用程序 它在 IE 中运行缓慢 我将花费大约一周的时间来优化 IE 并且我想要一些关于尝试的方向 我发现这个线程引用Drip https ieleak svn sourceforge net svnroot iele
  • 为什么在 data.frame 中预先指定类型会比较慢?

    我预先分配了一个大 data frame 以便稍后填写 我通常这样做NA是这样的 n lt 1e6 a lt data frame c1 1 n c2 NA c3 NA 我想知道如果我预先指定数据类型是否会让事情变得更快 所以我测试了 f1
  • Numpy 与 Cython 速度

    我有一个分析代码 它使用 numpy 执行一些繁重的数值运算 只是出于好奇 尝试使用 cython 进行少量更改来编译它 然后我使用 numpy 部分的循环重写它 令我惊讶的是 基于循环的代码要快得多 8 倍 我无法发布完整的代码 但我整理
  • AtomicInteger 实现和代码重复

    警告 问题有点长 但分隔线以下的部分仅供好奇 Oracle 的 JDK 7 实现原子整数 http docs oracle com javase 7 docs api java util concurrent atomic AtomicIn
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 如何在 PHP 数组中的另一个已知(通过键或指针)元素之后有效地插入元素?

    给定一个数组 a array abc 123 k1 gt v1 k2 gt v2 78 tt k3 gt v3 当其内部指针指向其元素之一时 如何在当前元素之后插入元素 如何在键已知元素 例如 k1 之后插入元素 表现护理 您可以通过使用拆
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 如何比 CGContextStrokePath 更快地渲染线条?

    我正在使用 CGContextStrokePath 绘制约 768 个点的图表 问题是 每一秒我都会得到一个新的数据点 从而重新绘制图表 目前 这个已经很繁忙的应用程序占用了 50 的 CPU 图形绘制是在UIView 中的drawRect
  • 我们是否需要使用 MappedByteBuffer.force() 将数据刷新到磁盘?

    我正在使用 MappedByteBuffer 来加速文件读 写操作 我的问题如下 我不确定是否需要使用 force 方法将内容刷新到磁盘 似乎没有 force getInt 仍然可以完美工作 好吧 因为这是一个内存映射缓冲区 我假设 get
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • 优化算术编码器

    我正在优化名为的 C 库的编码步骤PackJPG http www elektronik htw aalen de packjpg 我使用 Intel VTune 对代码进行了分析 发现当前的瓶颈是 PackJPG 使用的算术编码器中的以下
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该
  • 需要多少个线程才能使它们成为错误的选择?

    我必须使用 boost thread 用 C 编写一个不太大的程序 当前的问题是处理大量 可能是数千或数万 数百和数百万也是可能的 数量 可能 的大文件 每个文件彼此独立 并且它们都驻留在同一目录中 我正在考虑使用多线程方法 但问题是 我应
  • apachebench 支持多部分 POST 吗?

    我想使用apachebench ab 来测试文件上传性能 我已阅读手册 但找不到实现目标的方法 我的目标是尝试使用 POST 方法和 multipart form data 格式通过 HTTP 请求上传文件 ab 支持 p POST FIL
  • 为什么删除 else 会减慢我的代码速度?

    考虑以下函数 def fact1 n if n lt 2 return 1 else return n fact1 n 1 def fact2 n if n lt 2 return 1 return n fact2 n 1 它们应该是等价的
  • Activator.CreateInstance 性能严重下降的案例

    我们在 NET 服务器端应用程序中观察到一个有趣的行为 CPU 内存密集型工作会随着时间的推移而减慢 我们使用 PerfView 尝试找到罪魁祸首 看来Activator CreateInstance是这一个 我们是怎么找到它的 我们在新会
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • .NET 程序集大小会影响性能吗?

    net 程序集的大小是否会影响性能 您的 Windows 窗体 Web 窗体项目中的程序集数量如何 来自微软的模式和实践提高 NET 应用程序性能和可扩展性 http msdn microsoft com en us library ms9
  • 为什么对于整数键,“Map”操作比 JavaScript (v8) 中的“Object”慢得多?

    我很高兴使用Map对于在我的 JavaScript 代码库中随处访问的索引 但我刚刚偶然发现了这个基准 https stackoverflow com a 54385459 365104 https stackoverflow com a

随机推荐