我的 CPU 中的 SSE 错误?

Posted

技术标签:

【中文标题】我的 CPU 中的 SSE 错误?【英文标题】:SSE bug in my CPU? 【发布时间】:2011-11-07 05:01:28 【问题描述】:

我很困惑。

当我在 Visual C++ 2008 中运行此代码时:

__m128i a, b;
a.m128i_u64[0] = 1;
b.m128i_u64[0] = 0;
a.m128i_u64[1] = 0;
b.m128i_u64[1] = 0;
printf("%d\n", _mm_testc_si128(a, b));

它打印1。这与我的预期相反,因为只有当 ab 相同时它才应该是 1。

这怎么可能?我的 CPU 或 Visual C++ 2008 中是否存在错误?

【问题讨论】:

您尝试使用的指令是 SSE4 (!) - 您确定您的 CPU 支持吗?如果是,如果您将呼叫 int res = _mm_testc_si128(a, b); 移到 printf 之前并在 printf 中使用 res 会发生什么? @Yahia:是的,我的 CPU 支持 SSE4,最高支持 SSE4.2。当我使用临时变量时也会发生同样的事情。 【参考方案1】:

我知道很多 SSE4.1 内在函数在 VS2008 中都被破坏了。他们为 VS2010 修复了它们。在 VS2010(无 SP)中,一些 AVX 内在函数被破坏了。他们在 VS2010 SP1 中修复了这些问题。

我从未使用过 _mm_testc_si128 内在函数,所以我不知道这是否是另一个在 VS2008 中被破坏的内在函数。但我见过很多插入/提取内在函数被破坏的情况。

编辑:我刚刚在 VS2010 SP1 中对此进行了测试,它也给出了 1。

现在我查看了documentation,看起来它“应该”返回 1。

返回值

如果在 b 中设置的所有位都在 a 中设置,则为 1;否则为 0。

所以我认为在这种情况下这不是一个错误。

【讨论】:

OMFG 该死的......我正在拔头发并使用本地 MSDN 库来 VS 2008 而不是在线库,它说返回值为1 if a and b are bitwise identical; 0 otherwise.哇。谢谢。 +1(见here)。 大声笑,看起来他们真的破坏了他们的 VS2008 文档......:P

以上是关于我的 CPU 中的 SSE 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 中的强制 CPU 体系结构

如何设置 C/C++ 编译器选项以对使用中的 CPU 进行最佳优化? [关闭]

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

非 SSE2 CPU 上 SSE2 movq 指令的快速解决方法

SSE中的浮点到uchar转换问题

MSI 安装条件以检查 CPU 的 SSE2 功能?