【发布时间】:2017-11-12 17:27:40
【问题描述】:
我编写了一个库,在其中使用 CMake 来验证 MMX、SSE、SSE2、SSE4、AVX、AVX2 和 AVX-512 的标头是否存在。除此之外,我检查指令是否存在,如果存在,我添加必要的编译器标志,-msse2 -mavx -mfma 等。
这一切都很好,但我想部署一个二进制文件,它适用于多代处理器。
问题:是否可以告诉编译器 (GCC),每当它使用 SIMD 优化函数时,它必须为架构列表生成代码?当然还要引入高级分支
我的想法类似于编译器为函数生成代码的方式,其中输入指针是 4 或 8 字节对齐的。为了防止这种情况,我使用了__builtin_assume_aligned 宏。
什么是最佳实践?多个二进制文件?命名?
【问题讨论】:
-
这是英特尔编译器可以做的事情,并且在 libstdc++ 中也可以完成(虽然主要是手动 AFAIK)。在程序启动时进行一些能力测试,然后根据扩展指令集的可用性将关键功能分派到不同的版本。
-
GCC 也可以为特定处理器执行此操作,但我想列出一系列处理器并让它生成多个解决方案 - 最好包括高级分支。如果这不可能 - 是否有命名多个二进制文件的约定