aboutsummaryrefslogtreecommitdiff
path: root/fractal-gen.c
diff options
context:
space:
mode:
authorDavid Phillips <dbphillipsnz@gmail.com>2015-06-06 23:11:34 +1200
committerDavid Phillips <dbphillipsnz@gmail.com>2015-06-06 23:11:34 +1200
commit7b5eb54e54aad01383912d2e67b996402eb9a602 (patch)
treef26e094dc944fb13a9035ad7c3d77e62d36c0e44 /fractal-gen.c
parenta157d1890add21eceddae2adee6213f302bc1bd2 (diff)
downloadfractal-gen-7b5eb54e54aad01383912d2e67b996402eb9a602.tar.xz
Updated Makefile, added missing files
Diffstat (limited to 'fractal-gen.c')
-rw-r--r--fractal-gen.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/fractal-gen.c b/fractal-gen.c
new file mode 100644
index 0000000..6f3cb5f
--- /dev/null
+++ b/fractal-gen.c
@@ -0,0 +1,78 @@
+#include "fractal-gen.h"
+
+int main(int argc, char **argv)
+{
+ unsigned int size, iterat, cores, i, x, y, s;
+ double power;
+ void *(*generator)(void *);
+
+ // Select correct generator for the fractal type
+ // TO DO: use basename
+ if (strcmp(argv[0], "./mbrot-gen") == 0)
+ generator = &generate_mbrot_section;
+ else if (strcmp(argv[0], "./bship-gen") == 0)
+ generator = &generate_bship_section;
+ else
+ fprintf(stderr, "Don't call this directly, call a symlink to me\n");
+
+ 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(&sections[i].thread, NULL, generator, &(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;
+}