【问题标题】:How can a SSE2 function be missing from the header it is supposed to be in?应该包含的标头中如何缺少 SSE2 函数?
【发布时间】:2020-01-23 14:41:06
【问题描述】:

我正在使用 VS2013 上的 SSE2 指令,我意识到 Intel documentation 中的某些函数从它们应该包含的标题中丢失。

方法 void _mm_storeu_si32 (void* mem_addr, __m128i a) 应该在 #include <immintrin.h> 但它不是。我确实可以从此标头访问其他方法,例如 __m128d _mm_undefined_pd (void)

如果我在头文件本身中搜索(由 VS2013 提供),确实没有提及 _mm_storeu_si32 指令。

这怎么可能?

【问题讨论】:

  • 我没有对此进行广泛的研究,所以这就是为什么这是评论而不是答案:我希望链接的内在列表是英特尔自己的 C++ 编译器 ICC 的内在。对于 VS,您可以在此处找到该列表:docs.microsoft.com/en-us/cpp/intrinsics/… 尽管请注意该列表会随每个 VS 版本更新,因此您的旧版本可能比您现在在列表中看到的更少。
  • 我认为你做对了!我认为 SSE2 支持意味着来自 Intel Intrisics 的所有指令都可以在支持 SSE2 的编译器中使用,但似乎并非如此。如果我理解正确,这些指令是使用低级硬件指令的用例(在我的_mm_storeu_si32 示例中,它是硬件指令movd, m32 & xmm)。更高级别的_mm_storeu_si32 只是编译器可能会或可能不会选择实现的可选用例。这是有道理的。
  • GCC 和 Clang 也一样:它们并不总是提供 Intel 记录的每个内在名称,尤其是当同一底层指令或强制转换或其他任何东西有多个内在名称时。 (有时只是缺少功能,尤其是对于不用于 SIMD 计算指令的内在函数。)

标签: c++ visual-studio visual-c++ simd sse2


【解决方案1】:

在旧的离线内在函数指南中,_mm_storeu_si32 列在“其他”部分下。现在,在在线intrinsics guide 中,它列在 SSE2 下,但并非所有编译器都实现了它。作为便携式工作 (store_b),您可以使用:

#include<immintrin.h>
void storeu_a(void* mem_addr, __m128i a) {
    _mm_storeu_si32(mem_addr, a);
    return;
}

void storeu_b(void* mem_addr, __m128i a) {
    _mm_store_ss((float*)mem_addr, _mm_castsi128_ps(a));
    return;
}

使用 clang 编译为 identical code,但其他编译器可能会选择 movd 而不是 movssstore_a 和/或 store_b

storeu_a(void*, long long __vector(2)):                     # @storeu_a(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret
storeu_b(void*, long long __vector(2)):                     # @storeu_b(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret

【讨论】:

  • 请注意,_mm_storeu_si32 内在函数是在 VS 2017 或更高版本中的 immintrin.h 中定义的。
  • @wim 非常感谢您的解决方法,这似乎确实按预期工作! :D
  • @ChuckWalbourn 感谢您提供此信息!奇怪的是,微软的 updated 2019 online documentation 中甚至没有内在函数,如果他们确实从 VS17 及更高版本实现了它。
  • 您可以向GitHub 上的主文档库提交拉取请求或问题以修复该问题...
猜你喜欢
  • 2016-01-21
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多