我是否需要制作多个可执行文件来定位不同的指令集?

xml*_*lmx 6 c c++ compiler-construction optimization instruction-set

考虑我有一个程序来执行AES操作.

一些高级CPU具有AES-NI指令集,而其他CPU则没有.

我必须将我的程序编译成两个可执行文件:A_with_aes_ni.exe和B_without_aes_ni.exe吗?

Z b*_*son 6

你想要什么叫做CPU调度员.Agner Fog在他的Optimizing C++手册的第三章"为不同指令集制作多个版本的关键代码"中有10页的文本.他与GCC和ICC讨论了这一点.

您只需要一个可执行文件,但需要在启用和不启用AES的情况下编译两个不同的目标文件.然后,调度程序确定可用的指令集,并根据该指令选择代码路径.

我尝试使用MSVC2010 cpu调度程序为AVX和SSE的visual studio执行此操作,但没有成功.我怀疑我现在可以让它工作了.

编辑:在Agner Fog的vectorclass中,他有一个文件dispatch_example.cpp,instrset_detech.cpp它应该具有制作调度员所需的大部分内容.您仍然需要弄清楚如何检测CPU是否具有AES.您需要扩充intrset_detect.cpp文件. 根据维基百科,当您读取寄存器中的CPUID位23时,如果CPU具有AES,则设置ECX. 维基百科也有代码示例来读取CPUID(此外instrset_detech.cpp- 另一个很好的例子是在文件cpuid.c中的https://github.com/Mysticial/Flops)