我已经编写了一些在Haswell i7处理器上运行的AVX2代码。非Haswell处理器上也使用相同的代码库,在该处理器上,应将其相同的代码替换为它们的SSE等效项。我想知道编译器是否可以忽略非Haswell处理器上的AVX2指令。我需要类似的东西:
public void useSSEorAVX(...){
IF (compiler directive detected AVX2)
AVX2 code (this part is ready)
ELSE
SSE code (this part is also ready)
}
}
现在,我正在编译之前注释掉相关的代码,但是必须有一些更有效的方法来执行此操作。我正在使用Ubuntu和gcc。谢谢你的帮助。
最佳答案
如果只想在编译时执行此操作,则可以执行以下操作:
#ifdef __AVX2__
// AVX2 code
#elif __SSE__
// SSE code
#else
// scalar code
#endif
请注意,使用
gcc -mavx2 ...
进行编译时,会自动定义__AVX2__
。对于__SSE__
同样如此。 (还请注意,您可以使用incantation gcc -dM -E -mavx2 - < /dev/null
检查编译器为任何给定的命令行切换预定义的内容。)如果您想进行运行时分派(dispatch),那会有些复杂。