1

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

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++ 线程的东西吗?我是否必须添加一些东西或某种样板才能使线程同时运行?还是我制作线程的方式很愚蠢?

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

任何帮助,将不胜感激。

4

4 回答 4

1

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

于 2017-05-04T00:24:13.613 回答
0

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

于 2014-01-24T02:55:55.960 回答
0

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

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

于 2015-07-09T23:53:43.247 回答
-1

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

于 2014-01-24T04:13:03.927 回答