【问题标题】:CPU instruction sets for linear algebra?线性代数的CPU指令集?
【发布时间】:2013-06-27 05:24:55
【问题描述】:

我的情况是,我必须在 C++ 中使用一个几乎永远不会改变的矩阵和很多小向量(非常少的 3x3 或 4x4 矩阵和具有 3 个值的向量)执行一些线性代数计算,我是考虑使用一些针对 x86 32 位、x86 64 位、ARMv5 及更高版本的 CPU 指令集来加快速度并简化我的数学运算设计。

令人惊讶的是,我还没有找到真正的线性代数集,其中大多数是用于浮点数学的,可以根据需要进行缓存,优化,但对于矩阵和线性代数来说,真的没有,是只有我还是没有集对于线性代数?

AMD 的新 FMA3 一开始看起来很有趣,但在现代 CPU 中仍然很难找到,我想坚持像 x86 上的 SSE 或 ARM 上的 ARMv5 这样流行的东西。

那么有一个流行的指令集用于小而快速的线性代数计算吗?如果速度足够好,我什至可以接受大量错误。

编辑:

我还应该注意,实际上我的编译器是:

  • 海合会
  • 明威
  • Visual Studio

所以我想在 x86 和 ARM 上都有一个开源产品和一个可移植库。

编辑 2: Eigen 不支持多线程执行,这对我来说是个大问题。

【问题讨论】:

  • 如何使用已经为您完成工作的库,例如 Eigen?向量指令是非常低级的,它们不做线性代数,它们做基本的操作,在上面你可以构建很多东西,包括线性代数。
  • @MarcGlisse 我正在考虑这一点,但我没有找到任何看起来像我所需要的简单性的东西,例如,有很多基准测试包含大量巨大的矩阵,但我只是需要使用非常小的数据结构完成非常快速的计算。我也在考虑像 Boost uBlas 这样的包装器,它可以链接到英特尔 MKL 等其他库,但 eigen 看起来更适合 ARM 和 X86。我必须在一些与成像相关的程序中使用它,所以如果操作很快,我什至可以承受很大的错误阈值。
  • 看起来你对什么是 CPU 指令集只是肤浅的了解。特别是,它们并非旨在“简化我的数学运算设计”或“开源产品”或“x86 和 ARM 上的可移植库”。 x86 和 ARM 是不同的指令集架构,因此根据定义,指令集在它们之间是不可移植的。指令集为编写解决问题的算法提供了小的构建块,它们不是为解决不重要的问题而设计的。
  • 具有讽刺意味的是,4 个元素向量的乘法是您在 SIMD 指令集中可以找到的那种运算,而对于处理“庞大的矩阵”来说毫无意义
  • @BenVoigt 你输入一个值你会根据使用的指令得到一个结果,你不需要设计一些特殊的东西或关心它是如何实现的,而不是你将在 ARM 和 x86 之间切换您只需更改特定 SIMD 操作的指令名称,甚至不必更改方法名称。这就是我所说的“简单”,我知道它不是可移植的,但它是一个简单的解决方案。如果您将为需要简单快速线性代数的 C++ 程序提供解决方案,我将很高兴看到这一点。

标签: c++ x86 arm linear-algebra instruction-set


【解决方案1】:

【讨论】:

  • 问题是,它不是可移植的,也不是真正面向 C++ 的
【解决方案2】:

您实际上并不是在寻找完整的线性代数库,而只是在寻找可移植的向量运算。

搜索“便携式 C++ SIMD”会产生大量相关命中。最有希望的之一是

Vc 是一个免费软件库,用于简化 C++ 代码的显式矢量化。它具有直观的 API,并提供不同编译器和编译器版本之间的可移植性以及不同向量指令集之间的可移植性。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多