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

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

【问题讨论】:

  • 您想依赖 SSE4 的编译器优化吗?或者你只是想使用内在函数?
  • 完全优化最好,但使用内在函数已经很好了。

标签: visual-c++


【解决方案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 指令的生成。” - 所以我认为无论那里设置什么,都可以使用内在函数。这再次引发了更多关于性能差异和“启用增强指令集”选项的一般用途的问题。不过,我暂时保留这个问题,看看是否有人对全面优化有更多想法。
  • 经过更多研究 - 这是唯一的答案。尽管在那里设置了什么,但内在函数仍然有效,因为“启用增强指令集”的优化似乎没有其他选择 - 尽管如果为“一些随机代码”设置此选项,我从未见过任何性能差异。但这是一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多