diff options
| author | David Phillips <dbphillipsnz@gmail.com> | 2015-06-06 23:05:09 +1200 | 
|---|---|---|
| committer | David Phillips <dbphillipsnz@gmail.com> | 2015-06-06 23:05:09 +1200 | 
| commit | a157d1890add21eceddae2adee6213f302bc1bd2 (patch) | |
| tree | 64d078e0b3dfb4f4d26a6b731a50f70e2ea22be1 | |
| parent | 0ba9c463c9758709b4da0a3b9fadc17c2b2a4ff0 (diff) | |
| download | fractal-gen-a157d1890add21eceddae2adee6213f302bc1bd2.tar.xz | |
Added -Werror, migrated to multi-fractal thing
| -rw-r--r-- | Makefile | 15 | ||||
| -rw-r--r-- | mbrot-gen.c | 126 | 
2 files changed, 11 insertions, 130 deletions
@@ -1,9 +1,16 @@ -all: mbrot-gen +all: fractal-gen symlinks -mbrot-gen: mbrot-gen.c -	$(CC) -o $@ $< -lm -lpthread -Wall -Wextra +symlinks: fractal-gen +	ln -sf $< mbrot-gen +	ln -sf $< bship-gen + +fractal-gen: fractal-gen.c +	$(CC) -o $@ $< -lm -lpthread -Wall -Wextra -Werror  .PHONY: all clean  clean: -	- rm mbrot-gen -f +	rm fractal-gen \ +	   mbrot-gen   \ +	   bship-gen   \ +	   -f diff --git a/mbrot-gen.c b/mbrot-gen.c deleted file mode 100644 index a604f14..0000000 --- a/mbrot-gen.c +++ /dev/null @@ -1,126 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <complex.h> -#include <math.h> -#include <unistd.h> -#include <pthread.h> -#include <assert.h> - -typedef struct -{ -	unsigned int core; -	unsigned int cores; -	unsigned 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 size, iterat, cores, i, x, y, s; -	double power; - -	if (argc != 4) -	{ -		fprintf(stderr, "%s size iterat power\n", argv[0]); -		return EXIT_FAILURE; -	} - -	size   = atoi(argv[1]); -	iterat = atoi(argv[2]); -	power  = atof(argv[3]); - - -	// Fetch number of cores available on machine -	cores = sysconf(_SC_NPROCESSORS_ONLN); - -	assert(size > 0); -	assert(iterat > 0); -	assert(cores > 0); - - - -	// Allocated memory for sections, bailing upon failure -	data_section* sections = malloc(sizeof(data_section)*cores); -	if (sections == NULL) -	{ -		perror("malloc"); -		return EXIT_FAILURE; -	} - -	fprintf(stderr, "Spawning %d threads:\n", cores); -	// Spawn all the threads! Something something interlacing -	for (i = 0; i < cores; i++) -	{ -		// Has to be a better way -		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])); -	} - -	// Wait for each thread to complete -	for (i = 0; i < cores; i++) -		pthread_join(sections[i].thread, NULL); - -	// Vomit the data segments back onto the screen, deinterlacing -	// TO DO: look at fwrite performance benefits over putchar -	for (y = 0; y < size; y++) -		for (x = 0; x < size; x++) -			putchar(sections[y%cores].data[(y/cores)*size + x]); - -	// Free the memory we allocated for point data -	for (s = 0; s < cores; s++) -		free(sections[s].data); - -	free(sections); -	fprintf(stderr,"\n"); -	return 0; -} - - -void *generate_section(void *section) -{ -	data_section *d = (data_section*)section; -	unsigned int x,y,i; -	int idx = 0; -	double a,b; -	double complex z,c; - - -	d->data = malloc((d->size*d->size)/d->cores); -	if (d->data == NULL) -	{ -		perror("malloc"); -		return NULL; -	} - - -	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 < d->iterat; i++) -			{ -				if (cabsf(z) >= 2) -					break; - -				z = cpow(z, d->power)+c; -			} - -			d->data[idx++] = (255*i)/d->iterat; -		} -	} -	return NULL; -}  | 
