我已将JPG解码器编码为
for each dataunit{
decode
transform
write to rgb buffer
}
然后我用boost线程编码它
for each dataunit{
decode
}
for each dataunit{
transform
}
for each dataunit{
write to rgb buffer
}
...在他们自己的线程上运行这些循环,在3核CPU上并行运行2个线程。但我似乎无法用非线程程序击败我的表现。我错过了什么吗?
线程是否会妨碍编译器优化程序的能力?
非线程程序是否仍然使用我的CPU的3个核心?
非常感谢你清理任何东西。编辑:显然我的线程都访问了相同的缓冲区(缓冲区中的位置不同),这导致了很高的CPU缓存一致性开销。每个CPU核心都有自己的缓存,如果对共享缓冲区进行任何更改,则需要与其他缓存同步。我重新编写了我的代码,将我的缓冲区拆分为3,然后让每个线程都在自己的缓冲区上工作。我希望这可以解决任何缓存一致性问题,但它似乎并没有加快我的程序。我仍然不能用我的并行程序击败串行程序。
编辑:我很尴尬地说我正在测量程序的CPU时间而不是WALL时间。 WALL时间清楚地显示我的程序在线程化时快了约50%。线程程序的CPU时间实际上高出约7%,因为它增加了CPU中3个内核所做的工作(我假设),并且管理线程需要额外的开销。
答案 0 :(得分:1)
您的设计可能效率低下。首先,您必须将数据从线程传递给线程。其次,如果这三个步骤中的一个比其他两个步骤花费更多的时间,则潜在的最大收益很小。
答案 1 :(得分:0)
我很尴尬地说我正在测量程序的CPU时间而不是WALL时间。 WALL时间清楚地显示我的程序在线程化时快了约50%。线程程序的CPU时间实际上要高出约7%,因为它增加了CPU中3个内核所做的工作(我假设),并且管理线程需要额外的开销。