int*_*nt3 5 c++ optimization performance multithreading pointers
背景:所以我正在研究一个光线跟踪器..为了构建空间分区方案,我最初有一些像这样的代码:
if (msize <= 2) { // create a leaf node
Model **models = new Model*[msize];
for (uint i=0; i<msize; ++i)
models[i] = &mlist[i];
*arrayPtr = Node(models, msize); // class Node contains a copy of models
... increment arrayPtr ...
return;
}
Run Code Online (Sandbox Code Playgroud)
基本上,在构造这个空间分区树之后,光线遍历树寻找模型,模型全部存储在一个大数组中.叶子节点包含指向模型指针数组的指针.
然后我意识到嘿,没有理由让我加上额外的间接水平; 如果我正确安排我的模型,我可以让叶子节点直接指向大型模型.大数组中彼此相邻的模型都属于给定的叶节点,因此叶子将包含指向模型的指针.所以我做了这个,并用其他一切保持不变来测试它.
现在人们会认为这显然会加速该计划.好吧,它确实加速了单线程版本(大约10%),但它减慢了多线程版本(大约15%!如果你正在进行大量优化,这是非常重要的.)我很喜欢如何解决这个问题 - 我认为间接是坏的,我认为减少内存使用是好的,特别是对于多线程...叶子节点或模型没有任何写入,所有写入都是针对单独的数据结构.
关于如何分析问题的任何指示/建议都会很棒.
一些杂项统计:cachegrind告诉我双间接方法的指令引用/缓存未命中次数较少,但更多的数据引用/缓存未命中.但两者的区别并不大.
编辑:根据要求,我关注的数据结构:
class Node {
ushort type;
union {
ushort axisID;
ushort childrenSize;
};
union {
Model **models;
Node *rightChild;
};
float leftPlane, rightPlane;
... public methods and stuff ...
}
Run Code Online (Sandbox Code Playgroud)
我基本上改变Model **models了Model *models,然后我得到速度下降.类Model本身包含一个指向两个抽象类的指针,Shape和Material.这里提到的所有类都是块分配的,除了Material目前我只使用一个.