我从事性能极其重要的闭源(二进制分布式)科学软件的工作。在许多情况下,启用 AVX 和类似扩展会带来宝贵的性能优势,但这样做当然会阻止二进制分布式软件在可能不支持这些指令集的旧硬件上运行,而我们不想这样做。我也不想为每个 CPU 功能集提供单独的捆绑包。我在 C 中工作(使用 GCC),目标平台是 Linux/x86_64。
如果可以,我想写这样的代码:
void do_expensive_thing(args) {
if (cpu_has_avx512()) {
// inline AVX512 implementation, using SIMD intrinsics
} else if (cpu_has_avx()) {
// inline AVX implementation, using SIMD intrinsics
} else {
// pure C implementation
}
}
这能做到吗?根据我的经验,除非您启用相关指令集(例如 -mavx512f),否则内在函数将不起作用,但这仅适用于翻译单元级别,因此理论上编译器可能会在代码的其他部分发出这些指令,我在那里还没有检查支持。所以我当然可以将每个实现分解到它自己的翻译单元中,这样我就可以单独控制标志,但是编译器无法内联它们(这在某些情况下可能很重要),更重要的是,它有点让人头疼源代码组织的观点。