- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
下面两行有什么区别?
__m128 x = _mm_load_ps((float *) ptr);
__m128 y = _mm_load_pd((double *)ptr);
换句话说,为什么有这么多不同的 _mm_load_xyz
指令,而不是通用的 __m128 _mm_load(const void *)
?
最佳答案
有不同的内在函数,因为它们对应于不同的指令。
之所以有不同的加载指令,是因为英特尔希望保留设计处理器的自由,在该处理器上, double vector 由与单精度 vector 或整数 vector 不同的物理寄存器文件支持,或者使用不同的执行单元。如果没有办法指定应将数据加载到适当的寄存器文件或转发网络中,那么任何这些都可能会增加额外的延迟。
一种思考方式是,不同的指令执行“相同的事情”,但另外向处理器提供提示,告诉它正在加载的数据将如何被 future 的指令使用。这可能有助于处理器确保数据位于正确的位置以尽可能高效地使用,否则处理器可能会忽略它。
请注意,这不仅仅是一个假设。存在使用整数 vector 加载 (MOVDQA) 加载浮点运算消耗的数据比使用浮点加载获取浮点运算数据需要更多时间的处理器(反之亦然) .有关该主题的更多详细信息,请参阅英特尔优化手册或 Agner Fog 的注释。使用与您将如何使用数据相匹配的负载,以避免将来出现此类性能危害的风险。
关于c - _mm_load_ps vs. _mm_load_pd vs. Intel x86 ISA 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8856044/
我有一个代码片段。该代码片段仅加载 2 个数组并使用 SSE 计算它们之间的点积。 代码在这里: using namespace std; long long size = 3200000; floa
所以我在学习使用 SSE 内在函数编程时遇到了这个玩具示例的问题。我在这里的其他线程上读到,有时 _mm_load_ps 函数的段错误是由于没有正确对齐而引起的,但我认为它应该由 attribute(
我正在用 C++ 编写一个简单的卷积函数,从非常基本的“滑动窗口”卷积到常规产品(目前没有 FFT 的东西),直到 SEE、AVX 和可能的 OpenCL。不过我遇到了 SSE 的问题。我的代码如下所
我正在查看为我的代码生成的程序集(使用 Visual Studio 2017)并注意到 _mm_load_ps 经常(总是?)编译为 movups。 我使用 _mm_load_ps 的数据定义如下:
下面两行有什么区别? __m128 x = _mm_load_ps((float *) ptr); __m128 y = _mm_load_pd((double *)ptr); 换句话说,为什么有这么
我是一名优秀的程序员,十分优秀!