【问题标题】:CMake test for processor feature处理器功能的 CMake 测试
【发布时间】:2012-01-24 21:14:34
【问题描述】:

我想知道 CMake 是否可以像使用配置脚本一样运行测试。具体来说,我想测试我正在编译的系统是否支持 rdtscp 指令。

我使用的是 Linux,如果我使用的是配置脚本,我可以执行以下操作:

cat /proc/cpuinfo | head -n 19 | tail -1 | grep -c rdtscp

如果 rdtscp 功能不存在,它会给我0,如果存在,它会给我1。然后我可以使用它来确定是否#define RDTSCP。我想知道是否可以用 CMake 做类似的事情,即使它不是完全可移植的(我只在 Linux 下运行,我没有使用 Visual Studio 等)。

【问题讨论】:

  • 在编译时检查这个听起来是个坏主意,因为二进制文件只能在你编译的机器/CPU上可靠地工作。使用 cpuid 指令在运行时检测它可能是一种更好的方法(假设这是您正在谈论的 x86)。
  • 我只是在测试过程中使用此功能进行性能分析,但我支持的一些系统对 rdtscp 有一些不支持。我同意在这种情况下发布二进制文件是个坏主意。
  • 为什么在 grep 中使用 -c?只需:如果 sed -n 19p /proc/cpuinfo | grep rdtscp > /dev/null;然后 echo rdtscp 可用;菲
  • 谢谢,我同意这样更好。但我感兴趣的主要是是否有一种将其与运行 CMake 结合的好方法。我知道使用配置脚本之类的东西是可能的。

标签: linux cmake


【解决方案1】:
execute_process(COMMAND cat /proc/cpuinfo
    COMMAND head -n 19
    COMMAND tail -1
    COMMAND grep -c rdtscp
    OUTPUT_VARIABLE OUT)

【讨论】:

  • 选择第 19 行会使其变得脆弱。在我的桌面(i7-6700k 上的 Linux 4.20)上,该行是wp : yes。而是使用COMMAND grep -l '^flags[[:space:]]*:.*rdtscp' /proc/cpuinfo。或者只是grep -l rdtscp /proc/cpuinfo,但要求flags : 行中的匹配项将防止任何可能的误报。 (要成为更多的腰带和吊带,您可能需要之前/之后的空间)。使用-l 会让 grep 在第一场比赛后退出,以防您使用 head/tail 作为优化以避免在 Xeon Phi 等大型多核系统上处理更多行?
【解决方案2】:

选择第 19 行恰好会使它变得脆弱。在我的桌面(i7-6700k 上的 Linux 4.20)上,该行是

wp              : yes

改为使用grep 的模式匹配功能来检查flags\t\t: 行。

grep -l '^flags[[:space:]]*:.*rdtscp' /proc/cpuinfo 打印文件名并在第一次匹配后成功退出。或者如果找不到匹配项,则不打印任何内容并以失败状态存在。

我不知道 CMake,但根据您可能会使用的其他答案

execute_process(COMMAND grep -l '^flags[[:space:]]*:.*rdtscp' /proc/cpuinfo
    OUTPUT_VARIABLE OUT)

更简单的版本是grep -l rdtscp /proc/cpuinfo,但要求flags : 行中的匹配将防止任何可能的误报。 (要成为更多的腰带和吊带,您可能需要在之前/之后使用空格或行尾,可能使用 PCREgrep 来进行零宽度断言。如果未来的某些功能标志(如 XYZrdtscpABC)可以在没有 RDTSCP 支持的情况下出现未来的事情。或者像broken_rdtscp)。或者我们可以假设 rdtscp 永远不会在 a 行的末尾并寻找 ^flags.*:.* rdtscp

使用-l 让 grep 在第一场比赛后退出,以防您使用 head/tail 作为优化以避免在 Xeon Phi 等大型多核系统上处理更多行?如果rdtscp 不匹配,它仍然会读取整个文件,但可能任何大规模多核系统都会有RDTSCP。无论如何,grep 非常快。

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多