gpt4 book ai didi

c++ - Mandelbrot 集不会使用 pthread 加速

转载 作者:行者123 更新时间:2023-11-28 07:39:21 26 4
gpt4 key购买 nike

因此,我正在编写一个程序来使用 pthread 计算 Mandelbrot 集。
这是线程函数:

void *partial_compute(void *arg) {
cout << "enter" << flush;
Range *range = (Range*)arg;
Comp z, c;
for (int i = range->begin; i <= range->end; i++) {
for (int j = 0; j < y_length; j++) {
z.set(0.0, 0.0);
c.set(x_start + (x_end - x_start) * i / x_length, y_start + (y_end - y_start) * j / y_length);
int k;
for (k = 0; k < 256; k++) {
z = z.next(c);
if (z.length() >= 4.0) {
break;
}
}
*(canvas + i * y_length + j) = k;
}
}
pthread_exit(NULL);
}


其中Comp是一类复数,z.next表示计算下一次Mandelbrot迭代。

Comp Comp::next(Comp c) {
Comp n(next_real(c), next_imag(c));
return n;
}
float Comp::next_real(Comp c) {
return _real * _real - _imag * _imag + c.real();
}
float Comp::next_imag(Comp c) {
return 2 * _real * _imag + c.imag();
}

我在pthread_create 之前和pthread_join 之后设置了一对clock_t
Mandelbrot 集的结果是正确的,然而,尽管我将线程数从 1 增加到 8,但计算时间始终相同。
因为 "enter" 是在 pthread_join 之前一秒同时打印出来的,所以我相信线程是并行执行的。
我猜问题可能是partial_compute中有线程安全函数,但是我找不到。 (我尝试用 float 而不是类来表示复数)
我在这里犯了什么错误吗?感谢您的帮助。

更新:
抱歉,信息不完整。
z.length() 表示复数 z 的平方。
这就是我分配任务的方式。 x_lengthy_length 表示屏幕的宽度和高度。
我将屏幕按宽度分成 n 部分,并将范围发送到线程进行计算。

int partial_length = x_length / num_threads;
for (int i = 0; i < num_threads; i++) {
range[i].begin = i * partial_length;
range[i].end = range[i].begin + partial_length - 1;
pthread_create(&threads[i], NULL, partial_compute, (void *)&range[i]);
}
// wait all the threads finished
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}

最佳答案

我发现问题出在clock()……
clock() 不能用于测量使用 pthread 时耗时,
因此我发现 gettimeofday(timeval, NULL) 可以正常工作。

关于c++ - Mandelbrot 集不会使用 pthread 加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com