gpt4 book ai didi

c++ - 提升线程不会使程序更快

转载 作者:行者123 更新时间:2023-11-28 07:00:09 25 4
gpt4 key购买 nike

我编写了一个 JPG 解码器

for each dataunit{
decode
transform
write to rgb buffer
}

然后我用 boost threads 对它进行编码

for each dataunit{
decode
}
for each dataunit{
transform
}
for each dataunit{
write to rgb buffer
}

...在自己的线程上运行这些循环,其中 2 个线程在 3 核 CPU 上并行运行。但我似乎无法用非线程程序击败我的表现。我错过了什么吗?

线程是否会妨碍编译器优化程序的能力?

非线程程序是否仍会使用我 CPU 的 3 个内核?

非常感谢您清理一切。

编辑:显然我的线程都在访问同一个缓冲区(缓冲区中的不同位置),这会导致很大的 CPU 缓存一致性开销。每个 CPU 内核都有自己的缓存,如果对共享缓冲区进行任何更改,则需要与其他缓存同步。我重组了我的代码,将我的缓冲区分成 3 个,然后让每个线程在它们自己的缓冲区上工作。我希望这能解决任何缓存一致性问题,但它似乎并没有加快我的程序。我仍然无法用我的并行程序打败串行程序。

编辑:不好意思地说我测量的是程序的 CPU 时间而不是 WALL 时间。 WALL time 清楚地表明我的程序在线程化时快了约 50%。线程程序的 CPU 时间实际上高出 ~7%,因为它增加了 CPU 中 3 个内核完成的工作(我假设)以及管理线程的额外开销。

最佳答案

您的设计可能效率低下。首先,您必须不断地将数据从一个线程传递到另一个线程。其次,如果这三个步骤中的一个步骤比其他两个步骤花费的时间多得多,则潜在的最大 yield 很小。

关于c++ - 提升线程不会使程序更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22599890/

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