为什么在执行 SIMD 指令时需要 SSE 对齐?

Why is SSE alignement necessary while doing SIMD instructions?

我是 C++ 的新手,我只有 1.5 年的使用该语言的经验。

我必须使用具有预制数据结构的库,它提供了一种方法来使我们自己的数据结构遵循特定规则,以便使其适应库。

这是PCL library. The data structure I am talking about is the Point Type

这些“规则”之一是SSE将点类型的数据对齐到16个字节(我认为这是16个字节)。但是我不明白为什么。

我必须创建奇怪的联合和结构才能实现。为什么我不能只做一个简单的结构,把我需要的每一个浮点数都放进去?

我看到强烈建议将 SSE 对齐用于 SIMD 指令,我怀疑 PCL 库会使用它。 SIMD 指令有用吗?

SIMD 表示“单指令多数据”。

现代计算机有多种方法可以同时做不止一件事。物理限制使得构建 运行 比 5 GHz 快得多的计算机变得困难。因此,现代计算机在一次做不止一件事方面做得更好,而不是 运行更快地执行一组指令。

要利用这一点,我们需要在计算机程序中一次做不止一件事。

一次做不止一件事的一种方法是使用多个进程——程序——运行同时进行。

另一个是程序中的线程,其中每个线程都有自己的指令和数据。

CPU 指令流水线化发生在单个线程中。其中,每条指令所需的一些工作以重叠的方式完成。根据体系结构,机器代码可能需要也可能不需要知道这些延迟;在 x64 AMD/Intel 中,如果在下一条指令之前需要其输出,通常 CPU 会“停止”计算。编译器试图避免这种停顿。

SIMD 是另一种同时做多件事的方法。它也被称为矢量化。 SIMD对多条数据有相同的指令运行ning。所以如果你有一堆数学向量(每个都有多个分量:比如,x、y、z、w)你想分段加起来,一个 SIMD 指令可以分别添加 xs、ys、zs 和 ws同时

SIMD 指令通常要求您的数据在内存中以特定方式对齐。对于 4 个 32 位整数的 128 SIMD 指令,通常要求使用的地址是 128 位(或 16 字节)的倍数——地址中的最低 4 位必须为 0。

SIMD 指令最适用于大型数据缓冲区,因为它们是流水线式的。因此,对齐数据的成本很低,CPU 中的收益很高。

在某些架构中,即使是非 SIMD 数据也需要对齐,并且对齐通常可以加快读取速度。

SIMD 指令比天真地做要快很多倍。现代 SIMD 指令有时是 512 字节宽,接近在单个 16 或 8 或 32 位值上执行单个指令的速度;这样他们就可以使程序快 10 倍; this SO blog post has one example of a more than 10x speedup.

当然,那是理想情况。通常提升幅度较小,但即使是 2 倍的加速对用户体验也很重要。