Eigen优化实录

2023-11-11


原文:https://www.zhihu.com/question/28571059?sort=created


以前也觉得 Eigen 很快,感觉和 mkl 可以媲美。但是昨天 debug 时一行一行看时间,发现这样一个矩阵乘法 \mathbf{A}^{\textrm{T}}\mathbf{A} 要算将近一秒\mathbf{A} \in \mathbb{R}^{4800\times{}1000}),而同样的计算用 MATLAB 只需要肉眼不可察觉的时间

我 google 了一下,在 StackOverflow 上(How to speed up Eigen library's matrix product?)有人讨论说是 MATLAB 内部自动会调用多线程版的 mkl 里的矩阵乘法,而 Eigen 在通常状态下是单线程的,需要在编译时加上 \mathtt{-fopen} 参数使用 openmp 开启多线程。我在自己的 Mac 上尝试了一下,在线程数为 4 的情况下,时间缩短为 0.57 秒,但相比 MATLAB 的肉眼不可察觉还是有差距。

我对计算机底层的硬件不是很熟,只是最近突然觉得处理起这种可以高度矢量化的问题时,(不是非常 wisely 地)使用Eigen 还是没有经过优化的 MATLAB 快。

P.S.: 最开始的单线程版本我使用的是 OS X 自带的 \texttt{g++} 编译器,优化参数为 \texttt{-Ofast}. 测试过加上 \texttt{-msse2} 没有明显区别。这个 \texttt{g++} 实际上是Apple 封装后的 \texttt{clang++},很可惜的是不支持 openmp. 所以为了开启多线程我安装了 GNU \texttt{g++} 编译器。其它编译参数不变。

=================更新==================
刚才又上 StackOverflow 上看了别人的几个帖子( Eigen vs Matlab: parallelized Matrix-Multiplication)学习了一下,发现了几个新的 trick:
  1. 首先之前线程数我设置错误了。我的 CPU physically 应该只有两个核,四线程是 hyper-thread 的结果,多出来的两个线程并不能加速。我把 OMP_NUM_THREADS 改为 2 以后,速度变为 0.55s 左右;
  2. 如果计算矩阵乘法,使用 \mathbf{B}\texttt{.noalias()} = \mathbf{A}^{\textrm{T}}\mathbf{A} 是个不错的 trick,它可以避免生成 temporary 的矩阵存储中间结果。使用这个后缩短为 0.50s 左右;
  3. 对 Eigen 3.3 或以上的版本可以加上 \texttt{-mavx}\texttt{-mfma} 两个参数,进一步缩短为 0.40s 左右。

这样总的下来提速了约 30%.

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

Eigen优化实录 的相关文章

  • 将 C++ 特征矩阵传递给 Matlab mex 输出

    我怎样才能通过特征矩阵作为Matlab输出参数 我尝试过这个 EIGEN 如何从特征矩阵中取出和取出数据 MatrixXd resultEigen Eigen matrix with some result non NULL double
  • eigen 是否有像 H.transpose()*H 这样的自转置乘法优化

    我浏览过 eigen 的教程https eigen tuxfamily org dox devel group TutorialMatrixArithmetic html 它说 注意 对于担心性能的 BLAS 用户 c noalias 2
  • 在 MEX 函数中将特征复数矩阵返回到 MATLAB,无需额外复制

    这个问题演示如何使用映射对象将双精度矩阵返回到 MATLAB 以下适用于非复杂数据 double outputPtr plhs 0 mxCreateDoubleMatrix mwSize n mwSize m mxREAL outputPt
  • 稠密对称矩阵的特征有效类型

    Does Eigen http eigen tuxfamily org index php title Main Page有存储密集 固定大小 对称矩阵的有效类型吗 嘿 它们无处不在 IE 对于 N 9 它应该只存储 1 9 9 2 45
  • 从 Eigen::SparseMatrix 中提取块/ROI,无需复制

    我想知道有没有什么好方法从 Eigen SparseMatrix 中提取块 ROI 更准确地说 我想要提取的是内向量 我想做的是这样的 typedef Eigen SparseMatrix
  • 如何在特征值中转置张量

    我试图获得两个张量的矩阵乘积 其中一个张量应该在相乘之前转置 At B 到目前为止我发现的是没有任何转置和两个矩阵转置的矩阵乘积 我正在寻找一种方法 可以直接收缩两个张量并转置其中一个张量 或者在收缩一个张量之前转置一个张量 我发现 转置效
  • 如何求解稀疏矩阵的线性方程 AX=b

    我有稀疏矩阵 A 120 000 120 000 和向量 b 120 000 我想使用 Eigen 库求解线性系统 AX b 我尝试按照文档进行操作 但总是出现错误 我还尝试将矩阵更改为稠密并求解系统 Eigen MatrixXd H N
  • 从稀疏矩阵中提取块作为另一个稀疏矩阵

    如何从a中提取一个块Eigen SparseMatrix
  • Eigen::MatrixXd typedef 的替换

    全部更换最简单的方法是什么Eigen MatrixXds and Eigen VectorXd具有向量和矩阵long double元素 我的代码中的每个基本浮点变量都是类型long double 另外 每次使用矩阵或向量时 我都会使用以下类
  • Eigen SparseMatrix 的零拷贝构造

    我有以下问题 我有一个Eigen SparseMatrix我需要通过网络发送 而我的网络库仅支持发送原始类型的数组 我可以通过执行类似的操作来检索指向 SparseMatrix 的支持数组的指针 这是支持对象的代码 https eigen
  • 如何传递特征矩阵行引用以将其视为向量?

    我有一个对向量引用进行操作的函数 例如 void auto bias const Eigen VectorXf v Eigen Ref
  • 我可以使用特征稀疏矩阵来满足一般存储需求吗

    我需要一个模板化的稀疏矩阵实现 但只是为了减少内存占用 not进行任何数值求解 所以我尝试使用 Eigen 尽管我不需要数学部分 为什么 它恰好就在我的机器上 而且我已经用它来做其他事情了 但我肯定不是本征专家 Context 我有一个类型
  • 如何桥接 JavaScript(参差不齐)数组和 std::vector> 对象?

    在 JavaScript 中 我有一个 线 列表 每条线都由不定数量的 点 组成 每个点都有以下形式 x y 所以它是一个 3D 参差不齐的数组 现在我需要在 emscripten 的帮助下将它传递给我的 C 代码 embind https
  • 使用 Eigen 库存储 3D 数据

    如何使用 Eigen C 库存储 3D 数据 矢量用于 1D 数据 矩阵用于 2D 数据 但什么是 3D 数据 或者是否可以创建矩阵向量 您可以使用张量模块 但它还不稳定 Eigen Tensor
  • 从模板类创建对象时出错

    我一直在尝试找到一种方法 从 C 中的多元正态分布中采样随机向量 同时具有均值向量和协方差矩阵 就像 Matlab 的那样mvnrnd功能有效 我找到了实现此功能的类的相关代码这一页 http lost found wandering bl
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 如何查看Eigen C++模板库的版本号?

    我添加了几个不同版本的 Eigen 默认值 包括 Visual C 的目录 但是我在使用的时候遇到了崩溃的问题LDLT Cholesky 分解 一些测试数值示例 所以我想在调试代码时确定哪个版本实际上是活动的 是否有任何函数可以指示当前活动
  • 使用std::begin()、std::end()将ArrayXd转换为stl向量,

    在我看来我应该能够使用std begin and std end 转换ArrayXd to std vector

随机推荐

  • unity修改sprite大小的方法

    unity怎么修改sprite的大小呢 方法就是修改pixel per unit的值 值越大 sprite就越小
  • 【机器学习】线性回归【上】朴素最小二乘估计

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 由于字数限制 分成两篇博客 机器学习 线性回归 上 朴素最小二乘估计 机器学习 线性回归 下 正则化最小二乘估计 提醒 下文中的 alpha 和 lambda
  • Maven插件仓库地址

    以下是Maven插件地址
  • C++多线程环境下的单例类对象创建

    使用C 无锁编程实现多线程下的单例模式 贺志国 2023 8 1 在多线程环境下创建一个类的单例对象 要比单线程环境下要复杂很多 下面介绍在多线程环境下实现单例模式的几种方法 一 尺寸较小的类单例对象创建 如果待创建的单例类Singleto
  • cpu三大架构 numa smp mpp

    系统的性能很大程度上依赖于cpu 硬件架构的支持 从系统架构来看 目前的商用服务器大体可以分为三类 即 对称多处理器结构 SMP Symmetric Multi Processor 非一致存储访问结构 NUMA Non Uniform Me
  • java---修饰符权限符号

    java修饰符的访问范围 修饰符 当前类 同 包 子 类 其他包 public protected default private
  • 解决Mac电脑报错:You don‘t have permission to access that port.

    启动django服务的时候报了一堆英语 You have 18 unapplied migration s Your project may not work properly until you apply the migrations
  • eclipse如何设置中文

    Eclipse如何设置中文 Eclipse 是一个开放源代码的 基于Java的可扩展开发平台 就其本身而言 它只是一个框架和一组服务 用于通过插件组件构建开发环境 幸运的是 Eclipse 附带了一个标准的插件集 包括Java开发工具 Ja
  • 科普——未知的公共免费WIFI存在的风险及隐患

    就现阶段 我们打开手机WIFI功能 无论何时何地都能发现很多位置来源的免费WIFI 这些WIFI一般都不需要密码 可是 它们真的安全吗细节不讲 如果你连到了陌生的wifi 你用浏览器去登录一些网站 你看到的是这样的 然而 当你点击登陆 在别
  • 【华为OD机试真题 JAVA】最长连续子序列

    标题 最长连续子序列 时间限制 1秒 内存限制 262144K 语言限制 不限 有N个正整数组成的一个序列 给定整数sum 求长度最长的连续子序列 使他们的和等于sum 返回此子序列的长度 如果没有满足要求的序列 返回 1 输入描述 序列
  • 解决BeanUtils.copyProperties不能复制集合类型

    解决BeanUtils copyProperties不能复制集合类型 1 背景 日常项目中 后台从 数据库 中获取的数据用DTO实体类接收 后台返回给 前台 的实体类是VO DTO和VO的属性字段个数大致相同 一般来说VO可能比DTO多 工
  • 解决打开javaweb项目外部资源的问题。

    a href xx 可以轻松打开web内部的资源如pdf excel 外部的资源点击无反应 可以采取将外部资源复制到项目中 然后再用 a href xxx 文件复制代码 亲测试 txt pdf jpg可以复制 代码在百度上搜到的 impor
  • K8S集群中部署服务之应用环境配置

    微服务项目sangomall应用环境配置说明 一 应用环境配置文件创建 可以创建多个application properties或application yml文件 通过关键配置进行激活使用 例如测试环境和生产环境等 1 1 创建开发环境
  • [Setting]win7下运行exe失败:应用程序无法启动,因为应用程序的并行配置不正确

    win7下运行exe失败 应用程序无法启动 因为应用程序的并行配置不正确 1 问题描述 承接了一个项目 给甲方交接的时候 在它的电脑中运行出现了这个错误 应用程序无法启动 因为应用程序的并行配置不正确 有关详细信息 请参阅应用程序事件日志
  • stm32从keil安装到程序烧录

    1 准备工具 1 一块stm32板 我用的是芯片型号是stm32L151C8T6 2 keil5软件 可以到官网下载 https www keil com download product 也可以直接下载网友的版本 我这里用的是keil5
  • MySQL8.0连接url

    这些错误是很让人崩溃的 在连接数据库配置都没错 jar包也有 但是还是报 首先第一个报错是系统安全性和时区配置的问题 MySQL8 0不同于之前的版本 存在安全检测的问题 所以在设置url的时候需要jdbc mysql localhost
  • 我是如何利用业余时间写书的?---时间管理

    低级的欲望放纵即可获得 高级的欲望只有克制才能达成 卡耐基 粉丝的误会 很多粉丝 问我 彭老师你是不是自己创业了 彭老师我想报您的培训班 得知我知识业余时间写文章 紧接着又会问 jg单位这么清闲啊 你居然有这么多时间写文章的 而且你文章很深
  • 将浮点型数转换为字符串类型数(小数点保留多位)(qt)

    1 实现将浮点类型的数转换为字符串类型的数 char data 20 double a 1 02356 gcvt s data a 3 最后结果显示三位 输出的结果四舍五入为1 02 QString str QString 1 arg da
  • 检验身份证号的有效性并输出有问题的号码

    摘要 一个合法的身份证号码共18位 由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 然后将计算的和对11
  • Eigen优化实录

    原文 https www zhihu com question 28571059 sort created 以前也觉得 Eigen 很快 感觉和 mkl 可以媲美 但是昨天 debug 时一行一行看时间 发现这样一个矩阵乘法 要算将近一秒