Try*_*yer 1 c++ simd vectorization memory-alignment compiler-optimization
这本书说如下:
对于 Knights Landing,当数据起始地址位于 64 字节边界时,内存移动是最佳的。
Q1. 有没有办法在 C++ 代码中动态查询处理器,以了解n当前运行应用程序的处理器的最佳字节边界是什么?这样,代码就可以移植了。
书中进一步指出:
作为程序员,我们最终有两项工作:(1)对齐我们的数据;(2)确保编译器知道它是对齐的。
(假设对于下面的问题,我们知道处理器的最佳数据是从 64 字节边界开始。)
这个“数据”到底是什么?
假设我有一堂课:
class Class1_{
private:
int a;//4 bytes
double b;//8 bytes
std::vector<int> potentially_longish_vector_int;
std::vector<double> potentially_longish_vector_double;
double * potentially_longish_heap_array_double;
public:
//--stuff---//
double * return_heap_array_address() {return potentially_longish_heap_array_double;}
}
Run Code Online (Sandbox Code Playgroud)
假设我还有原型化的函数:
void func1(Class1_& obj_class1);
void func2(double* array);
Run Code Online (Sandbox Code Playgroud)
也就是说,通过引用func1接收一个对象,并调用为Class1_func2func2(obj_class1.return_heap_array_address());
为了与数据应该适当边界对齐的建议保持一致,obj_class1它本身应该是 64 字节边界对齐以实现 的有效运行func1()吗?应该potentially_longish_heap_array_double对齐 64 字节边界才能有效运行吗func2()?
对于作为 STL 容器的类的其他数据成员的对齐,此处的线程建议如何完成所需的对齐。
Q2。那么,对象本身以及其中的所有数据成员是否需要适当对齐?
一般来说,当您在缓存行边界上对齐数组时,可以最大限度地提高缓存利用率,并且还可以使数组针对任何 SIMD 指令进行适当对齐。这是因为 RAM 和 CPU 缓存之间的传输单位是缓存行,在现代 Intel CPU 上为 64 字节。
然而,增加对齐也可能浪费内存并降低缓存利用率。通常,只有应用程序的关键快速路径上的数据结构可能需要指定增加的对齐方式。
按 {hotness, size} 顺序排列类的成员是有意义的,以便最常访问的成员或一起访问的成员驻留在同一缓存行上。
这里的优化目标是减少高速缓存和 TLB 未命中(或者减少每指令周期/增加每周期指令)。使用大页面可以减少 TLB 未命中。
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |