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,一经查实,立即删除!

相关文章

【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…

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

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

力扣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…

如何在 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…

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

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

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

初识Linux

今天简单了解了关于操作系统的发展史&#xff0c;学习了在Linux中如何远程连接云服务器的指令&#xff0c;以及在Linux中创建多个用户的指令。 1. ssh root 服务器远程地址 作用是用来连接XShell与云服务器&#xff0c;输入该指令后会自动生成输入密码的窗口&#xff0c;如…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…

树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署》 完整功能视频演示地址&#xff1a;本科最后的课设&#xff1a;“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili 该博客介绍的功能为&#xff1a; 1&#xff1…

初步了解c#编程语言--(1)

初识c#编程语言 一、见识c#语言编写的各类应用程序 关于用c#语言编写的各类应用程序有以下几种&#xff1a; 1.Console 在编写Console程序时&#xff0c;要注意创建项目时&#xff0c;是选择控制台应用程序&#xff08;Console Application&#xff09;&#xff0c;在这里…

正泰电力携手图扑:VR 变电站事故追忆反演

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)

1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中&#xff0c;为了便于我们理解&#xff0c;引导我们进入规划模型的一种情况。相比之下&#xff0c;非线性规划会更加贴近…