能否提供更多信息,解释为什么编译器的成本模型认为对循环进行向量化并不有利?
我在用C 编写一个程序,想让一个循环通过Clang编译器实现向量化。按照 文档 的说明,我使用了编译选项
CFLAGS += -fsave-optimization-record
CFLAGS += -Rpass-missed=loop-vectorize
CFLAGS += -Rpass-analysis=loop-vectorize
这会在屏幕上输出一些注记,以及一个YAML优化报告,我可以使用LLVM的 optview.py 工具查看。
然而,输出信息相当简短。基本上,它给出的“miss”注释/信息是
loop-vectorize: the cost-model indicates that vectorization is not beneficial
loop-vectorize: the cost-model indicates that interleaving is not beneficial
有没有办法从编译器获取更多信息,解释为什么成本模型认为向量化并非有利?
解决方案
当然可以通过从源码重新编译LLVM,并添加调试信息来实现。相关文件是 llvm/lib/Transforms/Vectorize/LoopVectorize.cpp,具体来说是类 LoopVectorizationCostModel。
我猜测你没有得到更多信息的原因是,LLVM使用的成本模型过于复杂——复杂到你需要在源代码层面理解它,才能让信息真正有用。现有的信息似乎更多地是“模型说它没有收益”与“模型说它有收益,但你明确禁用它”之间的对照。要让它更易理解也需要有人投入精力。如果你找到没有这些前提条件的、有普遍实用价值的信息,可以贡献给LLVM!
关于循环应该如何向量化有一些标准规则,但如果成本模型没有以清晰的方式检查它们,它就无法指明某个循环是否违反了某条规则。重要的是,类 LoopVectorizationLegality 首先会检查一个循环是否真的可以向量化,这一步还会提供一些额外的调试信息;成本模型只是决定是否值得这样做。因此,至少你得到的是你的循环是可向量化的这一信息,但可能收益并不大。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。