Gas*_*ton 0 c++ data-structures point-cloud-library
我是 C++ 新手,我对该语言只有 1.5 年的经验。
我必须使用一个具有预制数据结构的库,它提供了一种按照某些规则创建我们自己的数据结构的方法,以便使其适应该库。
这是PCL 库。我说的数据结构是Point Type
这些“规则”之一是SSE将点类型的数据排列在16个字节上(我认为这是16个字节)。但我不明白为什么。
我必须建立奇怪的联合和结构才能实现它。为什么我不能只制作一个简单的结构并将我需要的每个浮动放入其中?
我看到强烈建议对 SIMD 指令使用 SSE 对齐,我怀疑 PCL 库会使用它。SIMD指令有用吗?
SIMD的意思是“单指令多数据”。
现代计算机有多种方法可以同时完成一件事。由于物理限制,构建运行速度比 5 GHz 快得多的计算机变得困难。因此,现代计算机反而变得更擅长一次做不止一件事,而不是更快地运行一组指令。
为了利用这一点,我们需要在计算机程序中一次做不止一件事。
一次做多件事的一种方法是同时运行多个进程(程序)。
另一种是程序内的线程,其中每个线程都有自己的指令和数据。
CPU 指令的流水线操作发生在单个线程中。其中,每条指令所需的一些工作是以重叠的方式完成的。根据架构的不同,机器代码可能需要也可能不需要知道这些延迟;在 x64 AMD/Intel 中,如果在下一条指令之前需要输出,CPU 通常会“停止”计算。编译器试图避免这种停顿。
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 倍的加速也可能对用户体验产生重大影响。