static gboolean process (GeglOperation *operation, GeglBuffer *output, const GeglRectangle *result, gint level) { GeglProperties *o = GEGL_PROPERTIES (operation); gfloat *buf; gint pxsize; g_object_get (output, "px-size", &pxsize, NULL); buf = g_malloc (result->width * result->height * pxsize); { gfloat *dst = buf; gint y; for (y=0; y < result->height; y++) { gint x; for (x=0; x < result->width ; x++) { gfloat value; gfloat nx,ny; nx = (x + result->x); ny = (y + result->y); nx = (nx/512); ny = (ny/512); value = mandel_calc (o, nx, ny); *dst++ = value; } } } gegl_buffer_set (output, NULL, 0, babl_format ("Y float"), buf, GEGL_AUTO_ROWSTRIDE); g_free (buf); return TRUE; }
int main(int argc, char *argv[]) { struct timeval tv_start, tv_end; int picture[WIDTH * HEIGHT]; #if 0 float real_start = -0.1592 - 0.01; float real_end = -0.1592 + 0.01; float imaginary_start = -1.0317 - 0.01; float imaginary_end = -1.0317 + 0.01; #endif float real_start = 0.37 - 0.00; float real_end = 0.37 + 0.04; float imaginary_start = -0.2166 - 0.02; float imaginary_end = -0.2166 + 0.02; #if 0 float real_start = -2.00; float real_end = 1.00; float imaginary_start = -1.00; float imaginary_end = 1.00; #endif int do_simd = 1; if (argc != 2) { printf("Usage: %s <normal/sse/avx2/avx_512>\n", argv[0]); exit(0); } if (strcmp(argv[1], "normal") == 0) { do_simd = 0; } else if (strcmp(argv[1], "sse") == 0) { do_simd = 1; } else if (strcmp(argv[1], "avx2") == 0) { do_simd = 2; } else if (strcmp(argv[1], "avx_512") == 0) { do_simd = 3; } gettimeofday(&tv_start, NULL); if (do_simd == 1) { mandel_calc_sse(picture, WIDTH, HEIGHT, real_start, real_end, imaginary_start, imaginary_end); } else if (do_simd == 2) { mandel_calc_avx2(picture, WIDTH, HEIGHT, real_start, real_end, imaginary_start, imaginary_end); } else if (do_simd == 3) { mandel_calc_avx_512(picture, WIDTH, HEIGHT, real_start, real_end, imaginary_start, imaginary_end); } else { mandel_calc(picture, WIDTH, HEIGHT, real_start, real_end, imaginary_start, imaginary_end); } gettimeofday(&tv_end, NULL); #if 0 int picture2[WIDTH * HEIGHT]; mandel_calc(picture2, WIDTH, HEIGHT, real_start, real_end, imaginary_start, imaginary_end); int n; for (n = 0; n < WIDTH * HEIGHT; n++) { if (picture[n] != picture2[n]) { printf("error %d %8x %8x\n", n, picture[n], picture2[n]); } } #endif printf("%ld %ld\n", tv_end.tv_sec, tv_end.tv_usec); printf("%ld %ld\n", tv_start.tv_sec, tv_start.tv_usec); long time_diff = tv_end.tv_usec - tv_start.tv_usec; while(time_diff < 0) { tv_end.tv_sec--; time_diff += 1000000; } time_diff += (tv_end.tv_sec - tv_start.tv_sec) * 1000000; printf("time=%f\n", (float)time_diff / 1000000); write_bmp(picture, WIDTH, HEIGHT); return 0; }