如何正确确定Intel处理器的-march和-mtune?

2024-04-20

我目前正在从源代码构建一个对我来说性能至关重要的软件。因此,我想对其进行优化,以便在我的特定 Intel CPU 上运行。构建过程要求我设置 -march 和 -mtune 标志。

如果在我的处理器节点上我使用

gcc -march=native -Q --help=target|grep march
gcc -mtune=native -Q --help=target|grep mtune

我在 March 中得到“core-avx2”,在 mtune 中得到“generic”。然而与

cat /proc/cpuinfo

I get:

processor   : 23
vendor_id   : GenuineIntel
cpu family  : 6
model       : 63
model name  : Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
stepping    : 2
microcode   : 0x3d
cpu MHz     : 2599.993
cache size  : 30720 KB
physical id : 1
siblings    : 12
core id     : 13
cpu cores   : 12
apicid      : 58
initial apicid  : 58
fpu     : yes
fpu_exception   : yes
cpuid level : 15
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt xsave avx f16c rdrand lahf_lm abm epb intel_ppin ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts
bogomips    : 4599.35
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

访问 Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz 的主页(https://ark.intel.com/content/www/de/de/ark/products/81709/intel-xeon-processor-e5-2670-v3-30m-cache-2-30-ghz.html https://ark.intel.com/content/www/de/de/ark/products/81709/intel-xeon-processor-e5-2670-v3-30m-cache-2-30-ghz.html) 我发现: 代号 -> 以前的产品 haswell

If I use

gcc -march=haswell -Q --help=target|grep march
gcc -mtune=haswell -Q --help=target|grep mtune

两者我都得到“haswell”。 那么我实际上不应该使用 haswell 作为 March 而不是 core-avx2 吗?最好的选择是什么?

顺便说一句,我在 CentOS7 上使用 GCC 4.8.5。

Thanks!

Edit:

gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3

-> 核心-avx2

gcc -mtune=native -Q --help=target | grep -- '-mtune=' | cut -f3

-> 通用


在您使用的 gcc 版本中,Haswell 称为 core-avx2。其他微架构的名字也很蹩脚。例如,Ivy Bridge、Sandy Bridge 和 Westmere 分别称为 core-avx-i、corei7-avx 和 corei7。从gcc 4.9.0开始,使用微架构的实际名称,因此gcc在使用时会打印Haswellgcc -march=native -Q --help=target|grep march在 Haswell 处理器上而不是 core-avx2 上(请参阅patch https://github.com/gcc-mirror/gcc/commit/ccc305ffe28576a6215d68fe41b5070439fd1798#diff-8405b3bf1536ee327b30ec1c99cc091b).

经过时-mtune=native对于 gcc 并且主机处理器不知道您正在使用的 gcc 版本,它将适用generic调整。您的处理器型号 (63) 仅为 gcc 5.1.0 及更高版本所知(请参阅patch https://github.com/gcc-mirror/gcc/commit/1b738d4d1f0ba57a27a026cab78ace6f486e0433#diff-8405b3bf1536ee327b30ec1c99cc091b).

姓名打印部分-Q --help=target必须选择一些名字-march=native。对于太新的 CPU,GCC 无法专门识别,如果处理器支持 ADX,它将选择类似 Broadwell 的东西,或者支持主机处理器支持的最高 SIMD 扩展(最高 AVX2)的微体系结构(由cpuid).

但实际情况effect of -march=native是为了启用所有适当的-mavx -mpopcnt -mbmi2 -mcx16等等选项,全部使用单独检测cpuid。因此,出于代码生成的目的,-march=native始终适用于启用 GCC 知道如何使用的 ISA 扩展,即使它无法识别您的 CPU。

但对于设置tune选项,-march=native or -mtune=native完全失败并回落到generic当它无法准确识别您的 CPU 时。不幸的是它没有做类似的事情tune=intel对于未知的 Intel CPU。


在你的处理器上,gcc 知道它支持 AVX2,所以它assumes它是一个 Haswell 处理器(在您的 gcc 版本中称为 core-avx2),因为从 Haswell 开始支持 AVX2,但它不确定它实际上是一个 Haswell 处理器。这就是为什么它应用通用调优而不是针对 core-avx2(即 Haswell)进行调优。但在这种情况下,我认为这与调整 core-avx2 具有相同的效果,因为对于该编译器版本,只有 Haswell 支持 AVX2,并且编译器知道主机处理器支持 AVX2。但总的来说,即使它可能无法针对本机微架构进行调整-march在未知的 CPU 上被正确猜测。

(编者注:不,tune=generic不适应启用的指令集选项。它仍然是完全通用的调整,包括关心 AMD Phenom 或 Intel Sandybridge 等不支持 AVX2 的 CPU。看https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568 and 为什么 gcc 不将 _mm256_loadu_pd 解析为单个 vmovupd? https://stackoverflow.com/questions/52626726/why-doesnt-gcc-resolve-mm256-loadu-pd-as-single-vmovupd.

这是一个原因why你应该使用-march=native or -march=haswell(使用足够新的 gcc),不仅仅是-mavx2 -mfma。另一个原因是你可能会忘记-mbmi2 -mpopcnt -mcx16,甚至可能忘记-mfma)

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

如何正确确定Intel处理器的-march和-mtune? 的相关文章

  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • lambda 始终返回“1”

    有这样的代码 include
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • LockBits 性能关键代码

    我有一个方法需要尽可能快 它使用不安全的内存指针 这是我第一次尝试这种类型的编码 所以我知道它可能会更快
  • 使用 NSMutableDictionary 与 NSMutableArray 造成的性能损失>

    我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray 这主要是出于 KVC KVO 的原因 该集合将在我的绘图方法的内循环中经历严重的变化 如果我继续进行此替换 性能是否会受到重大影响 干杯 道
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 有没有办法将 fopen_s() 与 GCC 一起使用,或者至少创建一个 #define ?

    MSVC 编译器说fopen 已弃用 建议使用fopen s 有什么办法可以使用吗fopen s 并且仍然便携 任何想法 define 微软的 s函数是不可移植的 我通常使用等效的 C89 C99 函数并禁用弃用警告 define CRT
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 如何有效地计算 Perl 中覆盖给定范围的范围?

    我有一个大约 30k 范围的数据库 每个范围都作为一对起点和终点给出 12 80 34 60 34 9000 76 743 我想编写一个 Perl 子例程来表示一个范围 不是来自数据库 并返回数据库中完全 包含 给定范围的范围数 例如 如果
  • 在未排序的整数列表中最优搜索 k 个最小值

    我刚刚接受采访时提出了一个问题 我很好奇答案应该是什么 问题本质上是 假设您有一个包含 n 个整数的未排序列表 您如何找到此列表中的 k 个最小值 也就是说 如果您有一个 10 11 24 12 13 列表并且正在寻找 2 个最小值 您将得
  • 内容长度标头与分块编码

    我正在尝试权衡设置的利弊Content LengthHTTP 标头与使用分块编码从我的服务器返回 可能 大文件的比较 使用持久连接需要其中之一来符合 HTTP 1 1 规范 我看到了的优点Content Length标头是 下载对话框可以显
  • 避免 VBCSCompiler 对 Roslyn 支持的 ASP.NET Razor MVC 视图造成性能影响?

    为了在 MVC5 上的 Razor 视图中支持 C 6 我们通过 web config 打开了 Roslyn 编译器平台
  • 用更有意义的文本替换 GCC 输出中的 a-hats [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gcc 的所有错误消息中都有 https stackoverflow com questions 547071 why does gcc have a in all its error mes
  • 在 R 中替换数据帧中最低列表值的最有效方法

    我有一个数据框 df 其中包含为每个受试者记录的数字列表 向量 用于测试项目的两次重复 subj item rep vec s1 1 1 2 1 4 5 8 4 7 s1 1 2 1 1 3 4 7 5 3 s1 2 1 6 5 4 1 2
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • Android 在 ROOM 数据库中插入大量数据

    我有大约 10 个模型 每个模型都有超过 120K 行和 90 列的记录 其中包含双数组值 在 Room 中插入任何模型都需要超过 125 130 秒 任何人都可以建议我需要做什么才能使用一些批量插入技术来保存所有这些 120K 该技术大约
  • c - 将 .data 发送到不同的部分

    我想把其中的符号 data为特定 C 文件生成的节并将它们放在不同的节中 例如 mydata 在最终的可执行文件中 例如 normaldata c char my str this should appear in data special
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op

随机推荐

  • Vue.js 隐藏当前视口之外的项目

    我正在 Vue js 中制作一个电子商务类型的菜单 其中的项目是包含大量功能和图像的 div 当渲染大约 200 个这样的项目时 性能相当不错 但是当添加的数量超过这个数量时 网站的性能开始变得缓慢 如果 Vue 元素位于当前可滚动视图之外
  • 为什么 Scala 程序的编译速度非常慢?

    过去两个月我一直在使用 Scala 我还在一个小应用程序中使用 Play 框架 我观察到 即使对于打印 Hello World 的程序来说 编译也非常慢 为什么这么慢 有什么减少时间的技巧吗 您的情况下编译速度有多快 scalac 的速度受
  • 无法访问 GridView 中的 HyperLinkField 文本

    我有一个 HyperLinkField 定义如下
  • 在 vs 代码编辑器中隐藏代码块行

    我的所有代码上都有这些奇怪的行 它们似乎突出显示了代码块 我该如何关闭它们 我的是1 30版本 Link https ibb co z5Tt6t4 https ibb co z5Tt6t4 所以左边的白线 它们叫什么以及如何将它们关闭 您可
  • 识别不在另一个数据框中的记录

    我有一个像这样的数据框 data1 pd DataFrame a z 0 a y 20 b z 1 columns id1 id2 number data2 pd DataFrame a y 1 a y 1 b z 0 columns id
  • NLog 的线程安全性如何?

    Well 我等了好几天才决定发布这个问题 因为我不知道如何陈述这一点 结果写了一篇很长的详细帖子 不过 我认为此时向社区寻求帮助是有意义的 基本上 我尝试使用 NLog 为数百个线程配置记录器 我认为这会非常简单 但几十秒后我得到了这个异常
  • 埃拉托斯特尼筛法速度比较:Python 与 Julia

    所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子 并且我正在比较运行时间 这是Python代码 import time def get primes n numbers set range n 1
  • 将缺失值 (NA) 替换为空白(空字符串)

    我有一个带有 NA 行的数据框 df data frame c classA NA classB t data frame rep A 5 rep NA 5 rep B 5 rownames df lt c 1 2 3 colnames d
  • 使用 Swift 3 在 Xcode 8 中构建适用于 WatchOS 和 iOS 的嵌入式框架

    我正在将最初用 Swift 1 编写的全 iOS WatchOS 1 应用程序移植到最新的 Xcode 8 WatchOS 3 Swift 3 我的应用程序有一个嵌入式框架 具有一些常用功能 用于编译和运行 watchkit 扩展目标和 i
  • 如何避免每次创建新的 javafx 项目时添加 vm 参数?

    我正在使用 e fx clipse 插件和 scenebuilder 在 STS 4 6 1 中创建 javafx 项目 每次创建新项目时 我都必须在运行配置中添加虚拟机参数 module path home path to javafx
  • Excel 数据透视表“显示为”值列中的差异

    当值显示为父列总数的百分比时 有没有办法让数据透视表自动计算两列之间的差异 现在我需要手动 但表格是动态的 竞争对手的数量可能会有所不同 功能看起来很简单 但在谷歌搜索后找不到它 See example picture below of w
  • 在 iOS 6 中,检查一个人是否登录了社交网络?

    有没有办法检查用户是否确实在操作系统中登录了 facebook 或 twitter 我想这样做的原因是依靠应用程序中的共享 例如使用 facebooks SDK 来共享 而不要求用户再次登录 我实际上认为代码 SLComposeViewCo
  • Apache Spark 警告“在 RowBasedKeyValueBatch 上调用溢出()”的含义

    我正在使用 Apache Spark 本地模式运行 pyspark 2 2 0 作业 并看到以下警告 WARN RowBasedKeyValueBatch Calling spill on RowBasedKeyValueBatch Wil
  • SSIS 包损坏,错误为 0xC00CE504

    我有一个损坏的 SSIS 包 并显示错误消息 由于错误 0xC00CE504 名称以无效字符开头 第 13 行第 2 列 无法加载 XML 当加载包并且文件无法打开或无法正确加载到 XML 文档时会发生这种情况 这可能是由于向 LoadPa
  • 部分彩色文本并使其在 Jetpack Compose 中可点击 [重复]

    这个问题在这里已经有答案了 对于 XML 中声明的视图 我们可以使用SpannableStringBuilder正如这里提到的https stackoverflow com a 4897412 9715339 https stackover
  • 已经运行的应用程序现在出现套接字错误 10013

    我在 VB NET 中完成了一个应用程序 该应用程序侦听特定的 UDP 端口并通过同一端口应答发送数据包的 IP 从几年到上个月 它都运行良好 现在当尝试回答由于套接字错误 10013 导致的崩溃时 我什至尝试了一个我知道它也可以工作的旧版
  • JavaScript 中的 FFMPEG 命令

    是否可以使用如下命令 ffmpeg i video 1920 mp4 vf 比例 640 360 video 640 mp4 hide banner在纯 JavaScript 中降低视频的分辨率 例如 我有一个下拉菜单 其中有标签 所以我想
  • JTextArea 组件中的 Unicode 支持 [重复]

    这个问题在这里已经有答案了 我制作了这个简单的程序 我想在 JTextArea 中显示 unicode 符文字符 u16e6 该符号显示在 JFrame 的顶部 但不在 JTextArea 中 我已将 JTextArea 的字体设置为与 J
  • 如何远程在BitBucket上创建存储库?

    我想在 Bitbucket 上使用 hg 命令从本地计算机创建存储库 而不是在 Bitbucket 上手动创建存储库 是否可以 我通过curl 命令使用REST API 执行了以下操作 gt curl k X POST user user
  • 如何正确确定Intel处理器的-march和-mtune?

    我目前正在从源代码构建一个对我来说性能至关重要的软件 因此 我想对其进行优化 以便在我的特定 Intel CPU 上运行 构建过程要求我设置 march 和 mtune 标志 如果在我的处理器节点上我使用 gcc march native