int main(int argc, char ** argv) { struct mandelbrot_param param; param.height = HEIGHT; param.width = WIDTH; param.lower_r = LOWER_R; param.upper_r = UPPER_R; param.lower_i = LOWER_I; param.upper_i = UPPER_I; param.maxiter = MAXITER; param.mandelbrot_color.red = (MANDELBROT_COLOR >> 16) & 255; param.mandelbrot_color.green = (MANDELBROT_COLOR >> 8) & 255; param.mandelbrot_color.blue = MANDELBROT_COLOR & 255; // Initializes the mandelbrot computation framework. Among other, spawns the threads in thread pool init_mandelbrot(¶m); #ifdef MEASURE struct mandelbrot_timing ** thread, global; GETTIME(&global.start); thread = compute_mandelbrot(param); GETTIME(&global.stop); #elif GLUT == 1 srand(time(NULL)); gl_mandelbrot_init(argc, argv); gl_mandelbrot_start(¶m); #else compute_mandelbrot(param); ppm_save(param.picture, "mandelbrot.ppm"); #endif #ifdef MEASURE #if NB_THREADS > 0 int i; for (i = 0; i < NB_THREADS; i++) { printf("%i %li %li %li %li %li %li %li %li\n", i + 1, thread[i]->start.tv_sec, thread[i]->start.tv_nsec, thread[i]->stop.tv_sec, thread[i]->stop.tv_nsec, global.start.tv_sec, global.start.tv_nsec, global.stop.tv_sec, global.stop.tv_nsec); } #else printf("0 %li %li %li %li %li %li %li %li\n", thread[0]->start.tv_sec, thread[0]->start.tv_nsec, thread[0]->stop.tv_sec, thread[0]->stop.tv_nsec, global.start.tv_sec, global.start.tv_nsec, global.stop.tv_sec, global.stop.tv_nsec); #endif #endif // Final: deallocate structures destroy_mandelbrot(param); return EXIT_SUCCESS; }
void destroy_mandelbrot(struct mandelbrot_param param) { #if NB_THREADS > 0 int i; // Initiate a stop order and resume threads in the thread pool thread_stop = 1; compute_mandelbrot(param); // Wait for the threads to finish for (i = 0; i < NB_THREADS; i++) { #ifdef DEBUG assert(pthread_join(thread[i], NULL) == 0); #else pthread_join(thread[i], NULL); #endif } pthread_barrier_destroy(&thread_pool_barrier); #else // Sequential version, nothing to destroy #endif #ifdef MEASURE free(timing); #endif free(color); ppm_free(param.picture); }
int main(int argc, char *argv[]){ init(argc, argv); allocate_image_buffer(); compute_mandelbrot(); write_to_file(); return 0; };