#include #include #include struct input { double ltx, lty; double rbx, rby; size_t width, height; size_t maxiter; }; int worker_init(int version) { fprintf(stderr, "mandel: init(%d)\n", version); return version == 1 ? 0 : 1; } int worker_run_job(size_t inputsize, const void *input_, size_t *outputsize, void **outputp) { if (inputsize != sizeof(struct input)) { fprintf(stderr, "mandel: Input has invalid size %zu (expected %zu)\n", inputsize, sizeof(struct input)); return -1; } fprintf(stderr, "mandel: run_job()\n"); const struct input *const input = input_; *outputsize = 4 * input->width * input->height; uint32_t *const output = *outputp = malloc(*outputsize); #pragma omp parallel for for (size_t yi = 0; yi < input->height; yi++) { for (size_t xi = 0; xi < input->width; xi++) { const double y = (input->rby - input->lty) / (input->height - 1) * yi; const double x = (input->rbx - input->ltx) / (input->width - 1) * xi; double a = x, b = y, a2 = a * a, b2 = b * b; size_t n; for (n = 0; n < input->maxiter && a2 + b2 < 4; n++) { b = 2 * a * b + y; a = a2 - b2 + x; a2 = a * a; b2 = b * b; } output[input->width * yi + xi] = n; } } fprintf(stderr, "mandel: run_job() finished\n"); return 0; } void worker_free_outdata(size_t size, void *output) { (void)size; fprintf(stderr, "mandel: free_outdata()\n"); free(output); }