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

C+中SSE/AVX的x86 CPU调度+;,x86,sse,simd,avx,X86,Sse,Simd,Avx,我有一个算法,它得益于SSE(2)内部函数的手动优化。此外,该算法还将能够受益于未来的256位AVX寄存器 我的问题是什么是最好的方法 在编译时注册我的类的可用性变体;因此,如果我的类是,比如说:Foo、FooSSE2和FooAVX,我需要一种在运行时确定编译的类的方法 确定当前CPU的能力。在最低级别,这将导致调用cpuid 根据编译的内容和支持的内容,在运行时决定使用什么 虽然我可以破解上面的大部分问题,但这似乎是一个相当普遍的问题,一些最佳实践肯定已经出现了。理想情况下,我会尽量避免#

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

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

  • 在编译时注册我的类的可用性变体;因此,如果我的类是,比如说:
    Foo
    FooSSE2
    FooAVX
    ,我需要一种在运行时确定编译的类的方法
  • 确定当前CPU的能力。在最低级别,这将导致调用
    cpuid
  • 根据编译的内容和支持的内容,在运行时决定使用什么
虽然我可以破解上面的大部分问题,但这似乎是一个相当普遍的问题,一些最佳实践肯定已经出现了。理想情况下,我会尽量避免
#ifdef
混乱

#ifdef COMPILE_SSE2
    if (sse2_supported)
        // Use the SSE2 class
#endif
只需创建一个“factory”类或函数来创建适当的类实例,并隐藏实现该工厂的文件中的所有逻辑

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

由于SSE2在x64芯片上始终可用,因此您并不真正想要避免所有IFDEF。您可以避免在某些类中编译x64版本