Visual Studio VC2013 在没有 AVX 的情况下启用 SSE4.1

Posted

技术标签:

【中文标题】Visual Studio VC2013 在没有 AVX 的情况下启用 SSE4.1【英文标题】:Visual Studio VC2013 enabling SSE4.1 without AVX 【发布时间】:2015-08-24 11:14:51 【问题描述】:

我有一个相当简单的问题,但经过一段时间的搜索,我还没有找到真正的答案。 Microsoft 建议启用 AVX 增强指令集,以便同时使用 SSE4 优化代码。 不幸的是,尽管有一些读数,但这也强制使用支持 AVX 的 CPU。有没有一种方法可以启用 SSE4 而无需在 VC2013 中强制执行 AVX? 我认为这个问题的背景很明显,SSE4 的支持时间更长,只需要较旧的 CPU(我认为是 2006 年开始的),而 AVX 需要 2011 年以来的 CPU。有问题的 dll 仅使用 SSE4 的优化,但现在我必须坚持SSE2 牺牲性能以保持其正常工作。

【问题讨论】:

您想依赖 SSE4 的编译器优化吗?或者你只是想使用内在函数? 完全优化最好,但使用内在函数已经很好了。 【参考方案1】:

/arch:SSE2 标志似乎增加了对 SSE2 和更高版本的内在函数的支持。我没有安装 Visual Studio,但这个例子有效(_mm_floor_ps 是特定于 SSE4 的):

#include <smmintrin.h>
#include <iostream>
using namespace std;

int main()

    __declspec(align(16)) float values[4] = 1.3f, 2.1f, 4.3f, 5.1f;
    for(int i = 0; i < 4; i++)
        cout << values[i] << ' ';
    cout << endl;

    __m128 x = _mm_load_ps(values);
    x = _mm_floor_ps(x);
    _mm_store_ps(values, x);

   for(int i = 0; i < 4; i++)
        cout << values[i] << ' ';
    cout << endl;

您可以在线试用here.

【讨论】:

谢谢,这已经很有帮助了!我进一步举了这个例子,并尝试用 /arch:IA32 参数编译它,它也可以编译和工作——而 MS 说“你必须指定 /arch:IA32 以禁用 x86 处理器的 SSE 和 SSE2 指令的生成。” - 所以我认为无论那里设置什么,都可以使用内在函数。这再次引发了更多关于性能差异和“启用增强指令集”选项的一般用途的问题。不过,我暂时保留这个问题,看看是否有人对全面优化有更多想法。 经过更多研究 - 这是唯一的答案。尽管在那里设置了什么,但内在函数仍然有效,因为“启用增强指令集”的优化似乎没有其他选择 - 尽管如果为“一些随机代码”设置此选项,我从未见过任何性能差异。但这是一个不同的问题。

以上是关于Visual Studio VC2013 在没有 AVX 的情况下启用 SSE4.1的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 10 中调试 VC++ 6 项目

为啥我在visual studio 2008 VC++中运行一个Win32控制台应用程序后,弹出一个“没有找到MSVCP90D.dll”?

在不安装 Visual Studio 2010 的情况下使用 vc100 平台工具集?

串口通信IN C++(适用于Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )

在 vc++/visual studio 中获取文件的绝对路径

Visual Studio 中配置openCV问题