所以,我写了一个生成mandelbrot图像的程序。然后,我决定以一种使用指定数量的线程来加速它的方式编写它。这就是我想出的:
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 ++中的线程?我是否需要添加某种东西或样板来使线程同时起作用?或者我制作线程的方式很愚蠢?
我尝试在覆盆子pi和我的四核笔记本电脑上运行此代码,结果相同。
任何帮助都将不胜感激。
答案 0 :(得分:1)
我回到这个问题的时间有点晚了,但回头看,我记得解决方案:我在单核树莓派上进行编程。一个核心意味着没有线程加速。
答案 1 :(得分:0)
我认为产生线程太贵了,你可以尝试PPL或TBB。它们都有parallel_for和parallel_foreach,并使用它们循环遍历像素而不是使用线程。它们在内部管理线程,因此您可以减少开销和最大吞吐量。
答案 2 :(得分:0)
一次解决一个问题,为什么不试一试硬编码使用2个线程,然后3个?线程启动很昂贵但是如果你只启动2个线程并计算一个相当大的Mandelbrot,那么线程启动时间将相对为零。
直到你没有达到2倍和3倍的加速,然后你还有其他需要调试的问题&amp;单独解决。
答案 3 :(得分:-1)
如果不查看代码并使用它,就很难确定问题究竟是什么。这里有一个猜测:Mandelbrot设置图像的某些部分比其他部分更容易计算。您的代码正在通过x轴将图像切割成相等的切片,但大部分工作(比如70%)可能会落入一个切片中。在这种情况下,你可以做的最好的是加速30%,因为其余的线程仍然需要等待最后一个完成。例如,如果您使用四个线程运行并将图像分成四个部分,则第三个部分肯定比其他部分更加密集。当然,70%只是估计值。