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

标签 x86 sse simd avx

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

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

  • 在编译时注册我的类的可用性变体;因此,如果我的类(class)是:Foo , FooSSE2FooAVX我需要一种在运行时确定编译的类的方法。
  • 确定当前 CPU 的能力。在最低级别,这将导致 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/

    相关文章:

    python - 分析 MIPS 二进制文件 : is there a Python library for parsing binary data?

    c 指针 - 警告格式 '%x' 需要类型为 'unsigned int' 的参数

    c++ - 是否有一个C++函数可以准确返回内置CPU运算RSQRTSS求平方根倒数的值?

    汇编语言——LEA指令可以用来加载值吗

    linux - linux 内核使用哪种类型的内存模型(即平面/分段)?

    c++11 - _mm_free 作为 unique_ptr 的删除器

    x86 - _mm_set_epi8- "set"是什么意思?

    assembly - 具有列优先布局的 int8 x uint8 矩阵向量乘积

    c - 对 4 个整数大小的数组进行 SSE 操作

    c++ - _mm_fmadd_pd 程序收到信号 SIGILL,非法指令