如何正确确定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? 的相关文章

随机推荐

  • 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