diff options
Diffstat (limited to 'mbrot-gen.c')
-rw-r--r-- | mbrot-gen.c | 112 |
1 files changed, 94 insertions, 18 deletions
diff --git a/mbrot-gen.c b/mbrot-gen.c index cb79f54..08e438d 100644 --- a/mbrot-gen.c +++ b/mbrot-gen.c @@ -1,39 +1,115 @@ #include <stdio.h> +#include <stdlib.h> #include <complex.h> #include <math.h> -#include "config.h" +#include <unistd.h> +#include <pthread.h> + +typedef struct +{ + int core; + int cores; + int size; + double power; + unsigned int iterat; + char* data; + pthread_t thread; +} data_section; + + +void *generate_section(void *d); + + int main(int argc, char **argv) { - unsigned int x, y, i; - float a,b; - float complex z,c; + int size, iterat, cores,i; + double power; + + if (argc != 4) + { + fprintf(stderr, "%s size iterat power", argv[0]); + return EXIT_FAILURE; + } + + size = atoi(argv[1]); + iterat = atoi(argv[2]); + power = atof(argv[3]); - fprintf(stderr, "Creating %dx%d image (raw format)\n",SIZE,SIZE); + // Fetch number of cores available on machine, so we can use lots of them to speed things up + cores = sysconf (_SC_NPROCESSORS_ONLN); +// cores = 8; - y = 0; - for (b = -1.75f; y < SIZE; b+=(3.5f/SIZE)) + + fprintf(stderr, "Found %d cores. I'll spawn as many threads and let the scheduler sort it out.\n", cores); + + + + + + int x,y,s; + + data_section* sections = malloc(sizeof(data_section)*cores); + + fprintf(stderr, "Spawning threads:\n"); + // Spawn all the threads! Something something interlacing + for (i = 0; i < cores; i++) { - x = 0; - for (a = -2.5f; x < SIZE; a+=(3.5f/SIZE)) + sections[i].core = i; + sections[i].cores = cores; + sections[i].size = size; + sections[i].power = power; + sections[i].iterat = iterat; + + fprintf(stderr, " -> Thread #%d\n", i); + pthread_create(§ions[i].thread, NULL, &generate_section, &(sections[i])); + } + + + for (i = 0; i < cores; i++) + pthread_join(sections[i].thread, NULL); + + + + for (y = 0; y < size; y++) + for (x = 0; x < size; x++) + printf("%c", sections[y%cores].data[(y/cores)*size + x]); + + + for (s = 0; s < cores; s++) + free(sections[s].data); + + fprintf(stderr,"\n"); + return 0; +} + + +void *generate_section(void *section) +{ + data_section *d = (data_section*)section; + d->data = malloc((d->size*d->size)/d->cores); + unsigned int x,y,i; + double a,b; + double complex z,c; + + int idx = 0; + + for (y = d->core, b = (d->core*(3.5f/d->size)-1.75f); y < d->size; b+=((d->cores*3.5f)/d->size), y+=d->cores) + { + for (x = 0, a = -2.5f; x < d->size; a+=(3.5f/d->size), x++) { z = 0; c = a+I*b; - for (i = 0; i < ITERATIONS; i++) + for (i = 0; i < d->iterat; i++) { if (cabsf(z) >= 2) break; - z = cpow(z,POWER)+c; + z = cpow(z, d->power)+c; } - printf("%c",( (255*i)/ITERATIONS ) ); - x++; + d->data[idx++] = (255*i)/d->iterat; } - y++; - if ( (y%10) == 0 ) - fprintf(stderr,"\r%.3f%%",y/(float)SIZE*100); } - fprintf(stderr,"\n"); - return 0; + return NULL; } |