可持续测试POPCNT指令

时间:2016-01-12 07:03:32

标签: config sse configure autoconf cpu-architecture

我希望我的配置脚本能够在各种类Unix系统中检测POPCNT指令的可用性。目前我做了这些测试:

  1. 寻找" popcnt"在/ proc / cpuinfo中。这适用于Linux和Cygwin。
  2. 寻找" popcnt"在" sysctl -n machdep.cpu.features"的输出中。这适用于MACOSX和(未经测试的)BSD,
  3. 寻找" popcnt"在" isainfo -v -x"的输出中。这在solaris中有效(未经测试)。
  4. greps是独立完成的。你能看到这些问题吗?你知道其他任何测试吗?

    需要root权限的测试是没有用的。

1 个答案:

答案 0 :(得分:1)

因此,您拥有启用-mpopcnt的代码,如果速度很快,则使用__builtin_popcount。否则你会使用不同的东西,因为你的自定义解决方案胜过gcc的实现?

在某些情况下请记住host!= target。构建时CPU检测不适合制作必须在其他计算机上运行的二进制文件。例如Linux发行版制作二进制文件。交叉编译也是一件事,通常在定位嵌入式系统或旧的慢速系统时完成。

也许编写一个返回所需结果的自定义C程序。

在x86上,您可以使用运行时CPU检测的结果:运行CPUID指令并检查是否支持popcnt。最好不要无条件地运行popcnt指令,因为运行非法指令的进程会在某些现代发行版(例如Ubuntu)上生成一个syslog条目。

使用最近的GNU C扩展,最简单的方法是:__builtin_cpu_init()__builtin_cpu_supports("popcnt"),省去了手动解码CPUID结果的麻烦。

然后,您可以针对自定义宏回退到__builtin_popcount的微基准,并采取更快的速度。即使在非x86架构上,这可能也很有用,因为你的宏击败了gcc的实现。 (例如,总是有popcnt指令的架构)。然后你必须处理你应该使用__builtin_popcount而不是使用-mpopcnt构建

的情况