gpt4 book ai didi

c++ - 如果我编写一段代码,其中每个线程修改数组的完全不同部分,是否会保持缓存一致性?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:52 25 4
gpt4 key购买 nike

所以我正在使用 OpenMP 编写一些并行代码(但这个问题应该合理地适用于其他框架),其中我有一个对象数组:

std::vector<Body> bodies;

然后我做了一个小的并行循环来对 bodies 做一些事情。在这个并行部分的开始,设置了一组线程来单独执行循环。循环基本上使用每个 Body 上的 foo 的值(除了有问题的那个)来更新 body 上的 bar 的值问题。所以基本上没有对每个主体上的 foo 的值进行写入,并且对 bar 进行的唯一读取被本地化到控制该特定主体的线程;在伪代码中,它看起来像这样:

//create team of threads, and then this section is executed by each thread separately
for each Body i
for each Body j =/= i
i.bar += (j.foo * 2);
end for
end for

我的问题是这是否会像我认为的那样保持缓存的一致性?因为据我所知,没有一个线程正在接触其他线程正在编辑的东西,所以我觉得它应该是安全的。但这是我需要写的报告中非常重要的一点,所以我想确定一下。

谢谢。

最佳答案

规则是,如果您有多个线程并且其中至少一个是写入器并且线程正在访问同一对象,则需要同步。如果您的所有线程都在读取,那么您根本不需要任何同步。

使用数组/vector ,如果你正在写入它,但每个线程正在写入它自己独特的部分,那么你不需要任何同步,因为你没有访问相同的底层对象(只要你不修改 vector 本身就像添加或删除元素)。唯一的危险是 false sharing .如果两个线程在数组的不同部分工作,但它们碰巧在同一个缓存行上,那么任何修改都会弄脏缓存行,并且两个线程都会受到影响。不过,这只是性能影响,不会导致未定义的行为。

关于c++ - 如果我编写一段代码,其中每个线程修改数组的完全不同部分,是否会保持缓存一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41068201/

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