#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
-#define GRID_X 128
+#define GRID_X 512
#define GRID_Y GRID_X
#define SHADOW 0
pthread_mutex_t worker_mutex;
pthread_cond_t* worker_cond;
pthread_cond_t* boss_cond;
+ pthread_barrier_t* barrier;
int* waiting_workers;
int worker_count;
RD_Opts opts = warg->opts;
int start_x = warg->start_x;
int start_y = warg->start_y;
- int w = warg->width;//(warg->width + start_x >= GRID_X) ? GRID_X-1 - start_x: warg->width;
- int h = warg->height;//(warg->height + start_y >= GRID_Y) ? GRID_Y-1 - start_y : warg->height;
+ int w = warg->width;
+ int h = warg->height;
for (warg->iterations = 0; warg->iterations < warg->max_iterations; warg->iterations++)
{
}
}
-#if 1
+ pthread_mutex_lock(warg->mutex);
+ if (++*warg->waiting_workers == warg->worker_count)
+ {
+ grid_temp = grid;
+ grid = grid_prime;
+ grid_prime = grid_temp;
+ *warg->waiting_workers = 0;
+ printf("worker-boss %d: completing report\n", warg->worker_id);
+ if ((warg->iterations % 100 == 0))
+ {
+ char buffer[GRID_X][GRID_Y];
+ for (int x = 0; x < GRID_X; x++)
+ {
+ for (int y = 0; y < GRID_Y; y++)
+ {
+ buffer[x][y] = (uint8_t)(255.0f * grid[x][y].a);
+ }
+ }
+ char name[64] = {0};
+ sprintf(name, "img/%s/%d.png", opts.name, warg->iterations);
+ stbi_write_png(name, GRID_X, GRID_Y, 1, buffer, GRID_X * sizeof(uint8_t));
+ }
+ }
+ pthread_mutex_unlock(warg->mutex);
+
+ pthread_barrier_wait(warg->barrier);
+
+#if 0
// Last one done should wake up the boss thread
int last_worker = 0;
pthread_mutex_lock(warg->mutex);
grid_prime = grid_temp;
// segfault somewhere in here lmao
- if (1 && (warg->iterations % 100 == 0))
+ if ((warg->iterations % 100 == 0))
{
char buffer[GRID_X][GRID_Y];
for (int x = 0; x < GRID_X; x++)
int waiting_workers = 0;
worker_arg warg = {
- opts, grid, grid_prime, 0, 0, (GRID_X), (GRID_Y), .worker_count = 4, .waiting_workers = &waiting_workers, .max_iterations = 1e4
+ opts, grid, grid_prime, 0, 0, (GRID_X), (GRID_Y), .worker_count = 8, .waiting_workers = &waiting_workers, .max_iterations = 1e4,
};
pthread_t threads[warg.worker_count];
pthread_mutex_t mutex;
pthread_cond_t worker_cond;
pthread_cond_t boss_cond;
+ pthread_barrier_t barrier;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&worker_cond, NULL);
pthread_cond_init(&boss_cond, NULL);
+ pthread_barrier_init(&barrier, NULL, warg.worker_count);
warg.worker_cond = &worker_cond;
warg.boss_cond = &boss_cond;
warg.mutex = &mutex;
+ warg.barrier = &barrier;
worker_arg wargs[warg.worker_count];