【发布时间】:2014-05-15 21:06:09
【问题描述】:
请参阅以下链接,第 22 页起:
上面的链接表明我是否有一个包含这样的向量/数组的对象:
class MyClass{
public:
double a[1000];
double b[1000];
};
下面的代码遍历 MyClass 的一个向量并在 std::vector b 上执行一些数学运算:
std::vector<MyClass> y;
y.populateVector();
for(auto x : y){
//Iterate though x.b and do some math;
for(int i=0; i<1000; i++){
std::cout << x.b[i] << std::endl;
}
}
当我们检索每个 MyClass 对象时,两个数组中的所有数据都将被加载到缓存行中。这是真的?我不认为数据a会被加载到缓存行,因为访问b的地址会被计算和加载。
我想知道与处理所需的有用数据相比,有多少 MyClass 对象被加载到缓存中?
我可以理解第一个 b 元素是否与最后一个 a 元素共享相同的缓存行,但我不认为整个对象会被加载到 L2/L3 缓存中只是为了处理一部分对象?
【问题讨论】:
-
在您的情况下,双精度数组不直接存储在类中,而是存储在其他内存位置。 std::vector 只存储一个指针。所以访问b数据加载缓存中数据的可能性很小
-
在您提到的文档中,数据直接存储在结构内部。你可以通过使用 double a[16];而不是 std::vector
a;在这种情况下,a 和 b 在内存中是连续的,并且有合理的机会位于同一缓存行中。 -
我将更改我的示例代码以反映这一点。
-
据我所知,您的代码没有检索到
MyClass对象。您只需遍历对它们的引用并访问它们的b成员。您认为您的代码如何构成“检索”? -
@DavidSchwartz 对象的概念不是很松散吗?我刚刚在上面添加了一些代码,要访问 b 数组,我会说正在访问对象 MyClass?
标签: c++ performance optimization cpu data-oriented-design