【发布时间】:2018-11-23 16:39:39
【问题描述】:
This book 说:
对于 Knights Landing,内存移动在数据开始时是最佳的 地址位于 64 字节边界上。
第一季度。有没有办法在 C++ 代码中动态查询处理器,以了解当前运行应用程序的处理器的最佳n-byte 边界是多少?这样,代码就可以移植了。
这本书进一步指出:
作为程序员,我们最终要完成两项工作:(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;}
}
假设我也有这样原型化的函数:
void func1(Class1_& obj_class1);
void func2(double* array);
即func1通过引用获取Class1_的对象,func2被称为func2(obj_class1.return_heap_array_address());
为了与数据应适当边界对齐的建议保持一致,obj_class1 本身是否应为 64 字节边界对齐以使func1() 有效运行? potentially_longish_heap_array_double 是否应该与 64 字节边界对齐以使 func2() 有效运行?
对于作为 STL 容器的类的其他数据成员的对齐,线程 here 建议如何完成所需的对齐。
第二季度。那么,对象本身以及其中的所有数据成员是否需要适当对齐?
【问题讨论】:
-
检查对齐要求的常用方法是做 cpuid + table 检查对齐....非常手动。
-
对于对齐问题,我认为(因为它是数据对齐)主要用于向量操作,您希望它们以没有“剥离”开头,因此您希望数组为 64 字节(或位??)对齐。
-
显示你想要向量化的算法。
-
至于 Q1:根据评论,这似乎是在谈论缓存行大小。在那种情况下相关:stackoverflow.com/questions/39680206/…
-
@Tryer 不,这不是一个好主意,因为这样每个变量将占用整个缓存行,并且一次只能缓存其中的几个,所以实际上你的内存要多得多访问会导致缓存未命中。
标签: c++ vectorization compiler-optimization simd memory-alignment