【发布时间】: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