0

我有一个大数组,迭代并完成我的工作大约需要 50 毫秒。我正在开发的应用程序将在 tegra3 或其他快速 CPU 上运行。我已经使用 pthread 将我的工作划分为四个线程,我获取了数组的宽度,将其除以系统中发现的总核心数,并且我在每个线程中迭代数组的 1/4,一切都很好,但是它现在需要 80 毫秒来完成这项工作。知道为什么多线程方法比单线程慢吗?如果我将 cpu 计数降低到 1,一切都会回到 50 毫秒。

for(int y = 0; y<height;y++)
{
    for(int x = 0; x<width; x++)
    {
        int index = (y*width)+x;
        int sourceIndex = source->getIndex(vertex_points[index].position[0]/ww, vertex_points[index].position[1]/hh);
        vertex_points[index].position[0]+=source->x[sourceIndex]*ww;
        vertex_points[index].position[1]+=source->y[sourceIndex]*hh;
    }   

};

我首先根据 cpu 计数将上述代码的 for 循环分为四个部分。vertex_points 是一个带有位置的向量。

所以看起来像

for(int y=start;y<end;y++)

并且开始/结束在每个线程上有所不同

4

1 回答 1

2

线程启动时间通常以毫秒为单位 - 这就是占用您时间的原因。

考虑到这一点,50 毫秒不是我担心的那种延迟。如果我们谈论 5 秒,那将是并行化的一个很好的候选者。

如果需要经常执行循环,请考虑使用早期启动并保持休眠状态的线程的解决方案,等待工作完成。那会跑得更快。

另外,CPU真的是4核吗?诚实的内核还是超线程?

于 2012-07-14T14:46:43.397 回答