gpt4 book ai didi

c++ - 与神秘指针相关的多线程速度减慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:19 24 4
gpt4 key购买 nike

背景:所以我正在研究光线追踪器......为了构建空间分区方案,我最初有一些这样的代码:

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;
}

基本上,这个空间划分树构造完成后,光线遍历树寻找模型,这些模型都存储在一个大数组中。叶节点包含模型的指针数组

然后我意识到,嘿,我没有理由添加额外的间接级别;如果我正确地安排我的模型,我可以让叶节点直接指向大量模型。大数组中彼此相邻的模型都属于给定的叶节点,因此叶节点将包含指向模型的指针。所以我这样做了,并在其他一切保持不变的情况下对其进行了测试。

现在人们会认为这显然会加快程序的速度。好吧,它确实加快了单线程版本的速度(大约 10%),但它减慢了多线程版本的速度(大约 15%!如果你正在进行大量优化,这是非常重要的。)不知道如何解决这个问题——我认为间接是不好的,我认为减少内存使用是好的,尤其是对于多线程。没有任何写入叶节点或模型,所有写入都已完成到一个单独的数据结构。

任何关于如何分析问题的指示/建议都会很棒。

一些杂项统计数据:cachegrind 告诉我,双间接方法的指令引用/缓存未命中较少,但数据引用/缓存未命中更多。不过两者的差别并不大。

编辑: 根据要求,我关注的数据结构:

class Node {
ushort type;
union {
ushort axisID;
ushort childrenSize;
};
union {
Model **models;
Node *rightChild;
};
float leftPlane, rightPlane;
... public methods and stuff ...
}

我基本上将 Model **models 更改为 Model *models,然后速度下降。 Model 类本身包含指向两个抽象类的指针,ShapeMaterial。这里提到的所有类都是 block 分配的,Material 除外,因为目前我只使用一个。

最佳答案

我的第一个猜测是您遇到了 false-sharing .如果您有多个线程同时修改同一缓存行中的内存,则硬件将花费大量时间在处理器之间传递缓存行的所有权。

关于c++ - 与神秘指针相关的多线程速度减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1689486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com