在不同架构的集群上应该指定哪些AVX和march?

问题描述 投票:0回答:1

我目前正在尝试使用英特尔编译器编译软件,以便在HPC集群上使用。登录节点,也就是我编译和准备计算的地方,使用的是 Intel Xeon Gold 6148 处理器,而计算节点则使用Haswell-(Intel Xeon E5-2660 v3 英特尔至强处理器E5-2680 v3)或Skylake处理器(英特尔至尊金6138).

据我从上面的链接了解,我的登录节点支持英特尔SSE4.2、英特尔AVX、英特尔AVX2以及英特尔AVX-512,但我的计算节点只支持英特尔AVX2(Haswell)或英特尔AVX-512(Skylake)。

如果我在编译时使用 -xHost 在登录节点上,它应该自动使用可用的最高指令集。但哪一个是最高的呢?我怎样才能确保我的程序在两个计算系统上都能以最佳性能运行?我必须编译两个版本吗? 额外的问题。哪一个 -march 在这种情况下,我是否需要指定?

c compiler-optimization hpc avx icc
1个回答
5
投票

由于你使用的是英特尔编译器,你可以使用它的 "自动处理器调度" 的能力,以创建 "胖子 二进制文件,其中包含了SSE兼容,AVX兼容等版本。因此,当你在只有SSE的机器上运行你的 "胖 "二进制文件时,那么只有SSE优化的部分(代码路径)会被执行。当你在AVX机器上运行同样的 "fat "二进制文件时,那么你的二进制文件中经过AVX优化的部分将被执行。这是一个非常强大而又不太为人所知的功能。

你可以使用以下组合来实现它 -斧头-x 英特尔编译器的编译标志.这个想法基本上是你通过-ax指定最高的ISA,通过-x指定默认的 "最低 "ISA。

给定"-ax "的胖二进制文件技术在以下地方有简单的描述。https:/www.chpc.utah.edudocumentationsoftwaresingle-executable.php#submit

更多详情请见第9页给出的精美箔片。https:/www.alcf.anl.govfilesken_intel_compiler_optimization.pdf


最后,我要提一下,在你的描述中,你稍微混淆了ISA的关系。Intel x86处理器的AVX512--将永远支持AVX2。AVX2的机器将永远支持SSE。的 超级简单化 对此的解释是:AVX512是AVXAVX2的超级集,而AVXAVX2可以看作是SSE的超级集(事实上不是,但SSE在AVX机上始终是可用的)。AVX512是AVXAVX2的超级套装,而AVXAVX2可以看成是SSE的超级套装(事实上不是,但SSE还是一直在AVX机器上可用,但不是反过来)。

不管你提到的Haswell(AVX2机器,所以SSE是板载的,但这里自然没有AVX512)和Skylake(AVX512机器,所以AVX2和SSE是板载的)。因此,你可能需要类似-axCORE-AVX512 -xCORE-AVX2这样的东西(在你的列表中,没有低于AVX2的机器--即没有SSE或AVX(1)机器)。你似乎只有Skylake服务器和Haswell服务器。


1
投票

请看一下 功能多变. 虽然它不是一个完美的解决方案,你的问题,它似乎是一个很好的候选人... ...

© www.soinside.com 2019 - 2024. All rights reserved.