C++ 中 SSE/AVX 的 x86 CPU 调度

Posted

技术标签:

【中文标题】C++ 中 SSE/AVX 的 x86 CPU 调度【英文标题】:x86 CPU Dispatching for SSE/AVX in C++ 【发布时间】:2011-01-24 23:56:42 【问题描述】:

我有一个算法,它受益于 SSE(2) 内在函数的手动优化。此外,该算法未来还将能够受益于 256 位 AVX 寄存器。

我的问题是最好的方法是什么

在编译时注册我的类的可用性变体;因此,如果我的类是:FooFooSSE2FooAVX,我需要一种方法来确定在运行时编译了哪些类。 确定当前 CPU 的能力。在最低级别,这将导致cpuid 调用。 在运行时根据编译的内容和支持的内容决定要使用的内容。

虽然我可以破解上述大部分内容,但它似乎是一个足够常见的问题,必须出现一些最佳实践。理想情况下,我试图避免 #ifdef 混乱

#ifdef COMPILE_SSE2
    if (sse2_supported)
        // Use the SSE2 class
#endif

【问题讨论】:

【参考方案1】:

只需创建一个“工厂”类或函数来创建类的适当实例并隐藏实现工厂的文件中的所有逻辑。

有一些类或文件本地布尔值,如“isSSE2Supported”或“isAVXSupported”。在启动时,调用一些函数来初始化这些值。然后,您的工厂逻辑可以检查这些值以确定要使用的类。

由于 SSE2 在 x64 芯片上始终可用,因此您并不想避免所有的 ifdef。您可以避免为 x64 构建编译某些类。

【讨论】:

以上是关于C++ 中 SSE/AVX 的 x86 CPU 调度的主要内容,如果未能解决你的问题,请参考以下文章

用于灰度到 ARGB 转换的 C++ SSE2 或 AVX2 内在函数

TensorFlow关于 SSE AVX的Warning问题

SIMD指令集——一条指令操作多个数,SSE,AVX都是,例如:乘累加,Shuffle等

为啥并行 SIMD/SSE/AVX 需要置换?

使用 C/C++ 在同一个可执行文件中进行不同的优化(plain、SSE、AVX)

SIMD,SSE,AVX - 掩码 8 浮动无符号字符? [复制]