如何比较矢量化和非矢量化代码
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】:编译器优化级别包含许多单独的优化,而不仅仅是矢量化。可以是数学模型,循环展开……
所有这些的结果都会有所不同,所以是的,请停用您的编译器(未指定...)向量化例程以查看仅由向量化产生的差异。
您不应该进行较低的优化,因为已经完成的这些其他优化可能会自行增加数值差异。
【讨论】:
以上是关于如何比较矢量化和非矢量化代码的主要内容,如果未能解决你的问题,请参考以下文章
QMT策略编写如何优雅地调教QMT量化平台编写量化策略(使用notepad++pycharmvscode等外部IDE编写量化交易代码)