cpu_mandelbrot.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <stdint.h>
  2. #include <starpu.h>
  3. #include <math.h>
  4. struct Params
  5. {
  6. float cr;
  7. float ci;
  8. unsigned taskx;
  9. unsigned tasky;
  10. unsigned width;
  11. unsigned height;
  12. };
  13. void cpu_mandelbrot(void *descr[], void *cl_arg)
  14. {
  15. struct Params *params = cl_arg;
  16. int *subP;
  17. uint32_t nxP, nyP;
  18. uint32_t ldP;
  19. subP = (int *)STARPU_MATRIX_GET_PTR(descr[0]);
  20. nxP = STARPU_MATRIX_GET_NX(descr[0]);
  21. nyP = STARPU_MATRIX_GET_NY(descr[0]);
  22. ldP = STARPU_MATRIX_GET_LD(descr[0]);
  23. float centerr = params->cr;
  24. float centeri = params->ci;
  25. unsigned Idx = params->taskx;
  26. unsigned Idy = params->tasky;
  27. unsigned width = params->width;
  28. unsigned height = params->height;
  29. float zoom = width * 0.25296875;
  30. float conv_limit = 2.0;
  31. int max_iter = (width/2) * 0.049715909 * log10(zoom);
  32. int x,y,n;
  33. for (y = 0; y < nyP; y++){
  34. for (x = 0; x < nxP; x++){
  35. float X = x + Idx*nxP; //Coordinates in the whole matrice.
  36. float Y = y + Idy*nyP;
  37. float cr = centerr + (X - (width/2))/zoom;
  38. float ci = centeri + (Y - (height/2))/zoom;
  39. float zr = cr;
  40. float zi = ci;
  41. float m = zr * zr + zi * zi;
  42. for (n = 0; n <= max_iter && m < conv_limit * conv_limit; n++) {
  43. float tmp = zr*zr - zi*zi + cr;
  44. zi = 2*zr*zi + ci;
  45. zr = tmp;
  46. m = zr*zr + zi*zi;
  47. }
  48. int color;
  49. if (n<max_iter)
  50. color = 255.*n/max_iter;
  51. else
  52. color = 0;
  53. subP[x + y*ldP] = color;
  54. }
  55. }
  56. }