gpt4 book ai didi

c - GCC 兼容多种架构的最高指令集

转载 作者:太空狗 更新时间:2023-10-29 15:00:05 27 4
gpt4 key购买 nike

我在一个由不同架构的机器组成的集群上运行作业:gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3 给我其中之一:broadwellhaswellivybridgesandybridgeskylake

可执行文件需要相同,所以我不能使用 -march=native 但同时架构有一些共同点(我认为它们都支持 AVX?)。

我知道 gcc(与 Intel icc 相反)不允许在单个可执行文件中使用多个架构。我想知道的是,是否有办法向 gcc 询问与上面列出的所有架构兼容的最高指令集。

海湾合作委员会版本:8.1.1

最佳答案

英特尔从未在同一 CPU 的 future 版本中删除指令集。即,在旧 Intel CPU 上运行的二进制文件总是在较新的 Intel CPU 上运行。

(唯一的异常(exception)是第一代 Xeon Phi:Knight's Corner 使用了一种称为 KNI 的不兼容 AVX512 变体,但后来的 Xeon Phi 加速器卡/计算机使用了 AVX512。)


如果您必须在所有 CPU 上使用相同的二进制文件,使用 gcc -march=sandybridge -mtune=haswell ,并确保您的重要数组按 32 字节对齐。

也许值得用 gcc -march=sandybridge 进行基准测试(即使用 tune=sandybridge),看看哪个更适合您的代码。 -mprefer-avx128-mprefer-vector-width=256尝试一下可能会很有趣:当 gcc 使用 256 位 vector 自动向量化时,一些循环会变得困惑。


SnB/IvB 具有低效的未对齐 AVX 加载/存储,因此 tune=sandybridge 设置 -mavx256-split-unaligned-load ,如果您的数据 在运行时对齐但编译器不知道这一点,那将很糟糕。额外的指令和洗牌对 Haswell 没有帮助,所以 -mtune=haswell包括 -mno-avx256-split-unaligned-load .

不幸的是,gcc 没有“tune=avx2”选项来调整所有具有 AVX2 的 CPU,也没有调整支持您启用的指令集的普通 CPU 的选项。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568 .您唯一的选择是针对特定 CPU 进行调优,或者针对通用基线进行调优,或者使用特定的调优选项。


Gcc 确实有一些对运行时分派(dispatch)的支持 ifunc

您必须在源代码中激活它才能使用特定功能。参见 https://lwn.net/Articles/691932/有关函数多版本控制的更多信息。


最佳选择:为 SnB/Haswell 构建单独的二进制文件,并使用脚本或 $PATH 发送设置

在每个集群节点上,创建一个 /etc/host-type或任何具有 sandybridge 的东西或 haswell管他呢。任何每节点文件系统都可以,或者在运行时使用 gcc 重新检测它或者更便宜的东西。在您的作业脚本中:

#!/bin/sh

bin_dir="./bin-$(</etc/node-type)"
exec "$bin_dir/my_prog" "$@"

根据需要创建符号链接(symbolic link)以生成 bin-skylakebin-broadwell使用 Haswell 二进制文件。

Haswell 介绍了 AVX2 和 FMA,以及 BMI1/2。如果您正在处理数字,那么您真的需要 FMA。 BDW/SKL 没有引入任何重要的 ISA 扩展,编译器可以使用这些扩展来使您的代码运行得更快。 BDW/SKL 的调整也没有什么不同。

如果您有任何 Skylake-avx512 CPU,那就不同了。

关于c - GCC 兼容多种架构的最高指令集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com