CMake:为Eigen库使能向量化

CMake:为Eigen库使能向量化

  • 导言
  • 构建Eigen
  • 项目结构
  • CMakeLists.txt
  • 相关源码

导言

本篇开始将涉及检测外部库相关的内容,期间会穿插着一些其他的内容。为了能够使得系统在系统中运行Eigen库,我们首先需要在系统中配置好Eigen库。然后介绍与Eigen库相关的CMake配置。

构建Eigen

Windows

  • 从官网下载安装包(下载ZIP格式):

https://eigen.tuxfamily.org/index.php?title=Main_Page
在这里插入图片描述

  • 解压到某一路径中,使用cmake编译。这里以vs15以及x64为例:
    在这里插入图片描述
    在这里插入图片描述
  • 选择输出路径并点击generate:
    在这里插入图片描述
  • VS打开项目
    在这里插入图片描述
  • 在vs2015中生成INSTALL。右键点击“生成”:
    在这里插入图片描述
  • 将生成后的库添加到环境变量中:
    在这里插入图片描述

ubuntu

  • 从官网下载安装包(下载tar.gz格式):

https://eigen.tuxfamily.org/index.php?title=Main_Page
在这里插入图片描述

  • Eigen包安装
    下载完成后,对压缩包进行解压后(解压在home目录即可),运行如下命令进行安装:
cd (eigen文件夹中)
mkdir build
cd build
cmake ..
sudo make install
  • 将eigen文件复制到本地调用文件夹中(/usr/include)
sudo cp -r /usr/local/include/eigen3 /usr/include 

项目结构

.
├── CMakeLists.txt
└── linear_algebra.cpp

项目地址:

https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter2/05

CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)project(eigen_tensor LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Eigen3 3.4 REQUIRED CONFIG)include(CheckCXXCompilerFlag)check_cxx_compiler_flag("-march=native" _march_native_works)
check_cxx_compiler_flag("-xHost" _xhost_works)set(_CXX_FLAGS)
if(_march_native_works)message(STATUS "Using processor's vector instructions (-march=native compiler flag set)")set(_CXX_FLAGS "-march=native")
elseif(_xhost_works)message(STATUS "Using processor's vector instructions (-xHost compiler flag set)")set(_CXX_FLAGS "-xHost")
else()message(STATUS "No suitable compiler flag found for vectorization")
endif()add_executable(linear-algebra-unoptimized linear_algebra.cpp)
target_link_libraries(linear-algebra-unoptimizedPRIVATE Eigen3::Eigen
)add_executable(linear-algebra linear_algebra.cpp)
target_compile_options(linear-algebraPRIVATE ${_CXX_FLAGS}
)
target_link_libraries(linear-algebraPRIVATE Eigen3::Eigen
)
find_package(Eigen3 3.4 REQUIRED CONFIG)

find_packageCMake中的一个命令,用于查找和加载特定的第三方库(例如Eigen3)的CMake配置文件。

Eigen3 是一个用于线性代数计算的C++模板库,它提供了矩阵、向量、矢量计算等功能。通过在CMake中使用 find_package(Eigen3 3.4 REQUIRED CONFIG) 命令,告诉CMake去查找Eigen3库,并且要求它的版本至少是3.4REQUIRED 参数表示如果找不到Eigen3库,CMake将会报错并停止构建。

CONFIG 参数指示CMake查找Eigen3CMake配置文件(通常是 Eigen3Config.cmake 或类似名称),其中包含有关库的信息和设置。

一旦找到Eigen3库的CMake配置文件,CMake会加载该配置文件并设置相关的变量,例如 EIGEN3_INCLUDE_DIR,其中包含了Eigen3库的头文件路径。在接下来的CMake构建中,你可以使用这些设置的变量来链接和包含Eigen3库。

include(CheckCXXCompilerFlag)

CMake中,include(CheckCXXCompilerFlag) 是一个用于检查C++编译器标志是否可用的CMake命令。

这个命令的作用是为了检查特定的C++编译器标志是否受支持。在某些情况下,需要根据编译器的不同来启用或禁用一些特性或优化选项。

使用这个命令的一般形式是:

include(CheckCXXCompilerFlag <flag>)

其中<flag>是你要检查的C++编译器标志,例如 -std=c++11-fPIC 等。

此命令将尝试将指定的编译器标志添加到C++源代码,并编译一个简单的测试程序来检查编译器是否支持该标志。如果支持,那么CMake将定义一个CMake变量,例如 CMAKE_REQUIRED_FLAGSCMAKE_REQUIRED_LIBRARIES,来表示该标志是可用的。

通过这种方式,可以在CMake脚本中根据编译器支持情况进行条件编译或设置不同的选项。

例如,假设我们要检查编译器是否支持C++11标准:

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11)
if (COMPILER_SUPPORTS_CXX11)# 设置C++11标准set(CMAKE_CXX_STANDARD 11)message(STATUS "C++11 supported by the compiler.")
else ()message(FATAL_ERROR "C++11 is not supported by the compiler.")
endif ()
check_cxx_compiler_flag("-march=native" _march_native_works)
check_cxx_compiler_flag("-xHost" _xhost_works)set(_CXX_FLAGS)
if(_march_native_works)message(STATUS "Using processor's vector instructions (-march=native compiler flag set)")set(_CXX_FLAGS "-march=native")
elseif(_xhost_works)message(STATUS "Using processor's vector instructions (-xHost compiler flag set)")set(_CXX_FLAGS "-xHost")
else()message(STATUS "No suitable compiler flag found for vectorization")
endif()

这段CMake代码片段用于检查编译器是否支持特定的矢量指令优化标志,并根据结果设置 _CXX_FLAGS 变量以启用适当的矢量化优化。

-march=native 是一个编译器标志,用于告诉编译器根据当前主机的处理器架构来优化生成的机器码。这个标志会让编译器针对当前的 CPU 架构生成最优化的代码,以充分利用处理器的特性和指令集。

例如,在使用 -march=native 标志编译代码时,如果你的计算机的处理器支持 AVX2 指令集,编译器将会针对 AVX2 进行优化。如果运行这个优化过的代码在支持 AVX2 的处理器上,它将能够获得更高的性能。

请注意,使用 -march=native 标志编译代码可能会导致生成的可执行文件在其他不同架构的计算机上运行不正确或不稳定。因此,在分发或共享可执行文件时,最好使用更加通用的编译选项,除非确实需要充分利用特定处理器架构的优化。

-xHostIntel 编译器的编译选项,用于指示编译器使用主机处理器支持的最高级别的指令集来优化生成的机器码。

类似于 -march=native-xHost 也会让编译器根据当前主机的处理器架构来选择最优化的指令集。它会自动根据当前系统的处理器类型来决定使用最高级别的指令集,以充分利用处理器的性能和功能。

然而,与 -march=native 不同的是,-xHost 是特定于 Intel 编译器的选项,而不是在其他编译器中通用的标志。

请注意,与 -march=native 一样,使用 -xHost 也可能会导致生成的可执行文件在其他不同架构的计算机上运行不正确或不稳定,因此在分发或共享可执行文件时需谨慎使用。

相关源码

linear_algebra.cpp

#include <eigen3/Eigen/Dense>
#include <chrono>
#include <iostream>
EIGEN_DONT_INLINEdouble simple_function(Eigen::VectorXd &va, Eigen::VectorXd &vb) {// this simple function computes the dot product of two vectors// of course it could be expressed more compactlydouble d = va.dot(vb);return d;
}int main() {int len = 1000000;int num_repetitions = 100;// generate two random vectorsEigen::VectorXd va = Eigen::VectorXd::Random(len);Eigen::VectorXd vb = Eigen::VectorXd::Random(len);double result;auto start = std::chrono::system_clock::now();for (auto i = 0; i < num_repetitions; i++) {result = simple_function(va, vb);}auto end = std::chrono::system_clock::now();auto elapsed_seconds = end - start;std::cout << "result: " << result << std::endl;std::cout << "elapsed seconds: " << elapsed_seconds.count() << std::endl;
}

输出结果

./linear-algebra-unoptimized
result: -261.505
elapsed seconds: 1.97964./linear-algebra
result: -261.505
elapsed seconds: 1.05048

最后:保持好的心态!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring事件监听器ApplicationListener

目录 介绍 spirng启动后启动某方法 介绍 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现&#xff0c;内部实现原理是观察者设计模式&#xff0c;设计初衷也是为了系统业务逻辑之间的解耦&#xff0c;提高可扩展性以及可维护性。事件发布者并不需…

【Android】APP启动优化学习笔记

启动优化目的 用户体验&#xff1a; 应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢&#xff0c;用户可能会感到不满&#xff0c;并且有可能选择卸载或切换到竞争对手的应用。通过启动优化&#xff0c;可以提高应用的启动…

132个心理性格趣味测试ACCESS\EXCEL数据库

今天又遇到了一个心理测试的数据库&#xff0c;这个数据库在表结构的设置上很直观&#xff0c;属于那种好的数据库结构&#xff0c;共分三个表&#xff0c;一个是测试项目描述表、一个是测试题选项得分表、一个是根据得分区间解析表&#xff0c;表与表之间通过“question_id”字…

【Python】pyqt6入门到入土系列,非常详细...

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是PyQt6? 简单介绍一下PyQt6 1、基础简介 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。 PyQt6的官网&#xff1a;www.riverbankcomputing.co.uk/news。 PyQt6是由Riverbank Co…

行为型模式之中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09; 中介者模式是一种行为型设计模式&#xff0c;旨在通过封装一系列对象之间的交互方式&#xff0c;使其能够独立地进行通信。 中介者模式的核心思想是将对象之间的直接通信改为通过一个中介者对象来进行间接通信&#xff0c;…

套接字通信的客户端和服务端的实现

知识了解&#xff1a; 1.IP:本质是一个整型数&#xff0c;用于表示计算机在网络中的地址。IP协议版本有两个&#xff1a;IPv4和IPv6 IPv4&#xff08;Internet Protocol version4&#xff09;: 使用一个32位的整型数描述一个IP地址&#xff0c;4个字节&#xff0c;int型也可以…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

[运维]python 启用http 文件服务

要在Python中启用HTTP文件服务&#xff0c;您可以使用内置的http.server模块&#xff08;在Python 3中&#xff09;或SimpleHTTPServer模块&#xff08;在Python 2中&#xff09;。 在Python 3中&#xff1a; python -m http.server在Python 2中&#xff1a; python -m Simp…

力扣SQL之路:窗口函数应用

文章目录 1.引言2.力扣SQL题目3. 解题策略4.代码实现5.总结 1.引言 窗口函数是 SQL 中一种强大的分析函数&#xff0c;它可以在结果集中创建一个窗口&#xff0c;并对窗口内的数据进行计算和分析。在力扣&#xff08;LeetCode&#xff09;的 SQL 题目中&#xff0c;窗口函数经…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了&#xff0c;进程的基本概念&#xff0c;在课本上被描述为&#xff0c;正在执行的程序&#xff0c;在linux内核上&#xff0c…

代码随想录算法训练营day50

文章目录 Day50买卖股票的最佳时机III题目思路代码 买卖股票的最佳时机IV题目思路代码 Day50 买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。…

P5724 【深基4.习5】求极差 / 最大跨度值

题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​&#xff0c;求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。 输入格式 第一行输入一个正整数 n n n&#xff0c;表示整数个数。 第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,…

如何在Linux系统中使用yum命令安装MySQL

1、安装软件 # yum install -y https://repo.mysql.com//mysql80-community-release-el7-8.noarch.rpm # yum -y install mysql-community-server网址来源&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 2、启动软件 # systemctl enable mysqld# systemctl start my…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者&#xff1a;双飞&#xff08;花名&#xff1a;小鱼&#xff09; 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好&#xff0c;我是 StoneDB 的实习生小鱼&#xff0c;目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

基于飞桨paddle波士顿房价预测练习模型测试代码

基于飞桨paddle波士顿房价预测练习模型测试代码 导入基础库 #paddle&#xff1a;飞桨的主库&#xff0c;paddle 根目录下保留了常用API的别名&#xff0c;当前包括&#xff1a;paddle.tensor、paddle.framework、paddle.device目录下的所有API&#xff1b; import paddle #Lin…

基于STM32的儿童误锁车内远程报警系统(华为云IOT)

一、项目背景 汽车发展历史汽车自上个世纪末诞生以来,已经走过了风风雨雨的一百多年。汽车经过百年历史的演变,已经在世界各地获得广泛的普及和应用,但是事物总会具有两面性,汽车方便了人们生活的同时也带来了不安全的因素。 儿童的出行和乘车安全始终都是我国现代汽车安…

Sentinel持久化规则

项目中有用到Sentinel,然后需要将Sentinel上配置的规则做持久化(或者初始化),通过改写Sentinel源码实现了需求,下面记录一下实现过程。 如果不知道Sentinel怎么搭,可以看看: 流控平台Sentinel搭建和接入教程_东皋长歌的博客-CSDN博客 一,背景 Sentinel是Alibaba开源…

信息技术会考操作题excel,信息技术会考操作题目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;信息技术会考操作题python计算题&#xff0c;信息技术会考操作题没有保存&#xff0c;今天让我们一起来看看吧&#xff01; 1. 数据分析题&#xff08;17分&#xff09;&#xff1a; 流行病学通常关注单日治愈患者例数增…