如何比较矢量化和非矢量化代码

Posted

技术标签:

【中文标题】如何比较矢量化和非矢量化代码【英文标题】:How to compare vectorized and non-vectorized codes 【发布时间】:2018-12-05 10:38:36 【问题描述】:

我想知道如何将矢量化代码与其非矢量化版本进行比较?例如,我有一个简单的 fortran 代码,我用 -O2 编译它以启用自动矢量化。之后,我可以从优化报告中看到,循环被矢量化了。现在,如果我想将此矢量化代码与其非矢量化版本进行比较,我应该用-O2 -no-vec-O1 甚至-O0 编译相同的代码吗?好吧,根据我的经验,-O2 -no-vec-O1 都没有显着差异,尽管前者总是稍好一些。但是,如果我比较-O2-O0,结果会显着不同,这不仅仅是向量宽度的数量;因此,我确信不应该比较这些来强调矢量化的好处。所以,我只想知道我应该将-O2-O2 -no-vec-O1 进行比较,因为我阅读了许多期刊,它们从未详细解释过这个问题,但只说明了例如“......与其非矢量化版本相比,矢量化代码实现..."

【问题讨论】:

这取决于你为什么要比较它。对于“......与其非矢量化版本相比,矢量化代码实现......”的情况,您可能希望矢量化之外的差异很小 @HighPerformanceMark:谢谢 :) @Caleth:我只想强调矢量化的好处。例如,如果我使用单精度算术并在 AVX 机器上运行我的代码(单精度向量长度为​​ 8),那么最大。理论加速是 8 倍。出于这个原因,我可以将“-O2”与“-O2 -no-vec”进行比较吗?谢谢。 @MatthieuBrucher:我明白了。所以,答案是:我不应该进行较低的优化,我应该只设置'-no-vec'来强调每个优化标志的矢量化效果,对吧? @MatthieuBrucher:是的,请这样做。我会投票的:) 【参考方案1】:

编译器优化级别包含许多单独的优化,而不仅仅是矢量化。可以是数学模型,循环展开……

所有这些的结果都会有所不同,所以是的,请停用您的编译器(未指定...)向量化例程以查看仅由向量化产生的差异。

您不应该进行较低的优化,因为已经完成的这些其他优化可能会自行增加数值差异。

【讨论】:

以上是关于如何比较矢量化和非矢量化代码的主要内容,如果未能解决你的问题,请参考以下文章

量化交易中,如何快速把股票代码转换成Int整形?

量化交易中,如何快速把股票代码转换成Int整形?

量化交易中,如何快速把股票代码转换成Int整形?

如何矢量化这个 python 代码?

QMT策略编写如何优雅地调教QMT量化平台编写量化策略(使用notepad++pycharmvscode等外部IDE编写量化交易代码)

让编译器以合理的方式自动矢量化代码