CMake如何验证循环是不是自动矢量化
Posted
技术标签:
【中文标题】CMake如何验证循环是不是自动矢量化【英文标题】:CMake how to verify that a loop was auto-vectorizedCMake如何验证循环是否自动矢量化 【发布时间】:2021-03-10 10:09:32 【问题描述】:所有支持矢量化的 C++ 编译器都允许发出一些报告 (*) 以验证循环是否已矢量化,每个在矢量化报告中都有自己的编译标志和格式。
我可以启用相应的标志并直观地检查报告以检查我希望自动矢量化的循环是否确实自动矢量化。
我想在我的 CMake 构建中加入一个自动检查这一点的步骤,如果它没有自动矢量化,则构建失败。
如何使用 CMake 做到这一点? 有没有人已经以某种方式解决了这个问题?
提前致谢
(*) MSVChttps://docs.microsoft.com/en-us/cpp/build/reference/qvec-report-auto-vectorizer-reporting-level?view=msvc-160
gcc https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html
叮当https://llvm.org/docs/Vectorizers.html#diagnostics
【问题讨论】:
¿cmake 中最后一次开箱即用是什么时候?也许您需要添加一些自定义命令。 很公平。我会完成这个问题。 【参考方案1】:我想在我的 CMake 构建中加入一个自动检查这一点的步骤,如果它没有自动矢量化,则构建失败。
如何在 CMake 中做到这一点?
逐步申请dynamic programming:
-
创建一个可以检测程序是否“自动矢量化”的算法。
您可以使用通过特殊选项生成的编译器的一些输出,为什么不呢。
您还可以反汇编代码并找到“循环”并检查一些指令或语法。
然后编写一个实现该算法的可移植程序,最好使用某种可移植语言。
将自定义目标添加到 cmake 配置以运行可能如下所示的检查:
add_executable(final_exe sources.c...)
add_exececutable(check_if_vectorized sources.c...) # if compiled, choose your own language
add_custom_target(check_if_final_exe_is_vectorized
COMMENT "Check if final_exe was vectorized"
COMMAND $<TARGET_FILE:check_if_vectorized> $<TARGET_FILE:final_exe>
DEPENDS $<TARGET_FILE:check_if_vectorized> $<TARGET_FILE:final_exe>
)
您还可以使用add_test
添加检查并让它像测试一样运行。
有什么开箱即用的方法吗?
没有。
【讨论】:
如何将编译的输出(包含矢量化报告)传送到我的自定义命令? 编写一个程序,获取程序的输出并将其传递给自定义程序。通常这是 shell 的工作,你做sh -c 'command1 | command2
' 所以如果它可用,请使用 shell COMMAND sh -c '"$@" | command2' -- $<TARGET_FILE:check_if_vectorized> $<TARGET_FILE:final_exe>
。由于set -o pipefail
的陷阱,我会在一个程序和另一个程序之间使用一个临时文件。以上是关于CMake如何验证循环是不是自动矢量化的主要内容,如果未能解决你的问题,请参考以下文章