gpt4 book ai didi

sse - 如何在 c++ 的 x64 架构中使用 SSE 指令?

转载 作者:行者123 更新时间:2023-12-04 21:55:31 26 4
gpt4 key购买 nike

目前我正在使用 Visual C++ 内联汇编使用 SSE 嵌入一些核心功能;但是我意识到 x64 模式不支持内联汇编。

在 x64 架构中构建软件时如何使用 SSE?

最佳答案

在 C/C++ 中使用汇编指令的现代方法是使用内部函数。与内联汇编相比,内在函数有几个优点,例如:

  • 您不必担心 32 位和 64 位模式。
  • 您无需担心寄存器和寄存器溢出。
  • 无需担心 AT&T 和英特尔语法。
  • 无需担心调用转化。
  • 编译器可以进一步优化内在函数,这是内联汇编无法做到的。
  • 内部函数与 GCC、MSVC、ICC 和 Clang 兼容(对于大多数内部函数)。

我也喜欢内在函数,因为它很容易用它们模拟硬件,例如为 AVX512 做准备。

您可以找到 Intrinsics MSVC 支持 here 的列表。 Intel has better information on intrinsics 也很符合 MSVC 的内在函数。

但有时您仍然需要或想要内联汇编。在我看来,微软不允许在 64 位模式下进行内联汇编真的很愚蠢。这意味着他们必须为其他编译器仍然可以使用内联汇编完成的几件事定义内在函数。一个例子是 CPUID。 Visual Studio 有 an intrinsic 用于 CPUID,但 GCC 仍然使用内联汇编。另一个例子是adc。很长一段时间以来,MSVC 都没有 adc 的内在属性,但现在 it appears they do

此外,因为他们必须为所有内容创建内在函数,这会导致困惑。他们必须为 mulx 创建一个内在函数,但 Intel's documentation for this is wrong 。他们还必须为 adcxadox 创建内部函数,但 their documentation disagrees with Intel's 和生成的程序集显示没有内部函数生成 adox。因此,程序员再次等待 adox 的内在函数。如果他们只是允许内联汇编,那就没有问题了。

但回到 SSE。除了少数异常(exception),e.g. _mm_set_epi64x in 32-bit mode on MSVC(我不知道这是否已修复)SSE/AVX/AVX2 内部函数可以按预期与 MSVC、GCC、ICC 和 Clang 一起工作。

关于sse - 如何在 c++ 的 x64 架构中使用 SSE 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29651800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com