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



我是C++的新手,我只有1.5年的C++经验。

我必须使用一个具有预制数据结构的库,它提供了一种按照某些规则制作我们自己的数据结构的方法,以便使其与库相适应。

这是PCL库。我所说的数据结构是点型

其中一个";规则";是将点类型的数据在16个字节上SSE allign(我认为这是16个字节(。但我不明白为什么。

我必须建立奇怪的联盟和结构才能做到这一点。为什么我不能只建立一个简单的结构,把我需要的每一个浮子都放进去呢?

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

SIMD的意思是";"单指令多数据";。

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

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

同时做多件事的一种方法是同时运行多个进程(程序(。

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

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

SIMD是同时做多件事的另一种方式。它也被称为矢量化。SIMD具有在多条数据上运行的相同指令。因此,如果你有一堆数学向量(每个向量都有多个分量:比如,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倍;这篇SO博客文章有一个超过10倍加速的例子。

当然,这是一个理想的情况。通常情况下,提升幅度较小,但即使是2倍的加速也会对用户的体验产生重大影响。

最新更新