From: Randy McShandy Date: Wed, 13 Dec 2023 06:06:25 +0000 (-0600) Subject: HEY WHO THE FUCK DIDN'T TELL ME ABOUT PTHREAD BARRIERS X-Git-Url: http://git.mcshandy.xyz/gitweb.cgi?a=commitdiff_plain;h=b4c6cc6905bafa6a4c31c0850bf044ca882adc70;p=barrow_crawler HEY WHO THE FUCK DIDN'T TELL ME ABOUT PTHREAD BARRIERS --- diff --git a/main.c b/main.c index 1fc6dca..d232420 100755 --- a/main.c +++ b/main.c @@ -8,7 +8,7 @@ #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 @@ -54,6 +54,7 @@ typedef struct 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; @@ -186,8 +187,8 @@ void* iterator(void* _arg) 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++) { @@ -202,7 +203,34 @@ void* iterator(void* _arg) } } -#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); @@ -223,7 +251,7 @@ void* iterator(void* _arg) 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++) @@ -327,20 +355,23 @@ int main(int argc, char** argv) 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];