我有一个算法,它受益于 SSE(2) 内在函数的手动优化。此外,该算法 future 还将能够受益于 256 位 AVX 寄存器。
我的问题是什么是最好的方法
Foo
, FooSSE2
和 FooAVX
我需要一种在运行时确定编译的类的方法。cpuid
称呼。 虽然我可以破解上述大部分内容,但它似乎是一个足够常见的问题,必须出现一些最佳实践。理想情况下,我试图避免
#ifdef
困惑#ifdef COMPILE_SSE2
if (sse2_supported)
// Use the SSE2 class
#endif
最佳答案
只需创建一个“工厂”类或函数来创建类的适当实例并隐藏实现工厂的文件中的所有逻辑。
有一些类或文件本地 bool 值,如“isSSE2Supported”或“isAVXSupported”。在启动时,调用一些函数来初始化这些值。然后,您的工厂逻辑可以检查这些值以确定要使用的类。
由于 SSE2 在 x64 芯片上始终可用,因此您并不真的想避免所有 ifdef。您可以避免在 x64 构建的某些类中进行编译。
关于C++ 中 SSE/AVX 的 x86 CPU 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4788592/