【问题标题】:Threads in c++ not generating speedup on mandelbrot image processingc++ 中的线程不会对 mandelbrot 图像处理产生加速
【发布时间】:2017-05-04 08:24:13
【问题描述】:

所以,我编写了一个生成曼德布罗图像的程序。然后,我决定以一种使用指定数量的线程来加速它的方式编写它。这是我想出的:

void mandelbrot_all(std::vector<std::vector<int>>& pixels, int X, int Y, int threadCount) {
    using namespace std;

    vector<thread> threads;
    int numThreads = threadCount;
    for(int i=0; i<numThreads; i++) {
        threads.push_back(thread (mandelbrot_range, std::ref(pixels), i*X/numThreads, 0, X*(i+1)/numThreads, Y, X));
    }
    for(int i=0; i<numThreads; i++) {
        threads[i].join();
    }
}

其目的是将处理分成块并分别处理每个块。当我运行程序时,它需要一个数字作为参数,它将用作程序中用于该运行的线程数。不幸的是,对于任何数量的线程,我都会得到相似的时间。

C++ 中的线程有什么我缺少的吗?我是否必须添加一些东西或某种样板才能使线程同时运行?还是我制作线程的方式很傻?

我尝试在树莓派和我的四核笔记本电脑上运行此代码,结果相同。

任何帮助将不胜感激。

【问题讨论】:

  • 启动线程有点贵。所以你想做一个需要几秒钟以上的测试。此外,如果您有一个用于保护数据的互斥锁,它可能会序列化您的线程。
  • 您能解释一下“用于保护数据的互斥锁”是什么意思吗?
  • 其实不是。他在问一些完全不同的事情。
  • 您很可能正在破坏数据线或指令缓存中的一个(或两个)。您可能想阅读:herbsutter.com/welcome-to-the-jungle

标签: c++ multithreading mandelbrot


【解决方案1】:

我回到这个问题有点晚了,但回头看,我记得解决方案:我在单核树莓派上编程。一个核心意味着线程没有加速。

【讨论】:

    【解决方案2】:

    我认为生成线程太贵了,你可以试试PPLTBB。它们都有parallel_for和parallel_foreach,并使用它们循环像素而不是使用线程。它们在内部管理线程,因此您的开销更少,吞吐量最高。

    【讨论】:

      【解决方案3】:

      一次解决一个问题,为什么不试试硬编码使用 2 个线程,然后是 3 个?线程启动很昂贵,但是如果您只启动 2 个线程并计算一个相当大的 Mandelbrot,那么线程启动时间将相对为零。

      直到您没有实现 2 倍和 3 倍的加速,您还有其他需要单独调试和解决的问题。

      【讨论】:

        【解决方案4】:

        如果不查看您的代码并使用它,就很难确定问题到底出在哪里。不过这里有一个猜测:Mandelbrot 集图像的某些部分比其他部分更容易计算。您的代码将图像按 x 轴切成相等的切片,但大部分工作(例如 70%)可能会分成一个切片。在这种情况下,你能做的最好的事情就是将速度提高 30%,因为其余线程仍然必须等待最后一个线程完成。例如,如果您使用四个线程运行并将图像切成四块,那么第三块肯定看起来比其他部分更密集。当然,70% 只是一个估计值。

        【讨论】:

        • 我会分享更多代码,但我所上的课程对在线发布代码有严格的政策。我只能在此处发布获得帮助所需的最少代码。
        猜你喜欢
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多