Набор Мандельброта не будет ускоряться при использовании pthread

Итак, я пишу программу для вычисления множества Мандельброта с использованием pthread.
Это функция потока:

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 означает вычисление следующей итерации Мандельброта.

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();
}

Я установил пару clock_t до pthread_create и после pthread_join,
Результат набора Мандельброта верен, однако время вычислений всегда одинаково, несмотря на то, что я увеличил количество потоков с 1 до 8.
Поскольку "enter" были распечатаны одновременно за секунду до pthread_joinЯ считаю, что потоки выполнялись параллельно.
Я предполагаю, что проблема может быть в том, что есть поточно-безопасная функция в partial_compute, но я не могу найти это. (Я пытаюсь представить комплексное число float вместо класса)
Есть ли какая-то ошибка, которую я сделал здесь? Спасибо за помощь.

Обновить:
Извините за неполную информацию.
z.length() означает квадрат комплексного числа z.
Вот как я разделил задачу. x_length а также y_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);
}

0

Решение

Я обнаружил, что проблема заключается в clock()……
clock() не может использоваться для измерения прошедшего времени, когда вы используете pthread,
следовательно я нашел gettimeofday(timeval, NULL) может работать правильно.

1

Другие решения

Да, есть проблема с clock() в нитях. Ты можешь использовать clock_gettime() с CLOCK_MONOTONIC опция, чтобы правильно измерить время в Pthreads. Для этого вам также понадобится установить связь с расширениями POSIX Realtime (-lrt).

Вот примеры:

struct timespec begin, end;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &begin);

// spawn threads to do work here

clock_gettime(CLOCK_MONOTONIC, &end);

elapsed = end.tv_sec - begin.tv_sec;
elapsed += (end.tv_nsec - begin.tv_nsec) / 1000000000.0;
0

По вопросам рекламы [email protected]