我已经编写了一些在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),那会有些复杂。

09-20 17:01